一、代码整洁之道学习笔记
大约在1951年的日本出现了一种5s原则体系,5s的精髓就是精益。
- 整理;搞清事物的所在,通过准确恰当的命名十分重要。
- 整顿;A place for everything and everything in its plase(物皆有其位,而后物尽归其位)。
- 清除;清理工作地的拉线,对于那种四处遗弃的带注释的打代码,应该除之而后快。
- 清洁;及标准化,在开发代码中使用一贯的代码风格和实践手段。
- 身美;或称纪律,在实践中贯彻规程,并时时体现在个人的工作中,并要乐于改进。
1.1.什么是整洁代码
我喜欢优雅和高效的代码,代码逻辑应当直截了当,叫缺陷难以隐藏,尽量减少依赖关系,使之便于维护,依据某种分层战略完善错误处理代码,性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来,整洁代码之做好了一件事。–Bjarne Stroustrup
1.能通过所有的测试;2.没有重复代码;3.体现系统中的全部设计理念;4.包括尽量少的实体,比如类、方法、函数等,–Michael
我的理解:在Java开发中应该坚持单一简单的原则,一个类,一个方法都应该只做一件事,如果,一个方法还能在提取出另外一个方法,就说明违反了单一职责,优雅的代码就是不仅自己看着舒服,也能让别人看着舒服,能很轻松的看懂代码的业务逻辑,这里涉及到有意义的命名,下面也会总结到。
1.2.有意义的命名
在开发中,我们随处可见的都是名字,我们也时时给变量、函数、方法、参数、类、包等命名,整洁代码的第一点就是要有意义的命名。
名副其实
名副其实就是说你个方法是做什么的,参数是什么,就应该名副其实的命名,如果你的方法是删除一条记录,你就不能用get
作为方法的开始,参数名、方法名应该是能够告诉阅读者,它为什么存在,它做了什么事,应该怎么用。
1 | int d; // 消逝的时间,以日计 |
1 | int elapsedTimeInDays; |
上述代码中,这个d并不能代表消逝的时间,以日计
这个注释所代表的含义,我们应该选择指明了计量对象和计量单位的命名,再看elapsedTimeInDays
就可以体现出注释的含义了。
1 | public List<int[]> getThem() { |
上述代码中,当我们要取理解这段代码干了什么的时候,我们都会想问几个问题
- theList是什么东西?
- theList的零下标的值有什么含义吗?
- 值等于4的意义是什么?
- 返回的list1又代表什么?又怎么使用?
避免误导
编写代码的时候应该避免留下掩藏代码本意的错误线索,误导性最可怕的就是将大写字母O作为变量名。
1 | int a = 1; |
虽然,上述代码一般不会这么写,但是,在这里,我们真的很难分清大写字母O、数字0、大写字母I和数字1等情况。
做有意义的区分
我们在编写代码的时候经常会遇见命名重复的情况,这个时候,可能你会为了满足编译器不报错而随意更改其中的一个名称,有时候你会很简单的在后面加一个1或者2等等,这样的名称同样会引起误导,也没有提供正确的信息,
1 | public void copyChars(char[] a1, char[] a2){ |
上面的参数名称就表达不出任何意义的区分,也不能很清楚的明白是将谁复制给谁,如果,我们换一个命名,如下,应该就可以清楚了吧。
1 | public void copyChars(char[] source, char[] target){ |
使用读的出来的名称
在开发的时候,我们经常会与别人讨论代码,所以不要自己造词,增加沟通成本。
使用可以搜索的名称
单字母和单数字的命名很难在项目中找到自己想要找到的,无论是为了快速定位,还是为了后期如果需要更改可以一键查找和替换,我们都应该在开始命名的时候,使用可搜索的名称。
避免使用编码
编码已经太多,把类型编进名称里面,白白增加了解码的负担,带编码的名称也不利于发音,容易打错。
避免思维映射
不应当让读者在脑中把你代码的名称翻译成他们熟悉的名称。
类名
类名和对象名应该是名词和名词短语,不应该是动词。
方法名
方法名应该是动词或者动词短语,依靠JavaBean
并在前面添加get、delete等前缀。
别扮可爱
不要想一个小学生一样,搞一个非主流的名称,这种做法在代码中只能是俗。
每个概念对应一个词
给每一个抽象概念选中一个词,并且一以贯之。
避免使用双关语
避免将同一个单词用于不同的目的,同一个术语