《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)

2023-05-19,,

《代码整洁之道》ch1~ch4读书笔记 

  《clean code》正如其书名所言,是一本关于整洁代码规范的“教科书”。作者在书中通过实例阐述了整洁代码带来的种种利处以及混乱代码、冗余注释等带来的毁灭性后果,并且结合多段代码块、非常详尽地将“书写整洁代码的技巧与守则”教给读者。以下,是我本周细读其前四章的心得体会。

  1.      Ch1:整洁代码三问:是什么,为什么,怎么做

  为什么要写整洁代码?书中首先列举了几条案例,比如某公司的热门软件由于混乱代码导致无法维护、开发团队因为混乱代码而引发“竞赛”内耗资源等,强调了整洁代码的必要性。毫无疑问,能写出整洁代码是我们本能的追求,但往往不是第一追求——它时常让步给时间,毕竟ddl的力量胜于一切。不必说,在过去短短两年不到的编程学习中,我写出的代码绝大多数都是作者所指的混乱代码:表意不清、死气沉沉、难以维护,甚至我自己都不愿意再次点开那些因赶着上交作业而匆忙拼凑成的cpp文件。而作者力图告诉我们,整洁代码应当且必须作为程序员的第一追求,因为整洁就意味着时间和效率。对于学生而言,这一点可能并不明显或甚至截然相反,比如在oj等平台做算法练习题或参加编程比赛时,给变量取个表意清晰的长名字或拆分函数往往是浪费时间;但对于软件开发来说,整洁代码可谓是意义重大。维护、阅读成本等等诸多方面,都能见其益处。

  什么是整洁代码?在我看来,就是不说废话、精炼明确。或者说,“每个例程都让人感到深合己意”。惭愧的是,按这一标准断言,我从未写出过超过5行的整洁代码。怎么写整洁代码?这正是本书接下来二十余章节中将详细介绍的。但有一点令我印象深刻:不要刻意要求自己直接写出整洁代码,写代码应该像写文章,先想到什么就写什么,大致完成后,再逐一拆分润色。直接敲出简洁代码,近乎是不可能的。深以为然。

  2.      Ch2:明确命名

  命名,在任何代码中都随处可见。变量、函数、参数、类、封包……在软件工程中,选择清晰明确的命名无疑是coder的天职。遗憾的是,正如上文所言,很多时候我们基于ddl临头、连夜赶工、需求变更等等因素,或单纯为了一时方便,在命名环节选择草草了事。flag,sign,res,tmp,i,j,k乃至x1,x2等等“言简意赅”的表述,往往使得整个程序难于阅读。我还记得在上一学期的数据结构大作业“银行模拟程序”中,我因为中途将time1与time0代表的部分记混,花了整整一晚上来debug。现在想来,当时若明智地选择arriveTime和waitTime作为命名,便省了诸多烦心事。

  本章节中,详细介绍了“好命名”的必备要素:有意义:让人能“望文生义”,有区分度:与其他命名有“一眼就能看出”的差异,能读出来:方便交流和理解,可搜索:不要太过短小,没有误导性:避免给人“名词动用”等误导,适当添加语境。简而言之,就是要遵循相应的命名原则,愿意花功夫来想一个明确而适当的好名字往往比事后抓耳挠腮debug要有效率得多。这也是代码可读性、可维护性的一大保障。

   3.      Ch3:函数守则

  这一章的目的同样很明确:如何写“整洁函数”。按我亲身经历而言,将功能分拆到各个函数中去是比较自然合理的,但我一般使用一个函数完成一系列工作,这也使得函数中代码量汇聚。本书中,则对我的这一习惯进行了批判,采用一套较严格的函数规范:短小、专一、少参数。

  短小,不但代表代码行数少,还表明逻辑层次上小,即函数中应采用同一抽象层级。另一抽象层级的功能,应该由另一个函数实现。以这一规则组建的函数组,就好像从几颗螺丝钉一样的小零件拼成一个中零件,几个中零件拼成大零件,大零件再拼成小部件……以此类推,直到拼出变形金刚。这种层层推进的函数设计形式不但易于阅读、维护,还有一种逻辑上的艺术感,可谓整洁。

  专一,即一个函数只做一件事。如果我们编写的函数想同时做多件事,那么最好将这多件事分摊给下一级的多个函数各自实现,而不是一窝蜂地在一个函数里扎堆。可以想见,少了各种体量庞大的循环、条件分支中的调用等,函数的可读性将大大提升,这也是实现“短小”的必由之路。

  少参数,则是出于函数效率的考量,既方便调用和测试,又不易产生误导或意料之外的问题。如果需要输入多个参数,例如空间坐标(int x,int y,int z),那么不妨将其封装成一个类,归并到Position Pos 中,再以Pos.x形式调用。

  4.      Ch4:合理注释

  写注释,一直是程序设计老师们反复强调的手段。记得在程序设计和数据结构课中,助教们给我们的要求是注释量应该占代码量的30%以上。而本书中坚决反对这一主张。正如Brian W.Kernighan 与 P.J.Plaugher所言,“别给糟糕的代码加注释——重新写吧”。结合前三章中提到的技巧和规范写出的代码,应当具有明确的意义,让人“不言自明”,无需通过繁复唠叨的注释来阐述其中隐含的奥妙。合理的注释,应当尽可能少,在关键之处如蜻蜓点水、画龙点睛,让人一眼扫过豁然开朗,而不是像臭婆娘的裹脚布一般,把代码块缠得乱七八糟。简单而言,它应该含有必须的信息、函数调用的参数说明、简单解释意图或警示,而不该作为糟糕代码的说明书。

  注释往往是我这样的初学者理解算法的一大有利工具,但对于有经验的程序员来说,使用明晰的命名,结合良好的函数结构,写出的代码往往比注释的可读性强得多。况且,注释往往无法及时修改,陈旧版本的注释只会给人误导和迷惑。更别提直接注释掉某些语句了,这让后来使用这一代码的程序员畏手畏脚、不敢妄动,只会造成冗余代码的堆砌。不幸的是,妄加注释、直接注释掉有问题的语句正是我日前编程的常规操作。今后,当引以为戒。

总而言之,本周我通过对本书前四章的阅读,学到了命名、函数、注释等方面的整洁编程规范和技巧。日后的编程中,我将努力实践书中的好方法,做一名能敲出整洁代码的coder。

参考文献:

[1] Robert C. Martin. 代码整洁之道. 人民邮电出版社, 2010.1.

《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)的相关教程结束。

《《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周).doc》

下载本文的Word格式文档,以方便收藏与打印。