《代码整洁之道》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 第一周)的更多相关文章

  1. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

  2. <读书笔记> 代码整洁之道

    概述      1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...

  3. 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周

    <代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...

  4. <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合

    一.前言                                                                                       几个月前的看书笔记 ...

  5. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  6. 如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)

    不知道有多少人像我一样,程序出现问题时添加函数添加变量解决,变量名用a,b,c等"简单"的字母来表示.不知道有多少人像我一样,看完自己的代码,心里暗骂"什么玩意儿!&qu ...

  7. Programming好文解读系列(—)——代码整洁之道

    注:初入职场,作为一个程序员,要融入项目组的编程风格,渐渐地觉得系统地研究下如何写出整洁而高效的代码还是很有必要的.与在学校时写代码的情况不同,实现某个功能是不难的,需要下功夫的地方在于如何做一些防御 ...

  8. 《代码整洁之道》&《程序员的职业素养》

    这是why技术的第32篇原创文章 春节期间读了两本技术相关的书籍:编程大师Bob大叔的<代码整洁之道>和<代码整洁之道:程序员的职业素养>. <代码整洁之道>出版于 ...

  9. 读《Clean Code 代码整洁之道》之感悟

    盲目自信,自认为已经敲了几年代码,还看什么整洁之道啊.我那可爱的书架读懂了我的心思,很明事理的保护起来这本小可爱,未曾让它与我牵手 最近项目中的 bug 有点多,改动代码十分吃力,每看一行代码都带一句 ...

随机推荐

  1. 2018-06-05(thinking in java)

    1:类只能有2种访问权限,一种是不写访问权限:默认包访问权限,另一种是public.且类只能有一个pubic 2:方法有4种访问权限,pubic(都可以访问),protexted(继承访问权限),pr ...

  2. 用注册表创建无法删除的IE快捷方式

    代码如下: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/CLSID/{98745625-1234 ...

  3. SPI 通信

    Frm: http://www.wzaobao.com/p/l5079K.html http://blog.csdn.net/xqmoo8/article/details/8043474 http:/ ...

  4. PAT_A1094#The Largest Generation

    Source: PAT A1094 The Largest Generation (25 分) Description: A family hierarchy is usually presented ...

  5. 【工具原则】5W2H法学习笔记

    目录 问题描述 事件(原因)描述 任务描述 方案决策 小结 5W2H法又叫七问分析法,是二战中美国陆军兵器修理部首创.按事务构成要素,从规范的七个方面思考,避免疏忽遗漏. 可以应用在:问题描述.事件描 ...

  6. 常用sign算法

    所有参数包括appkey或者token拼接成&key=value格式 转小写 正序排序 MD5后得到sign

  7. C++之运算符_算数运算符

    运算符 **作用:**用于执行代码的运算 | **运算符类型** | **作用** || -------------- | -------------------------------------- ...

  8. elasticsearch实现读写分离

    简介 今天我们不讲三国,我们讲一讲elasticsearch(以下简称ES)读写分离,这是个好东西,全文索引的时候使用它贼得劲,对elasticsearch索引原理不太清楚的,请自行查找相关的文章 这 ...

  9. 防止xss漏洞-编码转义

    用JS进行转义还是用PHP进行转义,最后存入数据库的是什么形式 比如:用户输入: <script>alrt(0);</script>那数据库里面存储的是源数据还是转以后的数据: ...

  10. android的webView内部https/http混合以及自适应屏幕

    两种请求都有的情况下,会导致WebView加载不出来. //自适应屏幕 settings.setUseWideViewPort(true); settings.setLoadWithOverviewM ...