我们一起来读书吧 关注:154贴子:2,808
  • 0回复贴,共1

重构-改善既有代码的设计 第12章

只看楼主收藏回复

1. 函数上移:如果某个函数在各个子类中的函数体都相同,又可以通过某种形式的参数调整可以成为相同的函数,这时候就可以先分别对这些函数应用函数参数化构造出相同的函数,然后再提升他们。
2. 字段上移:去除重复的数据声明,也可以将使用该字段的行为从子类移至超类,从而去除重复的行为。
3. 构造函数本体上移:构造函数不同于一般函数,因为它被附加了特殊规则,重构会相对复杂,需要以工厂函数取代构造函数。使用移动语句将子类中构造函数中的公共语句移动到超类的构造函数中,确保子类调用超类的构造函数。
4. 函数下移:如果超类中的某个函数只与一个(或少数几个)子类有关,需要将其从超类中挪走。
5. 字段下移:如果某个字段只被一个子类(或者一小部分子类)用到,就将其搬移到需要该字段的子类中。
6. 以子类取代类型码:类型码字段是表现分类关系的一种工具。有些字段或函数只对特定的类型码取值才有意义,此时我可以创建子类,然后用字段下移把这样的字段放到合适的子类中去。
7. 移除子类:随着软件的演化,子类所支持的变化可能会被搬移到别处,甚至完全去除,这时子类就失去了价值。最好的选择就是移除子类,将其替换为超类中的一个字段。
8. 提炼超类:如果两个类在做相似的事,可以利用基本的继承机制把它们的相似之处提炼到超类。可以用字段上移把相同的数据搬到超类,用函数上移搬移相同的行为。
9. 折叠继承体系:在重构类继承体系时,经常把函数和字段上下移动。随着继承体系的演化,有时会发现一个类与其超类已经没多大差别,不值得再作为独立的类存在。此种场景就适合将超类和子类合并起来。
10. 以委托取代子类:如果一个对象的行为有明显的类别之分,继承是很自然的表达方式。可以把共用的数据和行为放在超类中,每个子类根据需要覆写部分特性。但继承给类之间引入了非常紧密的关系。在超类上做任何修改,都很可能破坏子类。这两个问题用委托都能解决。对于不同的变化原因,可以委托给不同的类。委托是对象之间常规的关系。与继承关系相比,使用委托关系时接口更清晰、耦合更少。
11. 以委托取代超类:有问题的继承可能会招致混乱和错误。如果把继承关系改为将部分职能委托给另一个对象,这些混乱和错误本是可以轻松避免的。使用委托关系能更清晰地表达“这是另一个东西,我只是需要用到其中携带的一些功能”这层意思。如果子类与超类之间的耦合过强,超类的变化很容易破坏子类的功能,可以使用以委托取代超类。总结就是,首先(尽量)使用继承,如果发现继承有问题,再使用以委托取代超类。


IP属地:北京1楼2024-08-16 14:26回复