九个偷懒小操作让程序员后期伤透脑袋
我们都做过这样的事情:当妈妈不注意的时候,她偷偷吃糖果零食,这会导致蛀牙。同样,我们违反了一些编程的基本规则,并且我们一直坚持这种行为是不可取的。但是我们暗地里喜欢这些坏的编程习惯。
我们嘲笑所谓的编程规则,输出代码很糟糕——但我们还活着。编程上帝没有用闪电击中我们,我们的电脑也没有爆炸。事实上,只要我们能够编译和分发代码,客户似乎就满意了。
这是因为糟糕的编程并不像安装电路或碰老虎屁股那样有害。大多数时候它也能工作。规则通常被用作指导或格式建议,没有硬性和快速的规则可以遵循,也不会导致代码死亡。当然,你的代码可能会被嘲笑,甚至公开地被嘲笑,但是这个例行的挑战可以增加一点颠覆的乐趣,甚至是无意中。
为了使问题更复杂,有时最好打破规则。我不告诉他!生成的代码将更干净,可能更快更简单。规则往往显得过于宽泛,熟练的程序员可以通过破坏它们来改进代码。不要告诉你的老板,这对你的编码职业是有意义的。
下面的九个编码习惯,虽然在编程规则中被驳倒,但我们中的许多人都是无意中使用的。
禁止goto可以追溯到许多结构化编程工具不可用的时候。如果程序员想要创建一个循环或跳转到另一个程序,他们需要输入goto,后跟一个行号。几年后,编译器团队要求程序员用字符串标签替换行号。这在当时被认为是一个热门的新功能。
有些人认为这会导致“意大利面条代码”。代码变得不可读,很难理解代码的执行路径。线乱,缠绵到天边。Edsger Dijkstra说该命令应该在三个命令中被禁止。他有一个有趣的手稿,题为“goto句子不要说肤浅的伤害”。
Java学习交流 扣群:【47】974【9726】 M�]��|�Vr��9G但是绝对分支没有问题。这是一个纠结。通常,巧妙的>>breakstatement andstyle=“box sizing:box outlooutlooutlooutoutoutoutline:0px;font-family:“microsoft yaheihei pro pro,“displayony robfont display,”“robfont display,display,robfony,”“robfony display f,”“robfonfony oto,noto,a rial,pingfang sc,sans-serif;word wrap:break word;font-size:14px;”>returnstatement提供了一个非常清晰的语句,说明代码在那时将执行什么操作。有时,添加gototo case语句比更合适的多级嵌套if-then-else语句块更容易理解。
还有反例。苹果的SSL堆栈中的“goto fail”安全漏洞就是最好的例子之一。但是,如果我们能够小心地避免case语句和循环中的一些尴尬问题,那么我们可以嵌入好的绝对传输,从而使阅读代码的人更容易理解正在发生的事情。我们可以插入break和returnstatement to make everyone feel cleaner and happier-except the敌人of goto.
我的一个朋友有一个非常聪明的老板,他从来没有写过任何代码,但坚持文档中必须包含每个函数。如果程序员不提供注释,他将受到惩罚。所以,我的朋友在他的编辑器中插入了一个类似人工智能的小工具,所以每个函数都有几行“文档”。因为那个精明的老板不够聪明,不明白这些字条什么意思,所以我的朋友逃走了。他的代码经常被用作正式的文档。我想他应该很快被提升!
许多函数方法,甚至一些类,或多或少都可以自我记录。标记为“插入保留”或“取消保留”的函数,或alldoe not need to explain one stroke.通常可以正确命名函数。事实上,这比写一个长注释要好,因为函数名可以出现在代码的其他地方。文档只能静静地停留在角落里。自记录的函数名可以改进它们出现的每个文件。
在某些情况下,写文档甚至会使事情变得更糟。例如,当代码快速变化,团队疯狂地重构时,文档就会出现分歧。这就是代码的编写方式,但是文档解释了四五个版本之前发生的事情。这种“过时”的文档通常位于代码的顶部,在那里有些人会对代码应该发生的事情做一个很好的总结。因此,尽管重构团队已经仔细地修改了相关的注释,但它仍然错过了文件顶部的“良好摘要”。
当代码和文本出现分歧时,注释就变得毫无价值,甚至误导人。在这种情况下,良好的自我记录代码显然会获胜。
突然,老板紧张地给团队发了一封讨厌的电子邮件:为了执行非常严格的样式规则,我们都必须重写代码。最神奇的要求是,每一个动作、步骤或条款都必须有自己的路线。不能使用点语法连续调用函数。在分支语句中,不能有两个或多个返回布尔值的子句。如果要定义变量,请从另一行开始。如果你在做一个复杂的计算,不要用括号。每个片段都有自己的线。
他认为他的这个法令将能使调试变得更加容易。就像你单步调试代码一样,调试器会一个动作一个动作地前进。这样就不会卡在某一行。而且更容易执行。
但是这样的话,键盘上的返回键很烦人,因为我需要不断地插入行。我相信老板可以到处吹嘘他的团队能写多少行代码。
唉,有时候在同一行上声明一组变量更容易;有时候把所有布尔子句放在一起更容易——所有的东西都变得更紧凑。这也意味着我们可以在屏幕上看到更多的逻辑,而无需滚动鼠标。更简单的阅读意味着更快的理解。这就是简单的本质。
那些喜欢类型化语言的人相信,如果向每个变量添加显式的数据类型声明,就可以编写更好的、无错误的代码。花点时间拼写类型可以帮助编译器在代码开始运行之前标记愚蠢的错误。这可能很痛苦,但很有帮助。这是阻止编程错误的安全方法。
但时代已经改变了。许多新的编译器可以通过查看代码智能地推断类型。它们来回扫描代码,直到确定变量是字符串还是int,或者其他什么。如果这些类型没有排队,错误标志将亮起。所以我们不再需要输入变量。
这意味着我们现在可以省略代码中一些最简单的语句。代码更清晰,读者猜测名为i的变量表示整数类型。
有些程序员在代码中特别优柔寡断。首先,该值存储为字符串,然后解析为整数。然后它转换回字符串。这是非常低效的,甚至可以感觉到CPU在这种浪费负载的行为下咆哮。聪明的程序员可以快速编码,因为他们预先设计了体系结构,以最小化转换。他们的代码运行得更快,因为他们有一个好的计划。
不管你信不信由你,这种摇摆不定的代码有时是有意义的。例如,您有一个伟大的库,可以在它的专用黑盒中做无数智能的事情。如果库需要字符串数据,即使您刚刚将数据转换为整数,也要给它一个字符串。
当然,您可以重写所有代码以最小化转换,但这需要时间。此外,有时需要花费一些额外的时间来运行代码,因为重写代码需要更多的时间。有时候,背负这样的技术债务比从一开始就建立起来要便宜。
有时,库不是专有代码,但您以前编写的代码对您来说是独一无二的。有时再次转换数据比重写库中的所有代码要快得多。所以让它成为,让代码摆动。
一个标准规则是,程序员不应该在完成数据结构课程的第二年编写用于存储数据的代码。基本上,我们需要的所有数据结构都已经编写好了,代码已经经过了多年的测试和重新测试。它与语言捆绑在一起,通常是免费的。您的代码只能创建错误。
但有时您会发现数据结构库有点慢。有时它们强迫我们使用标准,但我们的代码结构不正确。有时,库会在使用结构之前迫使我们重新配置数据。有时库包含所谓的预防性保护功能,例如线程锁,但我们的代码不需要它们。
如果发生这种情况,我们应该开始编写自己的数据结构。这可以帮助你做得越来越快。代码会更干净,因为我们不会包含额外的代码来格式化数据以执行某些函数。
一个规则制定组声明每个循环都应该有一个“常量”,也就是说,当逻辑语句为真时,循环总是被执行。当常量不能为真时,循环结束。这是考虑复杂循环的好方法,但它可能导致愚蠢的禁止--例如禁止我们使用returnandbreakstatement.这条规则也包括在禁止goto声明中。
这个理论很好,但它通常会导致更复杂的代码。请参见以下简单示例,遍历数组,将找到的元素传递给测试函数,然后返回元素:
while (i循环常数爱好者会要求我们添加一个名为notfound的布尔变量,然后按如下方式使用它:
while ((notFound) && (i如果可以合理地命名布尔值,那么这是一个很好的自述代码,更容易理解。但这也增加了复杂性。这意味着您需要分配另一个局部变量并阻塞寄存器,因为编译器可能不够聪明,无法解决这个问题。
有时,agotostatement or a jump will be cleaner and more convenience.
编程习惯No. 8:使用短变量名(i和x和and也是有意义的)
诗人、小说家埃德加·爱伦·坡曾经说过,故事中的每一个词都应该有内涵。编码规则也强调了这一点。变量名应指示变量的作用。使用驼峰大写来编写变量名称来表达变量细节的Java程序员认为这是理所当然的,一个又一个疯狂长度的变量名出来了。有些程序员编写的变量名组合了五个或六个以上的单词。
但有时使用单个字母作为变量名更方便。有时在循环迭代中使用i或j更容易。有时,字母a用于数组,字母l用于列表更容易,即使字母l和数字1似乎很难区分。
正如本文前面鼓励的那样,这是自记录的代码,而不是长注释。在上述情况下,单个字母的变量名也是自记录的。字母i是常规迭代器。只要是程序员,就很容易理解。
Java学习交流 扣群:【47】974【9726】 M�]��|�Vr��9G一些最有趣的编程语言允许你做一些特别奇怪的事情,比如重新定义元素的值,就像常量一样。例如,在python中,可以输入true=false(在版本2.7和以前的版本中)。这不会导致逻辑崩溃,也不会导致宇宙的终结——它只是交换了真假的含义。你也可以用C语言和其他一些语言玩类似的危险游戏。还有一些语言允许您重新定义运算符,如加号。
当然,这是一个扩展,但有一种观点认为,在一大块代码中,重新定义一个或多个所谓的常量更快。有时候老板要求代码做一些完全不同的事情。当然,您可以修改代码中的每个事件,或者重新定义它。它让你看起来像个天才。你不需要重写一个巨大的库,只需翻转它并做相反的事情。
九个习惯都在这里。千万不要轻易尝试,不管它有多方便、多简单。