軟體建構之道 (Code Complete) 第二版 第十四章到第十六章心得

軟體建構之道

第十四章-組織直線碼

讓相依性明顯可見

/* 看不出相依性的例子. */
loadPlayerList();
caculatePlayerAvgHeight();
caculatePlayerAvgWeight();
...

以上程式碼,首先從檔案或資料庫載入球員名單,再算出球員的平均身高跟體重. 如果沒有先執行 loadPlayerList(),那根本沒有辦法算出平均身高跟體重. 對於閱讀的人也不是那麼容易看出相依性的關係.

/* 利用 傳入參數常式命名 讓下一個倒楣的 RD 看出相依性關係. */
List thePlayerList = initPlayerList();  // 使用 init 前置命名.
caculatePlayerAvgHeight(thePlayerList);  // 一定得要有一份球員清單.
caculatePlayerAvgWeight(thePlayerList); // 一定得要有一份球員清單.
...

若真的無法使用比較好的技巧來顯示出相依性 - 最後最後再動用註解.
ex: 在 caculatePlayerAvgHeight() 前附註,使用此方法前必需先呼叫 loadPlayerList().

使用 "接近法則" 來排列陳述式

theBreakfast.getPrice();
theLunch.getPrice();
theDinner.getPrice();
theBreakfast.getCalories();
theLunch.getCalories();
theDinner.getCalories();
theBreakfast.getProtein();
theLunch.getProtein();
theDinner.getProtein();

換成

theBreakfast.getPrice();
theBreakfast.getCalories();
theBreakfast.getProtein();

theLunch.getPrice();
theLunch.getCalories();
theLunch.getProtein();

theDinner.getPrice();
theDinner.getCalories();
theDinner.getProtein();

眼睛是不是比較舒服? 把相關的陳述式歸類在一起,不確定這樣編排對不對? 問你的眼睛就知道了.

第十五章-使用條件式

case 陳述式請避免省略 break

switch(theParam)
  case 1:
    boo();
    break;
  case 2:
    foo();
    break;
...

我知道這是超基本的東西,但我就碰到過. 所有流程看都沒問題,但就是有問題,最後找出來問題所在,也想順便把前輩找出來鞭一輪. 養成寫作好習慣,才不會犯這種基本錯誤.

盡量不要在 case 陳述式中利用 break 來操作流程

switch(theParam)
  case 1:
    boo(); // 如果 theParam = 1 就會執行 boo() 跟 foo().
  case 2:
    foo(); // 如果 theParam = 2 就只會執行 foo().
    break;
  case 3:
    gotoHell(); // 如果 theParam = 3 就會執行 gotoHell().
    break;
...

其他人得花時間去了解程式的邏輯,事後修改也可能發生預期外的錯誤. 若你想下地獄,自己去就好,不要推別人下去. Orz

第十六章-控制迴圈

小心使用 Break 和 Continue

請確定你知道 Break 和 Continue 的定義,要不請不要亂用. 使用太多 Break 或 Continue 也會增加迴圈的複雜度,請謹慎用之.

Break: 結束迴圈,程式繼續執行迴圈後的第一行.
Continue: 跳過此次迴圈,程式回到迴圈下次重覆的開始處執行.

什麼還是不懂? 請去翻書,一個好的程式設計師,不懂就去搞懂.

由內而外建立迴圈

以下引述:

先從具體處著手,一次考慮一樣東西,然後採由簡入繁的方式建立迴圈.

我覺得我亂說反而會誤導人(因為我寫迴圈都由外而內建立),大家去翻書看看,我覺得在面對複雜迴圈邏輯時,這是很好的寫作及思考方式.

這三章都在描述程式碼的流程,我只針對我比較有感覺(有慘痛經驗)或之前沒注意的部份寫心得.

1 則回應:

Unknown 提到...

感謝分享,這本書蠻貴的,暫時還買不起,先看心得來了解了解