《代码整洁之道》读书笔记
这本书看完之后,给我最大的感触就是:要主动提升自己的代码素养,有意识的将代码写的整洁。本书提出了一些方法和思想都给了我很大的启发。
技艺
习艺之要有二:知和行。
一、整洁代码
二、有意义的命名
三、函数
四、注释
五、格式
六、对象和数据结构
七、错误处理
八、边界
九、单元测试
十、类
十一、迭进
十二、并发编程
十三、逐步改进
十四、JUnit内幕
十五、重构SerialDate
十六、味道与开发
十七、附录A并发编程Ⅱ
一、整洁代码
1)沼泽(wading)
2)勒布朗法则:now or never。
3)制造混乱无助于赶上限期。
4)读的时间远远多于写的时间。
5)让营地比你来时还要干净。
二、有意义的命名
命名的简单规则
1.名副其实:明一个命名都应该体现其意义,好的命名不需要注释来补充。
2.避免误导:特殊意义的字符不适合用来命名(如java,hp,android等);提防使用不同之处较小的名称(如effectiveString和effctivestring);避免使用形象字(1和l,0和O)。
3.做有意义的区分:光是添加数字或废话是不够的,如name1和name2可以写成OldName和NewName;name和names可以写成SingleStuName和AllStuNameList。getAccount();getAccounts();getAccountInfo();在可读性上是没有区别的,程序员不知道调用哪一个函数。
4.使用读的出的名称:不要自造词。
5.使用可搜索的名称:使用的名称应该易于被搜索到(定义成员常量来代替数字,如WORK_DAYS代替5)。
6.避免使用编码。
7.避免思维映射。
8.类名:类名应当使用名词而不用动词(用Customer而不是Manager).
9.方法名:应当是动词或动词短语(如setName,deletePage),重载构造器时,使用描述参数的静态工厂方法名好过只用工厂方法名,如:Complex fulcrumPoint = Complex.FromRealNmuber(23.0);好于:Complex fuicrumPoint = new Complex(23.0);
10.别扮可爱:使用幽默的方式来命名,别人并不一定能领会你的幽默。
11.每一个概念对应一个词:给每一个抽象概念选一个词(如get,set,delete,enter等)
12.别用双关语:如add、insert、append等词都有类似的意思,在使用时最好准确,而且统一。如字符串连接应该用append,而不是add。
13.使用解决方案领域名称:尽量使用计算机领域的术语,而不是依据问题所以涉及领域来命名。
14.使用源自所涉问题领域的名称:在难以用计算机领域术语来命名时。
15.添加有意境的语境:如state改为addrState。
16.不要添加没有意义的语境:类名尽量简单。
三、函数
1.短小:函数的缩进层级不该多余一层或两层,而且if语句、else语句、while语句等其中的代码块应该只有一行,大抵应该是一个函数的调用语句。
2.只做一件事:判断函数是否只做一件事是看代码是否可以再拆出一个函数。
3.每个函数一个抽象层级:自顶下小读代码:向下规则。
4.Switch语句:尽量放在抽象工厂底层,不让别人看到。
5.使用描述性的名称:“如果每个例程都让你感到深合己意,那就是整洁代码”。函数越短小,功能越集中,就越好取名字。别害怕长名字,而且命名方式要保持一致。
6.函数参数:最理想的参数数量是零。布尔值不应该作为参数传递,可以分为是一个函数,否一个函数。三个及其以上参数就需要封装成类来处理了。参数列表。用列表来传递可变的参数。
7.动词与关键字。如write(name)、writeField(name)。
8.无副作用。
9.输出参数:避免使用输出参数。
10.分割指令与询问:有时候为了让代码有可读性,得把代码变的“复杂”合理。
11.使用异常代替返回错误码。try{}catch(Exception e){e.printStarkTrace();}代替if(boolean)。抽离Try/Catch代码块形成一个函数:将try和catch代码块的主题部分抽离出来,另外形成函数。错误处理就是一件事,try应该是函数的第一行,catch/finally代码块之后也不应该有其他内容。使用异常代替错误码Error.java便于新增。
12.被重复自己:一个功能函数只写一次!
13.结构化编程
作者:我并不从一开始就按照规则写函数,而。,是不断打磨代码。
四、注释
好的代码不需要注释 。
能用函数变量时就别用注释。
尽量删除代码,而不是注释代码。
函数头不需要踏跺的描述,因为好的名字就可以让人一目了然。
五、格式
变量的位置
函数的位置
类的位置
包的位置
格式上做到整齐
良好的缩进和空格有助于阅读。
六、对象和数据结构
对象吧数据隐藏于抽象之后,暴露操作数据的函数。数据结构暴露其数据,没有提供有意义的函数。
对象与数据结构之间的二分原理:过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。反过来就是:过程化代码难以添加新的数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类。所以对于面向对象较难的事情,对于过程式代码却较容易,反之亦然。
一切都是对象只是一个传说,有时候需要简单数据结构上的过程化操作。
德墨忒尔律:模块不应了解它所操作对象的内部情形。
类C的方法f只应该调用以下对象的方法:
C
由f创建的对象
作为参数传递给f的对象
由C的实体变量持有的对象
方法不应调用由任何函数返回的对象的方法(只与朋友交谈,不与陌生人谈话)如: final String outputDir = ctxt.getOptions().getScratName);隐藏对象每部结构。
对象暴露行为,隐藏数据。便于添加新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为(继承)。数据结构暴露数据,没有明显的行为。便于向既有的数据结构添加新行为,同时也难以向既有函数添加新数据结构(失血模型)。
七、错误处理
1、使用异常而非返回码
2、先写Try-Catch-Finally语句
3、使用不可控异常
4、给出异常发生的环境说明
5、依调用者需要定义异常类
6、定义规范流程
7、别返回null值
8、别传递null值
八、边界
九、单元测试:学会eclipse单元测试!
十、类
1、类的组织:变量、方法、私有工具函数的顺序。
2、类应该短小:
单一权责原则(SRP)类和模块应有且只有一条加以修改的理由。系统只应该由许多短小的类而不是少量巨大的类组成。每个类仅仅封装一个权责,只有一个修改原因,并与少数的其他类一起协同达成期望的系统行为。
类应该只有少量实体变量。类中的每个方法都应该操作一个或多个这种变量。方法操作的变量越多就越黏聚到类上,如果每个变量都被每个方法所使用,则类具有最大的内聚性,即意味着类中的方法和变量相互依赖、互相结合成一个逻辑整体。大类拆分小类会有更加透明的结构。
隔离测试