避免代碼注釋的五大理由
代碼注釋的作用一直以來都被程序員們廣泛討論。很多人認為注釋不是必要的,寫注釋那是因為代碼可讀性太差了。原文作者 Paulo Ortins 發(fā)表了博文《5 reasons to avoid code comments》,以下為譯文:
通常,我們閱讀代碼比編寫代碼花費的時間要更多。雖然我從未見過任何科學(xué)研究能夠證明這一點,但是在軟件領(lǐng)域,它就好比一個教條或者信念如此的根深蒂固。因此編寫易于閱讀的代碼就顯得尤為重要。程序員可以通過一些技術(shù)來實現(xiàn)它,其中一點就包括代碼注釋。
關(guān)于代碼注釋的文章,網(wǎng)絡(luò)上有很多討論。我們應(yīng)該使用注釋來解釋代碼嗎?還是應(yīng)該注重編寫表達式代碼而無需閱讀注釋?Joe Kunk 曾發(fā)表過一篇文章《To Comment or Not to Comment》其中有段內(nèi)容是說所謂的好代碼是指我們應(yīng)該避免注釋,因為注釋通常是用來解釋/隱藏惡意代碼。
下面就來討論下避免寫代碼注釋的五大理由:
1. 程序員更加傾向于鼓勵”壞“代碼。
有一種說法,有代碼注釋的就是好代碼,因此,程序員經(jīng)常在代碼邊上寫注釋,使其看起來更加出色。如果我們把代碼注釋當(dāng)做一種信號,那么也許我們正在編寫壞代碼。每當(dāng)我們寫注釋時應(yīng)該思考如何使代碼看清來更加潔凈。
2. 花費更多時間來編寫和維護
如果注釋沒有跟隨代碼的變化而變化,即使是正確的注釋也沒有用。注釋通常作為代碼的第二個版本。當(dāng)為某個函數(shù)寫注釋時我們需要不斷的重復(fù)自己,這就違反了 DRY (Don’t Repeat Yourself) 原則。花費時間來增加復(fù)雜性,軟件需求改變了,代碼也隨之跟著變化。如果我們寫注釋,這就意味著必須去維護注釋。因此,除非是很必須要,否則我們應(yīng)該拒絕在注釋上花費雙倍時間,相反我們可以利用這些時間來提高代碼的質(zhì)量或開發(fā)新的特性。
3. 注釋不是測試/驗證
修改代碼可以依賴工具,比如使用編譯器、IDEs 及單元測試;而注釋卻不能。注釋沒有這些工具,你無法依賴工具或者單元測試在正確的地方或者過期后來確保它們的正確性。一旦你寫了注釋,沒有測試模塊來驗證它的正確性,一旦這個注釋失敗了,那么它就永遠的失敗了。
4. 注釋沒有代碼文檔可靠
通常,注釋過期后,它們往往與代碼失去了連接性。程序員閱讀這些注釋或許被“欺騙”了。即使不斷的更新了代碼注釋,唯一了解的是這個代碼應(yīng)該是什么以及它的可讀性。舉個例子,如果老本問我們?nèi)绻椖堪l(fā)生了更改,我們從哪能看出?是代碼還是注釋?——答案當(dāng)然是代碼。
5. 代碼注釋風(fēng)格填補了屏幕空間
采用標(biāo)準(zhǔn)化的注釋尤為重要,某些注釋標(biāo)準(zhǔn)(如同下面)使用了很多行,這就要求你盡可能多的閱讀更多代碼。
- $string =
- “Lorem ipsum dolor sit amet, consectetur
- adipiscing elit. Nunc ut elit id mi ultricies
- adipiscing. Nulla facilisi. Praesent pulvinar,
- sapien vel feugiat vestibulum, nulla dui pretium orci,
- non ultricies elit lacus quis ante. Lorem ipsum dolor
- sit amet, consectetur adipiscing elit. Aliquam
- pretium ullamcorper urna quis iaculis. Etiam ac massa
- sed turpis tempor luctus. Curabitur sed nibh eu elit
- mollis congue. Praesent ipsum diam, consectetur vitae
- ornare a, aliquam a nunc. In id magna pellentesque
- tellus posuere adipiscing. Sed non mi metus, at lacinia
- augue. Sed magna nisi, ornare in mollis in, mollis
- sed nunc. Etiam at justo in leo congue mollis.
- Nullam in neque eget metus hendrerit scelerisque
- eu non enim. Ut malesuada lacus eu nulla bibendum
- id euismod urna sodales. “;
- $compressed = gzcompress ($string);
- echo “Original size: “. strlen ($string).”\n”;
- /* 輸出原始大小
- Original size: 800
- */
- echo “Compressed size: “. strlen ($compressed).”\n”;
- /* 輸出壓縮后的大小
- Compressed size: 418
- */ // 解壓縮 $original = gzuncompress ($compressed);
PS:本文所說的“避免代碼注釋",并不是說就不寫代碼注釋,而是盡量避免去寫代碼注釋,假如你認為值得也可以這么做。