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代码,真应该好好在开发环境中打开这些代码,跟着书中的思路一步步重构下去。实际上最应该多花些时间认真读读这三章,看看大师如何打磨这些代码的。

第十七章

汇总了书中的各条原则,可以在代码审查时对照它一条一条地进行检查。

时间: 2024-10-13 09:22:09

2015年第11本:代码整洁之道Clean Code的相关文章

&lt;读书笔记&gt; 代码整洁之道

概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一种,代码质量与整洁成正比的观点,并给出了一系列行之有效的整洁代码操作实践,只要遵循这些规则,就可以编写出整洁的代码,从而提升代码质量. 3.该书介绍的规则均来自于作者多年的实践经验,涵盖从命名到重构的多个编程方面,具有很好的学习和借鉴价值. 4.习艺要有二:知和行.你应当学习有关规则.模式和实践的知识,穷尽应知之事,并

《代码整洁之道》读后感

众所周知,软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发派还是传统开发派,都不得不承认.<代码整洁之道>提出一种观念:代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好的基础.作为编程领域的佼佼者,这些实践在<代码整洁之道>中体现为一条条规则(或称“启示”),并辅以来自现实项目的正.反两面的范例.只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量.以上便是<代码整洁之道>这本书的内容简介,

《代码整洁之道》精读与演绎】之四 优秀代码的格式准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://blog.csdn.net/poem_qianmo/article/details/52268975 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写代码过程中一些良好的格式规范. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上

&lt;代码整洁之道&gt;、&lt;java与模式&gt;、&lt;head first设计模式&gt;读书笔记集合

一.前言                                                                                       几个月前的看书笔记,内容全部都是摘自书中比较精辟的句子.笔记都是一段一段的句子,故没有文章的篇幅概念,仅供温习之用,更多详细内容请看原书!!! <代码整洁之道>里面有很多前人编写简洁.漂亮代码的经验.当然书中作者的经验并不100%适合每个人,但大部分都是可借鉴的! <java与模式>这本书内容太多了,我

【读书笔记】--代码整洁之道

“相对于任何宏伟景愿,对细节的关注甚至是更为关键的专业性基础.首先,开发者通过小型实践获得可用于大型实践的技能和信用度.其次,宏伟建筑中最细小的部分,比如关不紧的门,有点儿没有铺平的地板,甚至是凌乱的桌面,都会将整个大局的魅力毁灭殆尽.这就是整洁代码之所系”----没有比书中的这段话更能说明这本书的意义了. <代码整洁之道>是第1期书山有路活动选出的读本.相对于记住那些如何写出整洁代码的那些法则,养成保持代码整洁.提高代码质量的习惯和思维更为重要.全书大致分为三个部分,第一部分1-10章都是介

代码整洁之道

命名,多花些时间推敲命名, 有意义的命名非常重要. 接口的命名,不使用"I"开头比较简洁,加上I以后是比较规范,但是比较繁琐以及废话.如果想区别接口和实现,不如在实现类中进行编码,比如添加后缀"Imp",android以及jdk中的大多数接口都没有使用I. 取名字带有简写要慎重, 比如"人事系统"的类, 前面都是"RSXT..",除了让快捷按钮找不到类以外,没有啥意义了,用包吧. 函数,函数要短小,要职责明确,最好功能单一,参

【《代码整洁之道》精读与演绎】之四 优秀代码的书写格式准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52268975 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写代码过程中一些良好的格式规范. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量

【《代码整洁之道》精读与演绎】之五 整洁类的书写准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52344732 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写整洁类的一些法则. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上可靠,也为

代码整洁之道读后感(三)

注释 注释不能美化糟糕的代码 用代码来阐述你的思路 好的注释是什么? 法律信息 提供信息的注释 对意图的解释 警示:例如 // Don't run unless you have some time  to kill TODO注释 公共API的JavaDoc 坏的注释是什么? 多余的注释 误导性的注释 循轨式注释:所谓每个函数都要有JavaDoc活每个变量都要有注释的规矩简直是愚蠢.这类注释只会让代码混乱不堪. 日志式注释 废话式注释: Default Constructor 信息过多:别再注释