2008年10月14日 星期二

R14 工程首重精確(2)──依意義作設計

每一個元件、每一個方法、每一行程式都應該依需求或設計原有的意義安排,一方面是為了精確地做到應做的動作,另一方面則是為了讓所有看到程式碼的人立即看得出關聯。

某天同事提出一個設計問題:傳入一個一定是偶數的整數,要作出+1-2+3-4+5-6……(數量與傳入的整數相同)。我的作法是採用迴圈依需求逐一地照算式運算,不過同事說最佳的設計是將算式化成(+1-2)+(3-4)+(5-6)……最後成為-1 * (n / 2)的精簡計算。當然用後者的方式是最佳化的設計,但如果沒有任何說明時其他的人根本不知道原來的需求是什麼;如果想法經過轉換則應該註明變化的經過才不致於無人理解。

在系統的設計中我們時常需要取得User ID這個變數,但是在執行交易的時候可能用數種不同的方法都能取得(例如從最底層的Map直接取得,或是用包裝好的API取得),這時應該規定在不同的層次時使用固定的對應拿法。動作的設計也應該先釐清所屬層次定義對應的方法,同時在動作的組合時一樣放在應該放的地方。

try {
 Thread.sleep(1000);
 MyAPI();
} catch (Exception e) {
}
同事在寫這段程式的時候,我建議他把MyAPI()搬出到最後。雖然sleep()在我們的經驗裡從來沒有拋出過例外,感覺上寫在外面或是裡頭對於執行完全沒有影響,但是在意義上是應該寫在外面的。同事同意了我的說法而作了修改。

系統的建立就是這樣,當想法逐步變成產出的同時,一層一層地精確鋪設出該有、該做的輸出,這是良好設計的初步。

沒有留言:

張貼留言