还剩3页未读,继续阅读
文本内容:
程序员偷偷深爱的个不良编程习惯9我们曾经都做过这样的事情当妈妈不注意的时候,偷偷地吃糖果零食,然后导致有了蛀牙同样的,我们都违背过一些编程的基本规则,并且都会坚定地表示这种行为是不可取的但我们就是偷偷爱着这些不良的编程习惯我们对所谓的编程规则嗤之以鼻,输出的代码也很糟糕一一但我们依然活着编程上帝没有下闪电劈死我们,我们的电脑也没有爆炸事实上,只要我们能编译和发布代码,客户似乎就很满意了这是因为糟糕的编程不像安装电路或者摸老虎屁股那样有直接的危害性大多数时间里它也是可以工作的规则通常是作为一种指导或格式上的建议,并没有硬性规定一定要遵守,也不会导致代码马上死掉当然,你的代码可能会被人耻笑,甚至可能大家公开嘲笑你,不过,这种挑战惯例的行为可以让人增加一点颠覆传统的快感,哪怕是在不经意间为了让问题变得更加复杂,有时候违反规则反而更好(一般人我不告诉他!)出来的代码会更干净,甚至可能会更快和更简单规则通常显得太过于宽泛,有技巧的程序员可以通过打破这些规则来提高代码不要告诉你的老板,这对你的编码生涯会很有意义下面这个编码习惯,虽然在编程规则中是被驳斥的,但我们很多人就是会不由9自主地使用它们编程习惯使用No.1goto关于禁止使用goto可以追溯到许多结构化编程工具还未面世的时代如果程序员想要创建一个循环或跳到另一段程序中,那么他们需要输入goto后再跟一个行号过了几年之后,编译器团队让程序员使用字符串标签取代行号这在当时被认为是一个热门的新功能有的人认为这会导致“意大利面条式代码”代码会变得不可读,并且很难理解代码的执行路径线程混乱,缠缠绵绵到天涯Edsger Dijkstra就三令五申地表示应该禁止这个命令,他有一份诙谐的手稿,题目为《Goto语句害人不浅》但绝对的分支是没有问题的这就让人纠结了通常,巧妙的语句和break return语句可提供一个非常干净的关于代码在那个时候执行什么的声明有时候,添加到case语句会比更恰当的多级嵌套的if-then-elsegoto语句块更易于理解也有反例在苹果的SSL堆栈中的“goto fail”安全漏洞就是最好的例子之一但是,如果我们能够仔细避免case语句和循环的一些尴尬问题,那么我们就可以嵌入良好的绝对转移,使阅读代码的人更容易明白这是怎么回事我们可以插入break和语句,让每一个人感觉更清洁和更愉快一一可能得除了gotoreturn的敌视者编程习惯成功避开文档No.2我的一个朋友有一个非常精明的老板,这位老板虽然从来没有写过任何代码,但却秉持着每一个功能都必须包含在文档中的理念哪个程序员不提供注释,那么他就会受到惩罚所以,我的朋友在他的编辑器中联入了一个有点像人工智能的玩意儿,于是乎,他的每一个功能就都有几行“文档”了因为这位精明的老板还不够聪明到能理解这些注释其实啥意思也没有,所以我的朋友逃过一劫他的代码常常被作为正式文档我想,他应该快要升职了!许多函数方法,甚至一些类或多或少都能自文档化冠以insertReservation或cancelReservation或等名称的函数并不deleteAII需要多此一举来解释它们的作用为函数取一个正确的名字往往就足够了事实上,这比写一段长长的注释要好,因为函数名可以出现在代码中的其他地方而文档只能默默地呆在某个角落自文档化的函数名可以改进它们出现的每个文件在有些情况下,写文档甚至会导致情况变糟例如,当代码瞬息万变,团队像疯了似的重构的时候,文档会产生分歧代码是这样写的,但文档解释的还是四五个版本以前的情况这类“过时”的文档通常位于代码顶部,有的人会在这里对代码应该发生什么作一个美好总结因此,尽管重构团队已经仔细修改了相关的注释,但还是会遗漏文件顶部的这段“美好总结”当代码和文本出现分歧的时候,注释就变得毫无价值,甚至会产生误导在这样的情况下,良好的自文档化的代码显然胜出了编程习惯一行写太多代码No.3老板突然发神经地给团队发了一封讨厌的邮件为了执行非常严格的风格规定,我们大家都必须重写我们的代码最神奇的要求是每个行为或步骤或子句必须各自成行你不能使用点语法连续调用函数在一个分支语句中,你不能有两个及以上返回布尔值的子句如果要定义变量,那么另起一行如果你正在做一个复杂的计算,那么不要使用括号每个片段也自成一行他认为他的这个法令将能使调试变得更加容易就像你单步调试代码一样,调试器会一个动作一个动作地前进这样就不会卡在某一行而且更容易执行但是这样一来,键盘上的回车键烦不胜烦,因为我需要不断地插入行而且我敢肯定,老板因此还可以到处吹嘘他的团队能写多少行代码唉,有时在同一行中声明一堆变量反而更容易;有时把所有的布尔子句放在一起反而更简单一一一切都能变得更加紧凑那也意味着,我们可以在屏幕上看到更多的逻辑而无需滚动鼠标更易于阅读就意味着理解起来更快这才是简单的精粹编程习惯不声明类型No.4那些热爱类型化语言的人认为,如果为每个变量添加明确的数据类型声明,就可以写出更好的、没有错误的代码花一点时间来拼写类型,能帮助编译器在代码开始运行之前标志愚蠢的错误可能会让人觉得痛苦,但很有帮助这是编程中停止bug的一种有备无患的方法但是时代变了许多较新的编译器完全可以智能地通过查看代码来推断类型它们会向后和向前浏览代码,直到可以肯定这个变量是string还是int,抑或其他如果这些被查看的类型不成队列,那么错误标志就会点亮因此再也不需要我们输入变量的类型了这意味着我们现在可以在代码中省略掉一些最简单的声明代码更清洁,而且阅读代码的人也猜得出for循环中命名为i的变量表示一个整数型编程习惯摇摆不定的代码No.5有的程序员在代码上特别优柔寡断,犹豫不决先是一开始将值存储为字符串,然后又解析成整数接着又转换回字符串这是非常低效的,你甚至可以感觉到CPU在咆哮这种浪费负载的行为聪明的程序员之所以能快速地编码,是因为他们事先会设计架构,以尽量减少转换他们的代码能更快地运行是因为他们有一个良好的规划但是,不管你信不信,这种摇摆不定的代码有时候也是有意义的比如说,你有一个非常棒的库,在它专有的黑盒子里能做无数智能的事情如果库需要字符串的数据,那么你就给它字符串,即使你刚将这个数据转换成为整数型当然,你可以重写所有的代码,以尽量减少转换,但是这需要时间而且,有时候让代码稍微多花点额外时间来运行也未尝不可,因为重写代码需要耗费我们更多的时间有时,背负这样的技术债务比一开始就正确构建的成本要更低有的时候,库不是专有的代码,但那些你以前全部自己写的代码是你独有的有的时候,再次转换数据比重写库中的所有代码要快得多所以,就让它这样吧,就让代码摇摆吧编程习惯编写你自己的数据结构No.6有一个标准规则是,程序员在完成数据结构课程的第二年,不应该写用于存储数据的代码基本上我们需要的所有的数据结构,已经有人写好了,而且其代码已历经多年的测试和再测试它和语言捆绑在一起,而且常常是免费的你的代码只能造就bugo但有时你会发现数据结构库有点慢有时它们会迫使我们使用标准的,但于我们的代码却是错误的结构有时库会把我们推向在使用结构之前重新配置数据的地步有时库会包含一些所谓有备无患的保护功能,如线程锁,但其实我们的代码并不需要如果遇到这种情况,那么就应该着手写我们自己的数据结构这或许能让你做得更快,做得更多而且代码会变得更清洁,因为我们不会包括那些多余的用于格式化数据来完成一些功能的代码编程习惯在中间打破循环No.7有一个规则制定小组宣称,每个循环都应该有一个“常量”,也就是说当这个逻辑语句为true的口寸候,循环一直执行当常量一定不会是true的时候,循环才会结束这是考虑复杂循环的好方法,但它会导致愚蠢的禁令一一例如禁止我们在循环中间使用和语句这一条也包含在禁止goto语句的规则中return break这个理论是好的,但它通常会导致更复杂的代码请看下面这个简单的案例,遍历数组,将找到的元素传递给test函数,并将该元素返回while ia.length{if testa[i]then returna[i];“循环常量”爱好者会要求我们增加一个布尔变量,命名为notFound,然后这样使用while notFoundia.length{if testa[i]then notFound=false;如果这个布尔值能够合理地命名,那么这就是一段很棒的自文档化的代码,更易于大家理解但这也增加了复杂性这意味着你需要分配另一个局部变量,并堵塞寄存器,因为编译器也许还不能足够智能到解决这个问题有时候,一个语句或一个跳转会更干净利索got(编程习惯使用短变量名和和也是有意义的)No.8i xandEdgar AllanPoe这位诗人和小说家曾经说过,在一个故事中的每一个词都应该是有内涵的编码规则也强调如此变量名应该说明这个变量的所作所为那些使用驼峰式大小写的方法来写变量名,以表达关于变量细节的Java程序员深以为然,于是一个又一个疯狂长度的变量名出炉了有些程序员写的变量名,会组合五六个甚至更多的词语但有的时候,使用单个字母作为变量名反而会更方便有时在循环迭代中只使用i或j会更简单有时使用字母a代表array,1代表list会更便捷,即使是字母1和数字1看上去很难辨别正如这篇文章前面鼓励的是自文档化的代码,而非长长的注释在上述情况下,单个字母的变量名也是自文档化的字母是通用的迭代器只要是程序员立刻就会懂i编程习惯重新定义运算符和函数No.9一些最有趣的编程语言允许你去做一些特别诡异的事情,例如重新定义元素的值,就如同常量一般例如Python,你可以输入TRUE二FALSE(在Version
2.7及之前的版本)这并不会产生某种逻辑崩溃,或导致宇宙终结一一仅仅只是互换了TRUE和FALSE的含义你也可以在C预处理器和一些其他语言中玩玩类似于这样的危险游戏还有一些语言允许你重新定义运算符,如加号当然这是延伸了,不过有一个观点是,在一个大的代码块内,当重新定义一个或多个所谓的常量时,速度会更快有时老板会要求代码做一些截然不同的事情当然,你可以修改代码的每个事件,或者,你可以重新定义这让你看上去像一个天才不必重写一个庞大的库,只需翻转一下,就可以做相反的事情了这个习惯就都在这儿了千万不要轻易尝试,不管它看上去有多牛掰太危险9了一一真的,这是实话。
个人认证
优秀文档
获得点赞 0