重构,绝对是写程序过程当中最重要的事之一。在写程序以前咱们不可能事先了解全部的需求,设计确定会有考虑不周的地方,并且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了。更况且,咱们不多有机会从头至尾完成一个项目,基本上都是接手别人的代码,即便这个项目是从头参与的,也有可能接手其余组员的代码。咱们都有过这样的经验,看到别人的代码时感受就像屎同样,有一种强烈的想重写的冲动,但必定要压制住这种冲动,你彻底重写,可能比原来的好一点,但浪费时间不说,还有可能引入原来不存在的Bug,并且,你不必定比原来设计得好,也许原来的设计考虑到了一些你没考虑到的状况。咱们写的代码,终有一天也会被别人接手,极可能到时别人会有和咱们如今同样的冲动。因此,咱们要作的是重构,从小范围的重构开始。html
重构不仅能够改善既有的设计,还能够帮助咱们理解原来很难理解的流程。好比一个复杂的条件表达式,咱们可能须要好久才能看明白这个表达式的做用,还可能看了很久终于看明白了,过了没多长时间又忘了,如今还要从头看,若是咱们把这个表达式运用Extract Method抽象出来,并起一个易于理解的名字,若是函数名字起得好,下次当咱们再看到这段代码时,不用看逻辑咱们就知道这个函数是作什么的。若是对这个函数内全部难于理解的地方咱们作了适当的重构,把每一个细小的逻辑抽象成一个小函数并起一个容易理解的名字,当咱们看代码时就有可能像看注释同样,不用再像之前同样经过看代码的实现来猜想这段代码究竟是作什么的,好的代码赛过注释,毕竟注释仍是有可能更新不及时的。安全
《重构,改善既有代码的设计》,这是一部经典之做,相信不少人都听过或看过,看这本书时会发现,书中讲的都是一些很简单的东西,并且不少东西就是咱们平时在作的,只是做者把它们总结了起来。好比说Rename Field,就是对不易理解其做用的字段起一个易于理解的名字,这个确定咱们都作过,可是更多时候,咱们是对这种字段视而不见,好比曾经花了好久没搞明白代码的字段"IP"是什么的缩写,最后发现居然是“INPUT”。看过这本书的收获是,让重构融于整个写代码的过程当中,让重构再也不做为一项独立的任务,而是在写代码的过程当中随时随地的进行,一个函数不容易理解,重构;添加新功能时很不方便,重构,使添加新功能变得理解。函数
这本书是用Java写的,并且Java的版本很老。测试
书中的一些东西说得太绝对,好比说看到switch就重构,但这是不现实的,好比说Android开发,菜单的onOptionsItemSelected,这个确定是重构不了的;对于不少控件的onClickListener,仍是统一设置一个Listener并经过ViewID区分方便点,尤为是在Adapter的getView中,针对每一个控件new一个onClickListener会生成太多对象。固然,不是说这个重构手法无效,而是这个手法提醒咱们,当看到这样的状况时须要认真考虑一下,当前的状况是否须要重构,若是肯定不须要,就那样好了。线程
可是有些东西仍是很值得注意的,好比封装集合(Encapsulate Collection),当调用者请求一个类的一个集合对象时,咱们最好不要返回这个集合对象,而是返回这个集合对像的一个不可修改的副本,并增长添加/移除数据的函数。好比Android开发的Adapter,咱们常常会为了方便给Adapter添加返回数据集合与设置数据集合的方法,但这是不安全的,咱们不能肯定调用者得到这个集合后会作什么事情,若是调用者修改了这个集合的内容咱们也对其一无所知,在Android中,若是调用者在非UI线程得到了Adapter列表的数据并修改是会出问题的。设计
**重构前,先检查本身是否有一套可靠的测试机制。这些测试必须有自我检验的能力,**毕竟重构可能破坏掉一些东西,咱们要靠测试帮助咱们发现这些问题,**不要由于测试没法捕捉全部bug就不写测试, 由于测试的确能够捕捉到大多数bug。**不过,说来惭愧,我不多写测试,尤为是Android项目。htm
书中全是一些很简单的手法,我相信,咱们确定都用过其中的大部分重构手法,只是没有察觉。这本书只是对其进行了一个总结,并让咱们意识到重构这项技能,并让重构融入咱们整个写程序的过程当中,让重构无处不在。对象
书中的一些重构手法,在我感受可能就不算是重构手法,好比给函数添加参数,若是参数不够又必须添加,咱们确定会添加的,这算是功能修改仍是重构,随便怎么理解吧,不过做为笔记,仍是把全部这些都记录下来了。blog
对这本书的笔记只有三个图,是对书中全部重构手法列表的一个简单记录,方便之后查阅,至于具体操做步骤或例子,之后想看时翻书就好了,或都网上也能够搜到的。下面这个连接是一个C#版本关于重构的系列,但不是这本书的C#版本,其中的手法大都是相同的,圣殿骑士:31天重构系列。开发
重构列表:
要点列表:
代码坏味: