第十四章-組織直線碼
讓相依性明顯可見
/* 看不出相依性的例子. */
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 則回應:
感謝分享,這本書蠻貴的,暫時還買不起,先看心得來了解了解