l

2013年8月22日 星期四

重新整理Template Method Pattern

August 16 19:50~21:34

螢幕快照 2013-08-16 下午9.31.55

 

今天介紹Template Method模式,這是一個規範如何妥善透過繼承以達到重複使用程式碼以及提供擴充行為的模式。雖然物件導向程式語言提供繼承的功能,但是透過繼承達到程式碼重用原本就不是一件值得鼓勵的事情,所以GoF的書中才提到「favor object composition over class inheritance」。

Template Method滿足了「Narrow Inheritance Interface Principle」。這個原則告訴鄉民們,一個物件的行為如果分散在好幾個不同的方法上面,則子類別需要覆寫父類別方法的數量要越少越好。否則子類別任意覆蓋父類別的方法,會讓程式變得很難理解。

接下來看整理後的結果。

***

Name:Template Method

Context:透過繼承的方式可以達到到讓子類別重複使用父類別的程式碼,同時允許子類別覆寫父類別的方法以提供差異化的行為。

Problem:要如何表達擁有共同結構與行為,但卻有著些微行為差異的物件們?

Force:

  • 為了提供差異行為,如果讓子類別任意覆寫父類別的方法,則:
    • 父類別與子類別以及不同的子類別之間可能會存在重複程式碼。
    • 繼承架構所形成的程式碼將會不容易被理解。
  • 雖然將共同不變的行為定義在父類別之中可以達到重複使用程式碼的目的,若未加以特別區隔則子類別還是可能在有意或無意的情況下覆寫定義在父類別中的共同行為。

Solution:在父類別中定義一個範本方法(template method)用以規範共用的行為。Template method將其執行過程委託給數個hook method來完成,子類別可藉由覆寫這些hook method來達到提供不同行為的目的。可將宣告成靜態template method以避免子類別將其覆蓋。

***

友藏內心獨白:10/23,完成率43.48%。

1 則留言:

  1. "透過繼承達到程式碼重用原本就不是一件值得鼓勵的事情" -> 這句話要看我們所使用的語言特性而定。:-)

    對於動態型別語言而言(smalltalk, ruby, python...),繼承帶來的兩件事情:
    1. 規格繼承
    2. 實作繼承

    第一項並沒有太大意義,因為訊息傳遞本就是執行期才確認物件是否可接收,所以使用繼承時往往就是需要繼承某些實作。但由於繼承過度,容易有複雜的網絡關係,所以有的語言限定單一繼承(smalltalk),有的採用受限的多重繼承 - mix-in(ruby),有的允許多重繼承,並假設programmer足夠成熟(python)。

    當然,靜態型別語言強調不要濫用繼承來獲得實作是對的,因為在這種執行環境中,繼承是為了多型的手段。

    回覆刪除