2011年6月25日 星期六

Effective Java 讀書筆記: Item 2 - 用 Builder pattern 提供易用的選擇性參數

記錄讀書心得, 內容不一定和書上一致, 有些是我自己的看法。

當生成物件的選擇性參數過多時, 用 Builder pattern 會省事許多, 這篇 《Builder Pattern》 講得很清楚並附有範例碼。關鍵在於:
  • class A 的 builder class B 是 A 裡面的 static class
  • 利用 B 的 constructor 參數指定必要參數
  • 利用 B 的 member method 指定選擇性參數
  • 提供一個 build() 用來生成 A 並傳入之前存下來的參數
  • 若想寫得漂亮點, 可用個
    public interface Builder { public T build(); }
    然後讓 B 實作 Builder
之前找 java argument parser 時, 看到不少 lib 用類似的方式指定 argument 的參數 (像是 description, short name, type 等), 比方說 jopt-simple 最下面的範例。

在一些 mock lib 裡 (如 pymox) 也會看到類似的寫法, 用 method 串接的方式設定過多的選擇性參數。還在揣摩這種寫法的優缺點, 大概等自己實際用上一次後, 才會體悟得較深。

書中有一句關鍵的描述:
The Builder pattern simulates named optional parameters.
讓我想到一個有趣的議題: design patterns 其實是補足語言缺陷的產物。之前有看過一些很有深度的對照文或影片, 忘了記下來。剛才找到的一個例子是, 幾年前讀 Effective C++ 時, 看到一堆管 memory 的準則, 當時不太想學, 覺得有 garbage collection 的話就沒這問題, 自然也不需要發展出這些技巧。如同其它各種技術爭議一般, gc vs. 自己管記憶體? 這議題的標準答案當然是: 看情況。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...