编写“好的代码”是什么意思?[关闭]


41

这个问题中,我问一个不好的作家是否会妨碍您编写好的代码。许多答案都始于“这取决于您所指的好代码”。

看来“好代码”和“坏代码”是非常主观的。由于我有一个观点,所以可能与其他人的观点有很大不同。

那么编写“好的代码”意味着什么?什么是“好代码”?


15
好的代码是,如果您两年后再看,您的第一个想法不是“ Dude,wtf”。
鲍比(Bobby)

Answers:


91

一个好的编码员就像一个好的台球选手。

当您看到专业的台球选手时,乍一看可能不会对您印象深刻:“当然,他们把所有的球都塞进去了,但是他们只有简单的投篮机会!” 这是因为,当台球运动员进行投篮时,她没有考虑哪个球会插入哪个口袋,而是在考虑母球的结局。为下一张照片做好准备需要大量的技巧和实践,但这也意味着它看起来很容易。

现在,将这种隐喻带入代码中,一个好的编码器可以编写看起来很容易且直接的代码。布赖恩·克尼根(Brian Kernighan)在其著作中的许多示例都遵循这种模式。“技巧”的一部分是对问题及其解决方案正确概念化。当我们对问题的理解不够充分时,我们更有可能使解决方案过于复杂,而我们将看不到统一的想法。

通过对问题进行适当的概念化,您可以获得所有其他信息:可读性,可维护性,效率和正确性。因为解决方案看起来如此简单,所以可能会减少评论,因为不需要额外的解释。好的编码人员还可以看到产品的长期前景,并据此形成其概念。


10
“一个好的编码员写的代码看起来很容易直接。” <<完全正确!我认为这是因为人们通常认为优秀的编码器是可以编写非常“聪明”的hacks的人。如果代码是干净的并且不是太“聪明”,那么它一定很容易,对吗?
哈森

3
我的2分钱:当您拥有使用EASY自动重构的语言时-我最了解的两个例子是Java和C#-轻松地迭代地移植到好的代码是很容易的。否则,您首先必须很好地概念化,但是那里存在种鸡蛋问题。
Dan Rosenstark 2010年

3
一些算法本质上很复杂。好的编码人员在真正需要它们时编写它们应该没有问题-并使它们尽可能可读。
J-16 SDiZ 2010年

2
@hasenj:是的,这是因为这样的引理:愚蠢的人写了编译器理解的代码。聪明的人写代码,愚蠢的人懂。
v.oddou

49

每分钟WTF

原始


编辑:基本思想是不能将“代码质量”置于规则中,就像不能将“优良艺术”或“优良诗歌”置于规则中一样,因此您可以让计算机确定“是的,优良艺术”或“不,不好的诗歌”。当前,唯一的方法是查看该代码对其他人而言多么容易理解。


1
我们在工作中将其粘贴在白板上:-)
没人

1
@Cape Cod Gunny也在Bob叔叔的书中
mlvljr

2
除了成为一本优秀的卡通漫画之外,我认为它确实很重要-好的代码是其他人喜欢阅读和维护的代码。
FinnNk 2010年

1
没错,好的代码就是任何不错的代码。例如,很难定义好的代码,而定义不好的代码则更容易。
Ernelli

5
通常,我会在良好的代码会议中找到那些“ WTF?”,然后很快跟着“ Oooooh Okay ... I see you what thar”。
AndrewKS,2010年

7

除了您能以多快的速度理解代码之外,实际上没有其他好的标准。通过在简洁性和可读性之间找到完美的折衷,可以使代码看起来不错。

“每分钟WTF”(上面)是正确的,但这只是更普遍的规则的必然结果。WTF越多,理解就越慢。


1
@rmx:定义“做好工作”
mojuba 2010年

2
好吧,该RemoveCustomer方法实际上去除了角质层而不用拧紧。您可以花几个小时使它看起来很漂亮,但这并不意味着它实际上可以工作。我要说的是,“您能以多快的速度理解代码”并不是“好的代码”的唯一标准。
没人2010年

2
@rmx:但是这意味着没有错误,不是吗?如果您的代码不能正确完成工作,则还不是代码。
mojuba 2010年

4
@rmx:实际上不。如果您的代码易于理解,那么总的来说,很容易理解它是否做得不好。OTOH,如果很难理解,就很难理解它是否真的起作用。
pillmuncher 2010年

2
@rmx:PS简而言之,您的decrement()是经典的WTF,因此减慢了使用此功能的部分代码的理解
mojuba 2010年

5

您知道当...

  1. 顾客很高兴
  2. 同事们借用您的代码作为起点
  3. 刚刚告诉全新的家伙/女孩对您6个月前构建的系统进行修改,而他/她从未曾问过您一个问题
  4. 您的老板要求您开发新的小部件以供团队使用
  5. 您看一下今天编写的代码,对自己说:“我希望两年前已经编写了这样的代码”

您如何衡量代码是否良好...

  • 响应时间是多少?
  • 它往返服务器多少次?
  • 您会亲自使用该应用程序还是觉得它笨拙?
  • 下次您会以相同的方式构建它吗?

好的代码应该在应该的时候工作。好的代码可以在需要时轻松地进行修改。好的代码可以重复使用以获利。


2
“客户满意”与此正交。

1
@TRA-如果客户满意,这意味着您了解要求并提供了他们期望的解决方案。
迈克尔·赖利

6
当然,但是不好的代码可以做到这一点。

4

一个代码是

  1. 无错误

  2. 可重用

  3. 独立

  4. 不太复杂

  5. 有据可查

  6. 容易撞

被称为好代码。

一个好的程序可以完美地工作并且没有错误。但是,什么样的内部品质才能达到如此完美呢?这并不神秘,我们只需要偶尔提醒一下即可。无论您使用C / C ++,C#,Java,Basic,Perl,COBOL还是ASM进行编码,所有好的编程都具有相同的历史悠久的品质:简单性,可读性,模块化,分层,设计,效率,优雅和清晰度效率,优雅和清晰度

来源:MSDN


简单性,可读性,优雅性和清晰度都是一回事。模块化和分层只是使代码清晰美观的方法。列表中剩下的唯一内容就是效率,这是一种隐含的含义,此外,通常还需要在效率和清晰度之间妥协。
mojuba

检查此内容:goo.gl/hdQt8
Chankey Pathak 2010年

2
代码可以没有错误吗?
Casey Patton

不,它不能。(实际上)
Chankey Pathak 2011年

高效应添加到您的列表中。速度不一定是优质代码的主要指标,但优质代码不应不必要地变慢或浪费。
Caleb 2012年

3

这看起来很熟悉吗?

飞利浦给了我机会观看新产品的设计。随着事情的发展,我变得越来越不安,并开始向上司倾诉我的疑虑。我反复告诉他,设计不是“干净的”,并且应该以Dijkstra的设计漂亮的方式“美丽”。他认为这不是有用的评论。他提醒我,我们是工程师,而不是艺术家。在他看来,我只是表达自己的品味,他想知道我在做出判断时使用的标准。我无法告诉他!因为我无法解释违反了哪些原则,所以我的评论被忽略了,工作继续进行。意识到必须有一种方法来解释我的“品味”并为其提供动力,我开始尝试找到一种将好的设计与不好的设计区分开的原理。工程师非常务实。他们可能会欣赏美丽,但他们寻求实用性。我试图找到一个解释“美丽”为何有用的原因。

请在这里查看其余内容。


1
自从@ mlvljr的帖子的链接被打破,这里是一个链接到谷歌图书页面:books.google.co.in/...
balajeerc

@balajeerc谢谢(我也固定了链接,所以它指向了同一pdf的Springer托管版本):)
mlvljr 2015年

1

除了自然的代码质量标准(最少的复制/粘贴,没有意大利面条等)之外,好的工业代码应该看起来总是有些天真,太冗长,例如

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

相对于

Record r = cache.get(i++, false);

但是是do_not_create = false说“ false作为do_not_create参数传递,以便将其创建”还是“ false作为do_create参数传递,而不将其创建”?在一种您可以使用参数名称的语言中,我更喜欢cache.get (key:i, create: false); i += 1;
PJTraill '16

1

通过举例说明相反的答案也许会有所帮助(此外,在这里添加XKCD是一个借口)。

替代文字

好的代码是

  • 简单易懂
  • 易于维护,
  • 不会仅尝试解决所有问题
  • 生活了很长一段时间而没有让开发人员寻找替代方案

例子包括

  • Apache Commons
  • 春季框架
  • 休眠框架

1

我只是选择“可维护”

所有代码都必须维护:无需使任务变得比必要的困难

如果任何读者不理解此简单要求或需要明确说明,则该读者不应编写代码...


1

好的代码对于每个人来说都是不同的,他们所使用的语言也会影响可能被认为是好的代码。通常,当我进入一个项目时,我会寻找以下内容:

  • 项目如何组织?源文件是否组织得井井有条,我是否可以不费吹灰之力找到代码?
  • 代码如何组织?是否清楚地记录了文件中的代码是做什么的,例如通过使用文件头或通过使用驻留在其自己文件中的每个类?文件中是否有不再在应用程序中使用的功能?
  • 职能如何组织?声明变量的位置是否有明确的模式,还是相当随机的模式?代码是否具有逻辑流程并避免不必要的控制结构?代码是否清楚地记录了一切,并在需要的地方进行了自我记录,注释清楚地表达了代码为什么和/或如何工作?

除此之外,应用程序的设计是否整体上有意义?驻留在应用程序中的代码可能是世界上最好的,但是如果应用程序的整体设计没有意义,则使用它仍然很痛苦。


1

让我不同意可读性。不,不完全是:好的代码应该是可读的,并且可以通过足够的注释轻松实现。

但是我考虑了两种WTF:一种是您想知道程序员是否比编程101更进一步的那种,另一种是您绝对不了解代码的一般性。一开始有些代码看起来很奇怪,但实际上是解决难题的极富创造性的解决方案。第二个不应计入WTF-meter,可以通过注释来避免。

可读性强的代码可能非常非常慢。可读性较差的解决方案可以大大提高速度。R是语言的一个很好的例子,这种情况经常是对的。人们喜欢尽可能地避免for循环。通常,尽管可读性较差,但我认为最快的代码会是更好的代码。也就是说,如果改进的幅度很大,并且插入了足够的注释以解释代码的作用。

更重要的是,内存管理在许多科学应用中都至关重要。可读性很强的代码在内存使用上往往有些草率:创建了更多对象。在某些情况下,对内存的明智使用使代码再次变得不易读。但是,例如,如果您忙于处理千兆字节的DNA序列,那么内存是至关重要的因素。同样,无论可读性如何,我都认为占用较少内存的代码是更好的代码。

所以是的,可读性对于好的代码很重要。我知道Uwe Liggis的忠实人物:思想伤害和计算机便宜。但是在我的领域(统计基因组学)中,一周的计算时间和超过40 Gb的内存使用并不认为是异常。因此,将速度提高两倍,将内存减少一半所带来的价值,要比其可读性高得多。


没有任何规则/规则无一例外
user2664856 2015年

1
让我不同意您的不同意见:您说在您的领域中速度非常重要,并且说它比可读性更重要。我不同意,您应该努力使用适当的平衡。如果不需要速度,例如对于高级界面,您可能更喜欢易于维护的东西,如果需要速度,那么我同意您的看法。与其使用严格的规则,不如使用常识更好,并且无论如何都应避免过早的优化。
BlueTrin

@BlueTrin为什么不同时脑子编译那些高音源代码,并记录那里发生的事情(在注释中)?
mlvljr 2015年

1

就我而言...我知道当一个在另一个项目上工作的同事出现并且能够跳入并理解我在做什么时,无需我遍历每段代码,我正在编写良好的代码并显示它在做什么。
而不是他说:“等一下,什么?!” 他说:“哦,好吧,我明白你在那儿做了什么。”

好的代码也没有很多偷偷摸摸的解决方法或“ hacks”。排队的时候,当您编写它时,您还对自己说:“我知道这不是一个好方法,但是我现在只需要这样做。我会提醒我自己以后再改善...”


1

“好的”代码具有许多功能,但最重要的恕我直言是可读性和可维护性。

您的代码包含错误,可能会被扩展和重新使用,并且应该在某个时候进行重构-即使您重新访问它,也很可能不会有什么头绪您首先要做的是帮自己一个忙,并且不要在路上遇到任何障碍。

当然,请使用该效率更高的复杂算法,但是请确保您花了一些额外的时间来记录它,否则会使您的代码清晰且一致。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.