《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)
《代码整洁之道》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 第一周)的更多相关文章
- 2015年第11本:代码整洁之道Clean Code
前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...
- <读书笔记> 代码整洁之道
概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...
- 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周
<代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...
- <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合
一.前言 几个月前的看书笔记 ...
- 《代码整洁之道》(Clean Code)- 读书笔记
一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...
- 如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)
不知道有多少人像我一样,程序出现问题时添加函数添加变量解决,变量名用a,b,c等"简单"的字母来表示.不知道有多少人像我一样,看完自己的代码,心里暗骂"什么玩意儿!&qu ...
- Programming好文解读系列(—)——代码整洁之道
注:初入职场,作为一个程序员,要融入项目组的编程风格,渐渐地觉得系统地研究下如何写出整洁而高效的代码还是很有必要的.与在学校时写代码的情况不同,实现某个功能是不难的,需要下功夫的地方在于如何做一些防御 ...
- 《代码整洁之道》&《程序员的职业素养》
这是why技术的第32篇原创文章 春节期间读了两本技术相关的书籍:编程大师Bob大叔的<代码整洁之道>和<代码整洁之道:程序员的职业素养>. <代码整洁之道>出版于 ...
- 读《Clean Code 代码整洁之道》之感悟
盲目自信,自认为已经敲了几年代码,还看什么整洁之道啊.我那可爱的书架读懂了我的心思,很明事理的保护起来这本小可爱,未曾让它与我牵手 最近项目中的 bug 有点多,改动代码十分吃力,每看一行代码都带一句 ...
随机推荐
- thinkphp 原生分页
paginate() 是有三个参数: 第一个参数是 $listRows [int],也就是当前的页数 第二个参数是 $simple [boolean], 是否简洁模式或者总记录数 第三个参数是 $co ...
- 牛客多校第八场 B Beauty Values 水题
题意: 给定一个序列,问你子区间中不同数字数量,在所有子区间中之和为多少. 题解: 统计每个数字在多少个区间中出现即可.对于每个数字,直接枚举左右端点. 注意去重,因此要记录每个数字上一次出现在哪里, ...
- trackback 捕获异常并打印
### 1 except Exception as e: print(traceback.format_exc()) def _handle_thread_exception(request, exc ...
- C++ 编译过程简介
C/C++程序编译流程: 预处理->编译->汇编->链接 具体的就是: 源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序( ...
- 洛谷P3959——宝藏
传送门:QAQQAQ 题意: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了$n$个深埋在地下的宝藏屋, 也给出了这$n$个宝藏屋之间可供开发的$m$条道路和它们的长度. 小明决心亲自前往挖掘所有 ...
- shell 单引号&双引号的使用
使用双引号: shell> X='parameter' shell> echo "Hello $X" Hello parameter 单引号中嵌套单引号: shell& ...
- sql实现查询某个字段在哪个表里 及结构是什么
) --数据库名 ) set @dbname2='aab' select @str = ' SELECT 表名=d.name,字段名=a.name,序号=a.column_id, 标识=is_iden ...
- Codeforces 479【C】div3
题目链接:http://codeforces.com/problemset/problem/977/C 题意:给你n个数字,输出任意一个数字,这个数字刚好大于等于,序列里面k个数字. 题解:排个序,第 ...
- C++列表初始化是初始化本类自身含有的成员变量,不能直接初始化继承过来的成员变量
在构造函数体内赋值就是对的了
- POST提交数据之---Content-Type的理解
Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据. 在网络请求 ...