2011-02-23

Refactoring 345 - Form Template Method

Bad smell:
  • Duplicated code
使用時機:
  • 在兩個 subclass 裡的 method 做相似的事情,順序一樣,但內容不同。
方法:
  • 將做相似事情的區塊抽成 method,且 api 一樣,然後將主 method 拉到 superclass。

Before:
  • ChildA
    public class ChildA extends Parents {
    public void doSomething() {
    // do a1...
    // do b1...
    }
    }
  • ChildB
    public class ChildB extends Parents {
    public void doSomething() {
    // do a2...
    // do b2...
    }
    }
After:
  • Parents
    public class Parents {
    public void doSomething() {
    this.doA();
    this.doB();
    }
    public [abstract] void doA();
    public [abstract] void doB();
    }
  • ChildA
    public class ChildA extends Parents {
    public void doA() {
    // do a1...
    }
    public void doB() {
    // do b1...
    }
    }
  • ChildB
    public class ChildB extends Parents {
    public void doA() {
    // do a2...
    }
    public void doB() {
    // do b2...
    }
    }
繼承是消除 duplicated code 有效的方式。

當看到 subclass 裡有重複的 code 時,就可以將重複的 code 拉到 superclass 裡,但是當重複的 code 不是完全一樣時,尤其是步驟一樣,內容不一樣時,就可以使用 Form template method 將步驟拉到 superclass,讓 subclass 去實做細節,這就是 Design pattern 裡的 Template method。

沒有留言:

張貼留言