程式碼才是最好的註釋
一直以來都存在程式碼註釋的作用的討論。很多人認為註釋是不必要的,寫註釋那是因為程式碼可讀性太差了。我也同意這個原則。如果必須新增註釋,我覺得可以新增一些解釋程式碼為什麼,而不是做什麼的註釋。下面我舉個例子說明該如何除去程式碼中的註釋。
我們直接看程式碼,下面的程式碼是我要對註釋進行清除的例子。(這段程式碼只是作為一個例子,沒有做過多的考慮。)
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
- 請停止程式碼註釋
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- Oracle PL/SQL程式碼中的註釋OracleSQL
- HTML 程式碼註釋規範HTML
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- 竟有如此沙雕的程式碼註釋!
- 如何優雅地寫註釋:找到程式碼註釋的黃金平衡點
- jvm執行程式碼註釋部分JVM行程
- 改變Emacs下的註釋程式碼方式以支援當前行(未選中情況下)的註釋/反註釋Mac
- 應該是最好的eggnog-mapper功能註釋教程APP
- 如何把程式碼中的註釋批次刪除
- 把Mybatis Generator生成的程式碼加上想要的註釋MyBatis
- exadata穩定不出問題才是最好的
- 碼農深耕 - 什麼樣的程式碼才是好程式碼?
- 註釋 · 佛祖保佑程式碼永無BUG
- apidoc利用程式碼註釋書寫文件API
- 體面編碼之程式碼註釋評論
- 使用Spring的註釋和反射讓程式碼更精簡Spring反射
- IDEA中修改程式碼中的註釋顏色Idea
- 【翻譯】編寫程式碼註釋的最佳實踐
- python程式註釋Python
- PHP程式碼常用註釋規範(PHP Doc)PHP
- 你寫註釋她幫你寫程式碼
- sublime text 多行程式碼註釋快捷鍵行程
- Visual Studio模板程式碼註釋小技巧分享
- 前端程式碼 註釋作者時間與目的前端
- Python程式碼註釋的一些基礎知識Python
- IDEA外掛:快速刪除Java程式碼中的註釋IdeaJava
- html檔案中的php程式碼被註釋掉的問題HTMLPHP
- 為什麼說程式碼註釋是程式設計師必備的技能?程式設計師
- 精益生產管理系統,適合的才是最好的!
- 什麼才是低程式碼開發?
- 如何真正寫好程式碼註釋 — 現代 JavaScript 教程JavaScript
- nodejs版本程式碼註釋率統計上新啦~~~NodeJS
- 將 Visual Studio .net 程式碼註釋 英文轉為中文
- 程式碼都寫不完,還寫個錘子註釋!