2008年5月1日 星期四

漫談樣式

大家都知道設計樣式(Design Patterns)。為甚麼要叫做樣式呢?為甚麼23個樣式要寫成那麼大一本書呢?為甚麼不是一篇寫成"物件導向設計的23個快速技巧"的文章,用幾頁的篇幅介紹就好?

其實一個樣式告訴我們的不只是一個技巧。書中很大的篇幅在說明

  1. 這個技巧適用於哪些場合,不適用於哪些場合
  2. 哪些情況也許寧願考慮使用另一個樣式,或是跟其他樣式合併使用
  3. 這個樣式除了帶來好處,卻也帶來哪些副作用
其實濫用樣式會造成災難,並不是知道這樣的技巧就要儘管用。用得適當才是王道。所以要知道這23個技巧很快,但是要深入了解這23個樣式,我個人認為是非常困難的。

樣式對於個人提昇軟體開發的功力,有什麼重要性呢?有一篇有趣的文章用學下棋的歷程來做比喻︰

初學下西洋棋,要先學規則。每個棋子的名字、移動的方式、吃對方棋子的規則等等。這時雖然會下棋,但是技巧不好。隨著熟悉度的進步,他開始學西洋棋的原理。棋子間相互的價值、棋盤各個位置的戰略地位、如何善用王、如何換子取得勝利等等。(抱歉我不會下棋,翻譯轉述一定有問題。)這時他棋下得不錯了。不過要成為高手,他要學大師的棋局。在棋譜或是過去的重要棋局中,有許多樣式。必需要理解、記憶、熟練這些樣式。

學寫程式也是一樣。初學者學程式語言、SQL、資料庫、網頁等。這時他也許只適合寫基本的程式。再來他會學設計原理:繼承與多型、降低耦合等等。這時他有物件導向的概念。但是要成為真正的高手,必須學其他大師的設計。這些設計中萃取出的樣式可以再應用在其它設計中。所以需要了解、記憶、熟練這些樣式,直到它成為第二本能。

(文中說這個下棋的類比是Robert. C. Martin提出的,但是我找不到原始的文章。)

樣式還有另一個作用,就是溝通上提供共同的語彙。我們不用費力地說"在資料夾跟檔案上再抽象出一個父類別,資料夾的子成員的類別一定是這個父類別,然後..."等等。我們只要說"這裡用composite pattern,檔案就是leaf"。如果大家都學過design patterns就都立刻了解你的意思。

沒有留言: