`

重构学习笔记三(代码的坏味道)

阅读更多
异曲同工的类
•症状:
–两个类看上完成相同的工作,但却使用了不同的方法名
•措施:
–协调各个类,使之取得一致,从而可以删除某个类
•采用重命名方法,使方法名类似
•使用移动方法、增加参数和方法参数化,从而使方法的协议(方法签名和实现途径)相似
•如果2个类只是相似而非相同,那么一旦对他们进行了很好的协调,就可以使用抽取超类
•如果可能的话,删除多余的类


不完整的库类
•症状:
–你正在使用一个库类,而且希望在该类上有某个特性,但是却未能如愿。如果这是一个正常的类,就可以加以修改;但是,由于这是库的一部分,因此可能无法修改也不希望对它有所改变。
•措施:
–查看类或库的所有者是否考虑将来增加你所需的支持。
–如果仅仅是一两个方法,则可以对库类的客户应用引入外来方法(Introduce Foreign Method)
–如果存在多个方法需要增加,则要应用引入本地扩展(Introduce Local Extension)。再进一步使用这个新的扩展类。
–可能会决定引入一层来覆盖这个库



数据类
•症状:
–类仅有字段构成,或者只有简单的赋值方法和取值方法构成
•措施:
–采用封装字段阻止对字段直接访问(仅允许通过赋值方法和取值方法进行访问)
–对可能的方法尽量采用移除设置方法(remove setting methods)
–采用封装集合(encapsulate collection)去除对所有集合类型字段的直接访问。
–查看对象的各个客户,如果客户试图对数据做同样的工作,则对客户采用抽取方法,然后将方法移到该类中。
–在完成上述工作后,可能发现类中存在多出相似的方法,使用诸如重命名方法、抽取方法、增加参数或者移除参数等重构技术,以协调签名,并消除重复
–对字段的大多数访问都不再需要,因为所移动的方法涵盖了其实际应用。因此可以使用隐藏方法来消除对赋值方法和取值方法的访问



拒收的馈赠
•症状
–subclass应该继承superclass的方法和字段,但是subclass只使用了superclass的部分方法和字段
–如果subclass复用了superclass的行为(实现),却又没有支持superclass的接口
–继承没有实际意义;子类并非父类的一个例子
•措施
–如果不会导致混淆,可以顺其自然
–如果找不出原因来共享某个关系,则采用将继承替换为委托
–如果父-子类确实有意义,则可以通过抽取子类、下移字段和下移方法来创建一个新的子类。令此类有非拒绝行为,并将父类的客户修改为该新类的客户,这样父类就不必再提及此特性了。还可以从原来的类以及其父类中去除这些被拒绝的方法。
•说明



过多的注释Comments
•症状:
–代码中出现注释符(//或/*)
•措施:
–抽取方法
–重命名方法
–引入断言
•其他说明:
–有些注释是有用的,不能一概删除
•指出为什么需要以某种方式完成某项工作
•引用了并非显而易见的算法
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics