读书笔记--<<会说话的代码>>

时间:2021-12-05 23:14:45

  三天看完一本书,说出来我都不信,不过我还真是史无前例的做到了, 现在分享一下我的收获,希望大家拍砖,共同讨论一下.

  <<会说话的代码>>一书是我们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的设计模式吧.

    

  书中内容有很多,我只是选取了其中的一部分,作为我的读书笔记, 不算是"书透"吧,希望王老师不要责怪.

  以后争取每读完一本书,都写一篇读书笔记,对自己的帮助真的很大.也希望大家看了,能够有所收获.