2014年3月31日 星期一

設計模式的解析與活用 (一) 物件導向範型

從例子開始說明吧!!

講師與學生,老師的責任就是讓學生知道下堂課要去哪上課
所以老師應該會
  1. 獲取聽課名單
  2. 針對每個人
  3. 找到每個人要去聽的課
  4. 找到聽課的地點
  5. 找到前往路徑
  6. 告訴他們
但是實際上真的是這樣嗎?

實際上應該是老師貼一張課表給學生自己去看吧
其實這個行為就是責任轉移,讓學生去負責自己的行為

這兩種作法的差別在哪?

第一種方法講師必須關注許多細節,因為所有的事情都由講師負責
第二種方法講師只負責告知,接著學生負責前往所屬課堂

第二種方法的好處在於

假設今天增加了助教研究生,助教需要在下堂課前收集本堂課的學生對課程的評價
對講師來說依然只需要告訴學生下堂課的位置,學生各自會負責該做的責任,研究生會蒐集評價並前往下堂課,普通學生會前往下堂課,翹課的學生會自行翹課….etc

各司其職(負責自己的責任)

第二種方法有以下三個方面不同

  1. 人們對自己的行為負責
  2. 講師將不同類型的人(普通學生&研究生),一視同仁,把他們都視為學生,並且告知他們必須前往下一堂課
  3. 講師不需要知道學生如何前往下一間教室
用術語來說明的話就是

概念-軟體要負責甚麼
規約-怎麼使用軟體
實作-軟體怎麼履行責任

講師要負責甚麼 ClassRoom  getnextClassRoom()  取得每個學生的課堂
學生必須做甚麼 gotoNextClassRoom(ClassRoom room) 
研究生必須收集資料並且前往下堂課
普通學生必須前往下堂課

對講師來說他只需要負責告知的動作
普通學生與研究生會負責自己該負責的責任


封裝的概念

講師不知道哪些是一般學生,哪些是研究生,對講師隱藏了學生的類別(也就式封裝了學生)
雖然學生都是前往下堂課堂,但是行為卻不同

封裝的好處
  • 使用者不需在操心實作的部分,使用者只需要知道想要做甚麼,剩下的交由被呼叫者去處理
  • 可以在不考慮呼叫者的情況下實作(testable)
  • 其他物件對該物件內部是未知的,例如講師呼叫gotonextClassRoom,但是講師並不知道普通學生、研究生實際做了哪些事情

其實這個例子用到了LSP,以及DIP

普通的學生和研究生都是學生,都擁有學生的行為,例如前往下堂課,姓名,學號之類的
LSP-繼承自學生的物件必定擁有學生的行為

講師告訴學生必須前往下堂課,但是他並不知道是告訴研究生還是普通學生
DIP-細節依賴於抽象,講師只呼叫gotoNextClassRoom,學生會自己依照他們的類別,做他們該做的事情,物件只在概念上耦合,在實踐並不耦合

最後,要稍為推薦一下設計模式的解析與活用這本書,雖然目前也只看了一個章節,不過真覺得獲益良多阿!







沒有留言:

張貼留言