《31天重构》4:下置方法
2010-07-04 21:56
148 查看
下置方法,与上一篇文章中的提升方法到父类中是相反的做法。显然,原因也应该是出于相反的考虑。当在继承族中父类的某个方法仅仅对某个特殊的子类有意义,而对于其他子类并不是必须的,那么这个方法就应该被下置到需要这个方法的特殊子类中,而不是存在于父类而让其派生类都拥有这样的方法。
重构前的代码例子如下:
我们知道,Cat 类并不会像 Dog 类那样 bark() 即吠,这个方法应该是 Dog 类特有的,不应该存在于父类而对所有子类可见,重构只需要将其移至 Dog 类,如下:
可能有人会觉得可以在重构前的代码中位 Cat 类中的 bark() 进行空实现,同样不影响 Cat 类的使用。但是,在一个类中空实现一个不关紧要、不必需的方法似乎没什么意义,这样会增大子类和父类之间的耦合。如果真的想要让 Cat 类也能够发出声音,那么可以设计一个专门标识 Animal 发出声音的 interface ,如 MakeNoise 接口,让想要发出声音的 Animal 子类实现它即可。这样子就可以将原来 Animal 抽象类中的一个依据不同子类有不同实现的功能给分离开来了。
同样,这个重构方法还是需要我们辨清各个类的职责、功能所在,避免为了子类的诸多功能而设计出一个臃肿的父类,更糟糕的是在继承族中造成不少不良影响。
原文链接如下:
http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/04/refactoring-day-4-push-down-method.aspx
重构前的代码例子如下:
abstract class Animal { // some methods public abstract void bark(); } class Dog extends Animal { @Override public void bark() { // code } } class Cat extends Animal{ @Override public void bark() { // code } }
我们知道,Cat 类并不会像 Dog 类那样 bark() 即吠,这个方法应该是 Dog 类特有的,不应该存在于父类而对所有子类可见,重构只需要将其移至 Dog 类,如下:
abstract class Animal { // some methods } class Dog extends Animal { public void bark() { // code } } class Cat extends Animal{ // some methods }
可能有人会觉得可以在重构前的代码中位 Cat 类中的 bark() 进行空实现,同样不影响 Cat 类的使用。但是,在一个类中空实现一个不关紧要、不必需的方法似乎没什么意义,这样会增大子类和父类之间的耦合。如果真的想要让 Cat 类也能够发出声音,那么可以设计一个专门标识 Animal 发出声音的 interface ,如 MakeNoise 接口,让想要发出声音的 Animal 子类实现它即可。这样子就可以将原来 Animal 抽象类中的一个依据不同子类有不同实现的功能给分离开来了。
同样,这个重构方法还是需要我们辨清各个类的职责、功能所在,避免为了子类的诸多功能而设计出一个臃肿的父类,更糟糕的是在继承族中造成不少不良影响。
原文链接如下:
http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/04/refactoring-day-4-push-down-method.aspx
相关文章推荐
- 31天重构学习笔记7. 重命名(方法,类,参数)
- 31天重构学习笔记22. 分解方法
- 31天重构学习笔记13. 提取方法对象
- 31天重构学习笔记3. 提升方法
- 31天重构学习笔记28. 为布尔方法命名
- 31天重构学习笔记7. 重命名(方法,类,参数)
- 31天重构学习笔记28. 为布尔方法命名
- 31天重构指南之二十二:分解方法
- 31天重构指南之十:提取方法
- 31天重构学习笔记28. 为布尔方法命名
- 31天重构学习笔记7. 重命名(方法,类,参数)
- 31天重构学习笔记22. 分解方法
- 31天学习重构(java)---2. 移动方法
- 31天重构学习笔记22. 分解方法
- 《31天重构》2:移动方法
- 31天重构指南之十三:提取方法对象
- 31天重构学习笔记22. 分解方法
- 31天重构学习笔记13. 提取方法对象
- 31天重构学习笔记2. 移动方法
- 31天重构学习笔记10. 提取方法