三天看完一本书,说出来我都不信,不过我还真是史无前例的做到了, 现在分享一下我的收获,希望大家拍砖,共同讨论一下.
<<会说话的代码>>一书是我们BJDP小组里的王洪亮老师的一本著作,第一次听王老师分享时,就被王老师的技术折服了,如果大家在北京,有兴趣的话可以参与我们这个"北京设计模式学习小组(BJDP)"(免费参与哦), 相信每一个人都会有所收获 .
还是说回书,这本书主要阐述了怎么样让我们写的代码具有自我的表达能力,让每一个程序员都能看懂,而且易扩展和维护.主要从以下几个方面着手:命名,注释,风格与结构,架构.(以下内容是我从书总结出来,再加上自己的理解,如有不对,与作者无关哦)
1. 命名:
1)最好全要英文,不要加入地方特色(拼音,法语之类),
2)最好不要使用缩写,相似单词太多了,对con-有太多的猜测,(除那些约定俗成的)
3)最好不要超过16个字符,太长不容易看懂,而且命名太长可能是设计上有问题.
4)见名知义,无意义的名字最好不要起:temp,a,para1,list (循环变量除外).
5)包或项目的名称:组织/公司+项目+功能/模块,如.Microsoft.Windows.Common.Controls这样能避免与第三方模块集成出现重名的情况.
6)接口不要以I开头,有时一开始定义的接口,改着改着就成了抽象类了,此外要说推荐,就推荐使用-able结尾表能力,如Cloneable,Runnable.
7)基类要选用具有通用意义的名词:Model,View,Control.有些抽象类可以加前缀Abstract+
8)方法命名:动词(+名词).这里名词根据实际情况可有可无,如果有的话,根据返回值的情况确定是否用复数形式.
9)考虑使用时样子如类名LeapYear,方法名isLeapYear,初看都不错,但使用时就发现LeapYear.isLeapYear()不如LeapYear.isLeap()更好.
10)常量都大写,单词多的话之间采用下划线,常量多的话可以通过开头词进行分组.
11)多使用对应词语:
min max | positive negative | start stop | begin end | source destination | from to | previous current next | create destory | plus minus |
connect close(disconnect) | upload download | add remove | add sub | enable disable | pause resume | open close | initialize finalize | request response |
success fail | bottom top | include exclude | input output | import export | width height | up down | valid invalid | push pop |
get set | first last | befor after | ||||||
2. 注释
1)如果有版本管理工具,那么就不要修改记录的注释了.
2)如果你还不知道todo那就要查一下啦
3)JavaDoc不是万能的,对那些需要指明的地方,还需要我们特别注释.
4)异常处理中 如果catch不做任何处理,那就需要写注释.
3. 风格与结构
1)看看自己写的代码是否整齐,IDE可以帮助我们缩进对对齐,以表现出更好的代码层次关系.
2)长方法,我个人理解超出一屏就太长了,IDE的Rafactor就派上用场了:提取方法,或者看一下是不是这个方法做了不该它做的事.
3)某行太长,每次只能拖到滚轮才能看全的行,是不是太长了呢,
4)去掉false 和true:if(candidate.visible==false)与if(!candidate.visible)哪个更好一些呢.
5)长参数列表,有的书说参数个数可以是7+-2,本人作者建议参数小于3,最好一个都不要.我觉得如果架构设计的好的话,可以实现(有难度啊),起码是个方向.具体方法是:引入参数对象或提取字段.
6)长分支:if else或swich Case.解决办法有:合并同类项(减少代码),状态/策略模式(会生成多个类,可以通过配置文件进和步简化),
7)魔法数字与魔法字符串:硬编码在代码的数字或字符,不仅不易修改,而且还看不懂它是什么意思.用配置文件试一试.
8)去掉return前的判断:比较以下三段代码:你会发现....
//first para
public boolean hasMore(){
boolean flag=false;
if(list.size()>){
flag=true;
}
return flag;
} //second para
public boolean hasMore(){
if(list.size()>){
return ture;
}
return false
} //third para
public boolean hasMore(){
return list.size()>
}
9)嵌套过深圈复杂度越高,越容易引起Bug,主要的方法有:提取方法(虽然实际上没有减少层数,不过会改后续重构提供方便),提前判定,用while代替for
具体实例,请看书中的实例.
10)Don't Repeat Yourself:老生常谈的问题了.解法有:同一类内的提取方法,子类间的抽取方法到父类,相互之间没关系类可以把共有方法移植到工具类.
11)采用正则表达式进行内容或格式校验.替代那些if else if .....
12)使用Lambda表达式简化代码.
4.架构
1)通过使用OOA与OOD来设计系统.
2)尽量满足SOLID设计原则.
3)想要实现以上两点:去啃本GOF的设计模式吧.
书中内容有很多,我只是选取了其中的一部分,作为我的读书笔记, 不算是"书透"吧,希望王老师不要责怪.
以后争取每读完一本书,都写一篇读书笔记,对自己的帮助真的很大.也希望大家看了,能够有所收获.