2015年第11本:代码整洁之道Clean Code
前一段时间一直在看英文小说,在读到《Before I fall》这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧。
从5月9日开始看《代码整洁之道》,5月14日完成第一遍的阅读(略掉了并发编程的章节以及两大章重要的JAVA改进的示例),本书中包含大量的有关简洁代码的实用性建议,强烈推荐程序员们(想成为更好的程序员们)必读此书。书中有许多具体的例子,虽然大多是JAVA代码,但对.NET等编程语言同样适用。看完此书后,马上开始对自己手头的代码进行各种各样的重构。现在看到超过200行的源文件就有点不舒服,就想着如何再拆分、简洁一点。这是不是有点简洁过头了?
该书的笔记,有人整理得非常全,从百度上能够搜到这样两篇:
http://blog.csdn.net/john_cdy/article/details/7614564
http://www.cnblogs.com/forlina/archive/2011/06/24/2088603.html
我就不再罗列其中的要点了。我只从每章中挑出一、两条对我影响最大的建议。
前言
书中译者前言中关于“代码猴子”的比喻太形象了。
我们就是一群代码猴子,上蹿下跳,自以为领略了编程的真谛。可惜,当我们抓着几个酸桃子,得意洋洋坐到树枝上,却对自己造成的混乱熟视无睹。那堆“可以运行”的乱麻程序,就在我们的眼皮底下慢慢变坏。
第一章 整洁代码
1.1 程序员也要学习“童子军军规”:让营地比你来时更干净。
如果每次签入时,代码都比签出时干净,那么代码就不会腐坏。
1.2 稍后等于永不
我们曾在代码中写下了无数的TODO,说过有朝一日再回头清理,但几年后发现这些代码还是原样。原来LeBlanc说过,“稍后等于永不”(Later equals never)。
1.3 把代码写简洁,才会赶上进度
程序员们迫于期限压力,写出了能够运转的代码,随着功能的不断加入,代码越来越乱,此时解决之道只有两种:逃离此项目,或者让其它人重新写过。程序员们不断地写出一堆堆的代码,为了某个功能变化,复制一个类,改上几行,为了给某个窗口发个消息,把整个form都引用了进来。制造混乱好像一开始很有效果,但长期来看,总体效率将持续下降,直到所有的程序员们都不愿在混乱的代码间穿梭。
第二章 有意义的命名
2.1 起个好名字要花点时间,但绝对值得。一旦发现更好的命名,就换掉旧的。
2.2 类名不应当是动词,要做有意义的区分。例如:如果没有明确约定,Well, WellClass, WellObject, WellInfo, WellData应该是一个东西。
2.3 循环变量可以用i,j,k,但千万别用l。
第三章 函数
3.1 函数要短小,还要更短小,只做一件事,做好这件事。
3.2 函数最好有多长?20行封顶最佳。以现在的显示器大小,也就半屏多。
第四章:注释
4.1 好的名称就是注释,有时多声明几个局部变量,就是好的注释。
我重构之前的代码:
return new cgTransformation(srcRect, destRect, false, true, true);
后面的三个bool变量每次看了都让人抓狂,只需简单加几个局部变量,不用写一行注释,代码可以更清楚。
bool horzFlip = false;
bool vertFlip = true;
bool keepAspectRatio = true;
return new cgTransformation(srcRect, destRect, horzFlip, vertFlip, keepAspectRatio);
不过作者还说了:函数的参数不要超过3个,这条应该很有争议。
4.2 无病呻吟的javadoc式的注释可以去掉。
如果不是生成供第三方使用的类库,许多函数的这类注释都可以删掉。许多这类注释为了注释而注释,很多只是简单地把函数名称翻译成了中文!
我也从我们的项目中随便找了几行,这样的例子太多了:
/// <summary>
/// 从服务端获取客户端程序的当前版本
/// </summary>
/// <returns></returns>
public string GetCurrentClientVersion()
{
…
}
第五章:格式
5.1 每个函数体之间都用空白行隔开
Visual Studio中自带的格式化工具能够完成不少工作,但相当有限。我发现在Visual Studio的插件CodeMaid可以很好地完成这项工作。
5.2 每条代码行的长度不要超过200个字符
我从项目中找了几行代码,在这段代码之前还有三层花括号,长达168个字符,得把滚动条拉到最右边才看清它,想理解它得来回拖动几次滚动条。
if (seismicMapController.SeismicView.Pipeline.SeismicReader.GetTraceMetaData(i - 1).GetField(204).ToString() == cdpNum)
{
this.seismicMapController.SurveySectionProperty.ViewPosition = new cgPoint(i-1, this.seismicMapController.SurveySectionProperty.ViewPosition.y);
break;
}
第六章:对象和数据结构
6.1 对象和数据结构的反对称性
过程式代码难以添加新的数据结构,因为它要修改所有相关函数。
面向对象的代码难以添加新函数,因为它要修改所有受影响的类。
6.2 Demeter得墨忒耳定律
方法不应调用由任何函数返回的对象的方法。也就是说,只与朋友谈话,不与陌生人谈话。
想遵守这个定律并不太容易,有时为了封装内部细节,就要写出许多重复的代码。
第七章:错误处理
7.1 写一个处理常规流程的函数,把带有大量try-catch的语句单独形成一个函数
7.2 别返回null,别传递null
实在不好办,就在类中写一些类似Point.Empty, Well.Empty的特殊对象。
第八章:边界
可以建立一些单元测试来学习和理解第三方代码,书中称之为“学习性测试(learning tests)”。
有一个好处,当第三方类库出了新版本后,这些代码可以很容易地测试程序包的行为是否发生了改变。
第九章:单元测试
9.1 不仅要写单元测试,还要写许多单元测试,测试驱动开发TDD值得学习
不要以为写单元测试耽误了进度,长远考虑它节省了大量的调试时间,实际是大大提高了效率。好项目的单元测试不是十多个,而是上百个。
9.2 测试代码和产品代码一样重要!仍要写得清晰、简洁、可读。
我们的项目中对单元测试没有硬性要求,一开始还在维护着几个单元测试,几年后发现这些仅有的测试代码也都腐坏了。
第十章:类
10.1 类要短小,还要更短小。
我翻开了项目中的一个超过3000行的类,实在不敢修改其中的一个变量!
实际上Visual Studio 中的#region和#end region语句在鼓励人们写出复杂的类。如果函数和文件都很小,这些语句都是多余的。
10.2 保持内聚性,就会得到更短小的类。(如果发现几个变量经常在一起被几个函数访问,就需要拆分为类了)
10.3 首先要想办法使成员变量保持私有private,放松封装总是下策。
第十一章:系统
构造和使用是非常不一样的过程。AOP我理解不了,但工厂模式还是经常用到的。
第十二章:迭进
Kent Beck的关于简单设计的四条规则:
1)运行所有测试;
2)不可重复;
3)表达了程序员的意图;
4)尽可能减少类和方法的数量。
第十三章:并发编程
略。
第十四至十六章
这几章是关于迭进修改代码的示例,可惜是JAVA代码,真应该好好在开发环境中打开这些代码,跟着书中的思路一步步重构下去。实际上最应该多花些时间认真读读这三章,看看大师如何打磨这些代码的。
第十七章
汇总了书中的各条原则,可以在代码审查时对照它一条一条地进行检查。
2015年第11本:代码整洁之道Clean Code的更多相关文章
- 代码整洁之道Clean Code笔记
@ 目录 第 1 章 Clean Code 整洁代码(3星) ?为什么要整洁的代码 ?什么叫做整洁代码 第 2 章 Meaningful Names 有意义的命名(3星) 第 3 章 Function ...
- 代码整洁之道Clean Code 读后感After Reading
1.有意义的命名 名副其实,避免误导 做有意义的区分,简单明了2.函数 短小,职责单一 别重复自己3.注释 用代码来阐述 可怕的废话4.格式 垂直格式,垂直距离,空范围 横向格式,水平对齐,缩进5.错 ...
- <读书笔记> 代码整洁之道
概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...
- 如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)
不知道有多少人像我一样,程序出现问题时添加函数添加变量解决,变量名用a,b,c等"简单"的字母来表示.不知道有多少人像我一样,看完自己的代码,心里暗骂"什么玩意儿!&qu ...
- 《代码整洁之道 中文版》高清 PDF 电子书下载
代码整洁之道.PDF 下载 代码整洁之道.PDF 中文版 高清 PDF 电子书下载 代码整洁之道下载 点我下载 作者简介 · · · · · · Robert C. Martin,Object ...
- <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合
一.前言 几个月前的看书笔记 ...
- 免费电子书:C#代码整洁之道
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:<Clean Code(代码整洁之道)>是一本经典的著作,那么对于编写整洁 ...
- android开发系列之代码整洁之道
说起代码整洁之道,想必大家想到更多的是那本经典重构书籍.没错,记得当时自己读那本书的时候,一边结合项目实战,一边结合书中的讲解,确实学到了很多东西,对我自己的编码风格影响极深.随着时间的流逝,书中很多 ...
- 读<<代码整洁之道>>的感想
花去了近一周的时间浏览一下这本书.总体感觉这本书写得不错. 我发现自己以前写的代码时多么的糟糕.有很多改进之处... 同时我也发现写出优秀的代码不易.优秀的代码不仅仅易读,并且易修改,易维护,程序易维 ...
随机推荐
- 为android项目集成maven
为什么要为android项目增加maven集成功能呢?这里我想到几个主要理由: 部署测试人员和开发人员的角色分离,让他们摆脱eclipse开发环境设置android sdk环境,直接在服务器上运行一个 ...
- [转]C# 文本框只能输入数字
调用TextBox的KeyPress事件 private void txtUserId_KeyPress(object sender, KeyPressEventArgs e){ //如果输入的不是数 ...
- MyBatis知多少(3)
解决存储过程固有限制的方法之一就是将SQL嵌入到更加通用的语言中去.与存储过程将业务逻辑移入数据库相反,内联SQL将SQL从数据库移入了应用程序代码.这就使得SQL语句可以直接与语言进行交互.从某种意 ...
- _set_invalid_parameter_handler异常处理函数
VS2005之后的版本,微软增加了一些新的异常机制,新机制在出现错误时默认不通知应用程序,这时程序就崩溃了.所以这种情况下,必须调用_set_invalid_parameter_handler._se ...
- [转]不定义JQuery插件,不要说会JQuery
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人,直 ...
- transactional replication 的immediate_sync属性
在默认情况下,immediate_sync是关闭的,这个属性可以在创建publication时指定,也可以在创建完毕后修改. 如果immediate_sync为true, snapshot 文件和re ...
- DateTimePicker 控件的格式设置
DateTimePicker 控件的格式设置 CustomFormat属性设置 : yyyy-MM-dd HH:mm:ss 月大写M,分钟小写m,小时H代表24小时计算,h代表12小时计算yyyy- ...
- LoRaWAN协议(四)--入网方式概述
前言 在LoRaWAN中,node最终和服务器能够正常数据交互,需要先入网,入网的本质,也就是获得一些通信相关的参数,有以下几个: NwkSKey AppSKey DevAddr DevEui 其中 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)
一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...
- .NET ORM 哪家强
ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...