重构感悟随笔

1.添加功能时候重构,在添加新功能的时候发现原有代码不能很好的添加新功能,而如果用某种设计可以很轻易的添加该功能,而且该代码也能够重构成该设计那就重构他吧。

2.修改bug的时候进行重构,当你进行严格bug修改的时候,而代码没有一眼看出问题所在,需要反复查找才能找到,那你就应该重构他了。

3.当需要给一段代码添加注释的时候,就应该考虑是否需要把它提炼成一个单独的函数了。

4.当出现判断或循环的时候也应该考虑是否需要把它提炼成为一个函数了。

5.发散式变化(当有变化时只对一进行修改,真对某一变化进行的应该只针对一个类进行修改。而当对多进行修改的时候说明应该重构了,找到那个引起所有修改的特定原因)。

6.一个类受到多种变化的影响,一个种变化引发了多个类的修改。

7.测试代码,最好的编写是在开始编写功能之前,等于在问自己:添加各种功能到底要做什么,就可以把注意力集中到接口而非实现,而当测试通过也是工作结束的时候。

8.减少临时变量的使用,把临时变量替换成函数表达式或者可以改为查询函数,声明为final可以检测该值是否只被赋值一次。

9.解释性变量,当有一个复杂性的表达式的时候不易读懂理解的时候,可以把其提炼出几个final类类型的解释性变量,一遍更好的阅读。

10.一个临时变量应该只被赋值一次,只承担一个职责,当一个变量被多次赋值的时候,用该把该变量进行拆分。

11.移除对参数的赋值,在方法中要防止对传参的赋值,应该添加一个临时变量来进行对该参数的操作。

12.小型函数的优美,而局部变量是将函数小型化的障碍。

13.以函数对象取代函数,当一个函数中临时变量太多或该还是太难以重构的时候可以把该函数转换成函数对象。

14.替换算法,把不清晰明了的算法替换为更好的算法。

15.当一个类的职责不在单一明确的时候,可以考虑重构该类把该类分离出一个新的类。

16.委托关系,隐藏委托关系,本来是通过该对象的方法获取一个新的对象,在通过该对象获取想要的参数,而隐藏委托就是直接在该对象提供一个调用参数的方法,所有方法都是在该方法中完成,隐藏了委托之间的关系。而有时候隐藏委托的中间人也是有弊端的,当受托类每次添加一个新特性的时候,你就要给委托类添加一个简单函数,这是个痛苦的,所有这时候就该取消这个中间人了,应该让用户自己直接调用受委托的对象。

17.通过函数取值赋值和直接通过对象获取的区别,在子类继承的时候会有所体现,当你想要对该值进行限制的时候,子类重写就会更加方便而不用去改变父类。

18.以字面常量替换魔发数。

19.封装字段或者说是隐藏数据,类的字段应该是private而不要是public并提供相应的访问函数方法。

20.对数组和集合的封装,只给其函数方法,而不要把整个集合给它,这样能保证集合数据结构信息和当该集合被修改的时候集合拥有者而对此一无所知。

21.哑数据对象,用于记录数据而没有具体的行为对象。

22.以类取代类型代码,通过创建一个类,设定几个常量为类型代码,该常量的类型为该类本身,在设置一个状态变量用来存储类型代码的具体数据,通过构造方法给予该变量赋值,而几个常量会在该类创建的时候就确定所有的类型代码。

23.以子类取代类型吗,通过以不同的类型继承于主体类,然后通过工厂方法传参来判定应该创建的子类。

24.以状态设计模式取代类型码,通过创建一个状态父类,在分别继承几个不同状态的子类,在需要的类中增加一个函数工厂方法,通过函数工厂方法接受的参来生成继承的不同状态对象,并将该状态存入变量中。

25.以字段取代子类,当几个子类之间的差别只是函数返回的常量数据不同的时候,可以去除子类,只有加上对应的常量即可,通过工厂方法的不同赋予其构造方法的参数不同实现不同的对象。

26.分解条件表达式,把if,then,else分别分解成为一个函数。

27.将一系列判断但最终行为却一致的合成为一个表达式,而合成为一个表达式后可以把它进一步重构为一个函数。整合为一个函数表达的意思不同了,一个是做了什么,而整合之后是为什么这么做。

28.以卫语句代替复杂的嵌套表达式,if判断的时候可以使用多个单个if进行判断,也可以把复杂的if判断,将其中的条件进行条件翻转,后在进行以卫语句进行重构。

29.以null对象取代null值,在改对象下新建一个子类,两个类都实现isNull的方法,一个返回true,一个返回false。在在父类创建一个函数,该函数的作用是返回一个子类的类型对象(也就是一个null对象),子类和父类的区别主要在于用到isNull判断时候分别执行的不同的方法,子类重写该方法返回当为null的时候该执行的方法。

30.修改方法和查询方法分开,不要混为一谭浆糊。

31.权限封装,隐藏,显示,隐藏能隐藏的一切,显示必要的。函数,变量,委托关系。

32.个函数一个好名字,如果不知道名字怎么命名可以先写一段注释,然后简化注释。好办法。

33.当几个函数做着相同的事但就只有一部分不一样,我没法重构整个函数但我可以重构其中的一部分,可以找出相同的,把不同的能当做参数来传递只重构这一部分,为这一部分重新创建一个新的函数。

34.当不知道怎么重构的时候可以一小步一小步的来,先运用最简单的重构方法,当重构一次了的时候下一次重构的思路可能已经展现在你面前了。

35.引入参数对象,当你频繁的使用几个参数当做参传给函数的时候,就可以考虑把这几个参(数据泥团)封装成为一个对象,并可以把这个几个字段设为不可变的,只能通过构造方法来进行赋值,等于是只能在创建的时候进行赋值,这就是不可变的类了。

36.移除设置函数,当一个类有一个或几个字段在改类创建以后的就不在需要改变的时候,去除这几个设值函数,在构造方法中给予他赋值,并把它设为fianl,以保证以后的程序员不会乱用你的设值函数,已造成其他麻烦。

37.封装向下转型,把转型动作封装到函数中,而不是向下转型的操作交给客户端。

38.字段上移,当几个子类中有相似的字段的时候,看看他们所调用到的函数是否相同相似,若是则可以将其字段上移到超类中。

39.重复容易滋生错误,函数上移跟字段上移相似,还有构造函数上移,通过在父类中建立新的函数而通过子类的构造函数调用父类的构造函数。

40.字段或函数下移(有点不明白)该何时用,动机是什么,把父类中只有一部分被实现的没有被全部子类实现的可以抽取出来新创建一个子类。

41.接口和超类的提炼,超类和子类没有太大区别,将他们合并。

42.好几个类,以相同的顺序执行不同的操作,可以运用到模板设计,把顺序提出成为一个函数,并提升到超类中。而内部的操作根据不同的地方分解为一个个函数在超类中定义为一个个抽象方法,而不同的子类分别实现不同的函数就可以通过,多态的不同进而实现调用不同的方法。

43.以委托取代继承,当你继承了一个父类的时候,发现自己只需要其中的一部分功能的时候,这时候可以用委托来取代继承。

44.重构小步小步前进,确保每一次重构后测试正确,确保能随时停止重构,确保能随时撤销重构。重构的时候只是重构,就算发现代码有缺陷有要修改的地方也要忍着,记下来,完成重构,在换回另一种编写代码的职责,两种职责要分开,确保职责的单一。

posted @ 2018-03-26 10:17  薄焦尾  阅读(136)  评论(0编辑  收藏  举报