5/04/2006

Effective Java Ch7.



Chapter 7. General Programming

主要討論JAVA語言的基本要素與具體細節.


條款29: 將區域變數的作用域(scope)最小化

說真的, 看到這翻譯出來的標題, 我的感覺是:"翻的真硬" ...

這標題內含的道理, 大家都知道, 就是"在變數第一次被使用的時候才宣告", 不過真的要說出優缺點是什麼, 好像卻又沒辦法說的那麼頭頭是道、大家點頭稱讚.

將區域變數作用域(scope)最小化的最有效技巧是在變數第一次被使用時才宣告它.
如果你在變數被使用之前就先宣告, 只會造成混亂, 造成程式碼閱讀者的分心. 而一旦真正到了變數要被使用的時候, 閱讀者已經不再記得變數的型別與初始值.
如果程式經過演化而變數不再被使用, 程式員也可能因為變數的宣告遠離其第一次被使用點而忘記刪掉它們.
如果一個變數意外的在"它被希望使用"的區段之前或之後被使用, 有可能導致災難發生.


其實現在的Tool越來越好用, 追查變數的來龍去脈已經很容易. 但畢竟程式碼是人寫的, 從人性的角度看來, 也的確是這樣.
更重要的是 ... 一個變數意外的在"它被希望使用"的區段之前或之後被使用, 有可能導致災難發生. 有哪個工程師沒有花時間在Debug這樣的問題? 一定很多經驗吧 ... ^_^



這篇文章很有趣的地方, 是以這個標題為主, 比較了for與while的差別.

如果迴圈變數的內容在迴圈結束之後不再有用, 那麼請儘量選用for而捨棄while迴圈.

Iterator i = c.iterator();
while (i.hasNext()) {
doSomething(i.next());
}

Iterator i2 = c.iterator();
while (i.hasNext()) { //BUG
doSomething(i2.next());
}

有"剪貼"錯誤.
如果使用for迴圈, 犯下類似"剪貼"錯誤的可能性比較小, 因為你不需要在兩個迴圈中使用不同的變數名稱.
兩個迴圈完全獨立, 因此重複使用迴圈變數名稱, 不會帶來傷害. 事實上, 這是很流行的寫法.
for迴圈的寫法比while迴圈少一行, 有利於整個函式被塞入編輯視窗中, 增強可讀性.


好啦, 我犯過這種剪貼錯誤啦, 因為有時候真的很懶 ... 但是作者說的是對的, 重複使用迴圈變數名稱, 不會帶來傷害.
不過那個什麼"for迴圈的寫法比while迴圈少一行", 我簡直笑翻了 ... 是是是, 作者您說的是.

最後說到一個很重要的觀念 : "將區域變數的作用域(scope)最小化"的最後一個手法是令函式小而集中, 這不就與一般OOAD的精神一致?


^_^

0 意見: