2009年6月17日 星期三

W15 令人感到麻煩的設計(16)──固定值與固定常數的意義

在設計與實作的時候,所有的固定數值與字串都應該被抽取為常數,使用的時候就將固定數值與字串置換為該常數。原本我也依這個方式使用常數,但是不久前製作計算function points工具程式時卻發現不同的用法。

上下傳電文欄位是功能點計算的來源之一,第一個專案的電文定義檔命名規則是在交易代號後加上u或d來表示,因此將上下傳檔名另外用常數代表,取檔時就使用txnNo+UPLOAD_FILENAME+".xml"來組成完整檔名。程式拿到第二個專案就發生了錯誤,因為檔名是以別的名稱識別,只好直接修改常數內容讓程式可以正常執行。

依照事對物的想法,有UPLOAD_FILENAME的存在就應該對應存在一個getUploadFilename()的事存在,之前在檔名裡直接嵌入UPLOAD_FILENAME的作法是一種綑綁。"取得上傳的檔名"應是一件事,其中包含的是一種規則,雖然在大多數的情況下規則是直接取得UPLOAD_FILENAME,但是規則總有變的一天,將改變的規則限定在一個給定的方法裡可以增加設計的彈性。

那個工具程式後來作了一個改變:收集所有在專案裡可能有所不同的規則,定義一個Interface容納取得那些規則的方法,看要執行哪一個專案的內容就使用該專案特有的規則定義。

得到了寶貴的經驗:每個常數都應該轉換為具有該層級元件意義的名稱與存取方法,以便操作時明白其含義。呼叫時可直接在參數裡引用常數,但是在取用時要使用存取方法,因為取用時隱含規則,規則都可能改變。

沒有留言:

張貼留言