設計模式系列·王小二需求歷險記(二)

子路發表於2017-03-28

0x1 原文再續,書接上回

上回說到,C哥憑藉自己多年的編碼經驗,欲傳授王小二絕世武功。
讓我們書接上回。

0x2 來源於生活中的例項

看著王小二求知若渴的眼神,C哥開始對小二循循善誘。

“小二啊,我們假設一個場景:假設你是一名講師,對於上完你課程的人,你要確保接下來,每個人都知道他們下一節課去哪上。你如何去做呢?”

“嗯...我會在教室門口貼一張課表。課表上標明所有的課程以及課程對應的教室。讓學生們自己根據課表去找就行了。”

設計模式系列·王小二需求歷險記(二)

“不錯!小二很聰明嘛。但是如果把這個場景轉換為程式實現,你起初可能就不會這樣設計了”。

“為什麼?”小二睜大眼睛問道。

“因為面對需求,你首先想到的是過程化的解決辦法。比如在你設計傳送訊息的需求的時候,就是典型的過程化的思維模式。上面那個講師的場景,你轉換成程式可能會這麼做:

  1. 獲得課堂上每個人的名單;
  2. 對於名單上的每個人:
    a.查詢他的下一節課程;
    b.查詢他的下一節課程的地點;
    c.告訴他去哪裡上下一節課。

為了實現上面的過程,你可能需要:

  1. 獲得課堂上每個人名單的方法;
  2. 獲得每個人課表的方法;
  3. 獲得每個課程對應的教室的方法;
  4. 告訴學生去相應教室上課的方法;
  5. 一個控制程式為每個人做需要的步驟。”

王小二沉思了一會,若有所思的點點頭:“嗯,確實會這麼做”。

0x3 趁熱打鐵·責任的轉移

設計模式系列·王小二需求歷險記(二)

“小二啊,上面我們說了兩種解決辦法。你覺得這兩種解決辦法哪種更好些呢?”C哥問道。

“當然是第一種了,現實生活中我可不會傻到自己挨個去查學生的課表,地點,然後挨個告訴學生,那多累啊。”

“是啊,肯定是第一種解決辦法好。其實,你仔細想想,這兩種解決方式,最大的不同點是哪裡?”

“嗯...想不出來。”

“最大的不同點,是責任的轉移。你看第一種解決辦法,你只需要把課表張貼出來,學生自己去查詢課程、教室就行了。完成這件事情,既有老師的責任,也有學生的責任。而第二種方法,從頭到尾都需要老師去做,責任都在老師身上。”

“每個人的責任邊界劃分的很清楚,每個人都對自己的事情負責,各司其職。這也就是我們常講的低耦合。這樣的程式碼很好維護、擴充套件,當需求有所改變時,我們就能很好的去應對。你好好想想是不是...”

0x4 傳送訊息的重新設計

C哥提到,一種方式是程式導向,一種方式是物件導向。
兩種方式最大的不同就是責任的轉移。

王小二若有所悟,決定重新設計下傳送訊息的那個需求。

按照小二的想法,傳送訊息需要如下類(或實體),才能實現責任的界定、轉移。從而將程式解耦。

小二先把類圖設計了出來。

設計模式系列·王小二需求歷險記(二)

設計完畢,頓時覺得思路清晰了好多。

用物件導向的方式去實現這個需求,如何實現呢?

  1. 開始控制程式;
  2. 對相應的vip使用者做初始化;
  3. 告訴相應的vip使用者,傳送資訊;
  4. 每個vip使用者:
    a.確定自己要傳送什麼型別的訊息(簡訊、微信、email...)
    b.傳送訊息

如此,就實現瞭解耦。真是能量滿滿。

0x5 再也不怕需求變了

根據上面的設計,小二又用相應的程式碼進行了實現。
“需求愛咋變咋變,這次不怕了,哈哈”,小二竊喜道。

比如,現在需求變化了。

產品經理說:"需要給年Vip使用者傳送簡訊、郵件。其他Vip使用者不變"。

王小二想到:“哈哈哈哈哈,需求隨便改,我終於不再需要改那一大坨程式碼了,我只需要改年Vip使用者的類就可以了。”

如圖,需要改一個地方,其他地方不會有任何影響。

設計模式系列·王小二需求歷險記(二)

看,經過一番設計之後,就是這麼的靈活、有魅力。

更多精彩,請關注公眾號“聊聊程式碼”,讓我們一起聊聊“左手程式碼右手詩”的事兒。

設計模式系列·王小二需求歷險記(二)

相關文章