程式碼才是最好的註釋
一直以來都存在程式碼註釋的作用的討論。很多人認為註釋是不必要的,寫註釋那是因為程式碼可讀性太差了。我也同意這個原則。如果必須新增註釋,我覺得可以新增一些解釋程式碼為什麼,而不是做什麼的註釋。下面我舉個例子說明該如何除去程式碼中的註釋。
我們直接看程式碼,下面的程式碼是我要對註釋進行清除的例子。(這段程式碼只是作為一個例子,沒有做過多的考慮。)
1 public String recommendGift(double budget){
2 // get gifts from helper
3 String[] gifts = giftHelper.getGifts();
4 String gift =null;
5
6 for (int i =0; i < gifts.length; i++) {
7
8 gift = gifts[i];
9
10 // find out if gift already given
11 boolean isAlreadyGiven =false;
12 for (String given : giftsGiven) {
13 if(gift.equals(given)){
14 isAlreadyGiven =true;
15 break;
16 }
17 }
18
19 // calculate rating and budget
20 int x = rating *200;
21 boolean ok = budget < x;
22
23 // if both conditions satisfy, give it.
24 if(!isAlreadyGiven && ok){
25 giftsGiven.add(gift);
26 // increment maintenance cost of the girlfriend
27 maintenanceCost += budget;
28 return gift;
29 }
30 }
31
32 return gift;
33 }
這段程式碼是相當簡單的。從禮物清單中挑選出不在已贈送的禮物列表中的而且不超過預算的第一份禮物。這段程式碼有如下幾個問題:
1、方法過長
2、這個方法做的事情太多
3、可讀性差,即使加了註釋
4、註釋告訴我們程式碼是幹什麼的,這些應該是程式碼自己的事情才對。
讓我們開始整理一下這段程式碼。
首先,看下面程式碼段,非常明顯,這些程式碼註釋是不必要的。這種程式碼註釋我們應該避免。它並沒有提高程式碼的可讀性,事實上起到了相反的效果。
// get gifts from helper
String[] gifts = giftHelper.getGifts();
接著,我將下面帶註釋的程式碼移動到一個分離的方法中。方法的命名可以來自給出的註釋。
// find out if gift already given
boolean isAlreadyGiven =false;
for (String given in giftsGiven) {
if(gift.equals(given)){
isAlreadyGiven =true;
break;
}
}
修改後的程式碼:
private boolean isGiftNotAlreadyGiven(String gift) {
boolean isAlreadyGiven =true;
for (String given in giftsGiven) {
if(gift.equals(given)){
isAlreadyGiven =false;
break;
}
}
return isAlreadyGiven;
}
然後按照相同的方式繼續下去,最終的程式碼如下:
public String recommendGift(double budget)
{
String recommendedGift =null;
for (String gift in giftHelper.getGifts())
{
recommendedGift = gift;
if(isGiftNotAlreadyGiven(recommendedGift)&&isUnderBudget(budget))
{
updateMaintenanceCostAndGiftsGiven(budget, recommendedGift);
return recommendedGift;
}
}
return recommendedGift;
}
privatevoid updateMaintenanceCostAndGiftsGiven(double budget, String gift)
{
giftsGiven.add(gift);
maintenanceCost += budget;
}
private boolean isUnderBudget(double budget)
{
int x = rating *200;
boolean ok = budget return ok;
}
private boolean isGiftNotAlreadyGiven(String gift)
{
boolean isAlreadyGiven =true;
for (String given in giftsGiven) {
if(gift.Equals(given)){
isAlreadyGiven =false;
break;
}
}
return isAlreadyGiven;
}
這裡有幾件需要注意的事情:
1、一個大方法按照它的功能被分割成幾個小方法,這樣程式碼就比較容易閱讀了。
2、每個方法大概4到5行,非常理想!
3、註釋去掉了,但是目的卻達到了。用程式碼來代替了註釋。
譯自:Better way to comment.. code it.
譯者說明:
1、文章的那段程式碼很有特色,正在戀愛的男程可以試一下程式碼裡面的方法。
2、確實用程式碼來代替了註釋。
3、從文章可以看到這段程式碼的演變主要是將註釋變成了函式名和變數名。
4、對於老外來說,英文和程式碼類似,所以這樣做就非常受用,透過看函式名,變數名就能明白函式的功能,Clean Code書中也是這樣建議的。
5、對我們來說第一語言是中文的,英語不好情況就不一樣了,這就是為什麼國人的建議大多要求註釋詳盡,讓程式碼更易讀易懂;而老外的建議幾乎是儘可能的少。
6、我建議符合我們的國情:儘可能多的註釋。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1978/viewspace-2808915/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 有趣的程式碼註釋
- CSS程式碼註釋CSS
- php程式碼註釋PHP
- 註釋程式碼的13技巧
- 請停止程式碼註釋
- javascript如何註釋程式碼JavaScript
- AnyForWeb告訴你什麼才是“最好的”程式語言Web
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- Oracle PL/SQL程式碼中的註釋OracleSQL
- 9個最有趣的程式碼註釋
- HTML 程式碼註釋規範HTML
- Java程式碼註釋規範Java
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- 如何優雅地寫註釋:找到程式碼註釋的黃金平衡點
- 竟有如此沙雕的程式碼註釋!
- 10個最“優秀”的程式碼註釋
- java中程式碼的註釋和快捷鍵Java
- 遠離程式碼註釋的 5 個理由
- 請註釋你那該死的程式碼
- 五種應該避免的程式碼註釋
- Pycharm 程式碼註釋風格模板PyCharm
- jvm執行程式碼註釋部分JVM行程
- 改變Emacs下的註釋程式碼方式以支援當前行(未選中情況下)的註釋/反註釋Mac
- 軟體開發:合適的才是最好的
- 如何把程式碼中的註釋批次刪除
- 匹配css程式碼註釋的正規表示式CSS
- 8個最沒有意義的程式碼註釋
- 程式碼註釋中的5要與3不要
- 趣味橫生的程式設計師搞怪程式碼註釋程式設計師
- iOS 註釋方法大全 程式碼塊加快捷鍵自定義註釋iOS
- 把Mybatis Generator生成的程式碼加上想要的註釋MyBatis
- 碼農深耕 - 什麼樣的程式碼才是好程式碼?
- 註釋 · 佛祖保佑程式碼永無BUG
- PHP搞笑註釋程式碼-佛祖配美女PHP
- 谷歌輸入法PinyinIme 程式碼註釋谷歌
- 使用GhostDoc為程式碼生成註釋文件
- 體面編碼之程式碼註釋評論
- 程式的版式和註釋