天天看點

代碼才是最好的注釋

 一直以來都存在代碼注釋的作用的讨論。很多人認為注釋是不必要的,寫注釋那是因為代碼可讀性太差了。我也同意這個原則。如果必須添加注釋,我覺得可以添加一些解釋代碼為什麼,而不是做什麼的注釋。下面我舉個例子說明該如何除去代碼中的注釋。

    我們直接看代碼,下面的代碼是我要對注釋進行清除的例子。(這段代碼隻是作為一個例子,沒有做過多的考慮。)

<a></a>

1 public String recommendGift(double budget){ 

2 // get gifts from helper 

3 String[] gifts = giftHelper.getGifts(); 

4 String gift =null; 

 6 for (int i =0; i &amp;lt; gifts.length; i++) { 

 8 gift = gifts[i]; 

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 &amp;lt; x; 

22 

23 // if both conditions satisfy, give it. 

24 if(!isAlreadyGiven &amp;amp;&amp;amp; 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)&amp;&amp;isUnderBudget(budget))

updateMaintenanceCostAndGiftsGiven(budget, 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 &lt; x;

return ok;

private boolean isGiftNotAlreadyGiven(String gift) 

if(gift.Equals(given)){

這裡有幾件需要注意的事情:

1、一個大方法按照它的功能被分割成幾個小方法,這樣代碼就比較容易閱讀了。

2、每個方法大概4到5行,非常理想!

3、注釋去掉了,但是目的卻達到了。用代碼來代替了注釋。

譯者說明:

1、文章的那段代碼很有特色,正在戀愛的男程可以試一下代碼裡面的方法。

2、确實用代碼來代替了注釋。

3、從文章可以看到這段代碼的演變主要是将注釋變成了函數名和變量名。

4、對于老外來說,英文和代碼類似,是以這樣做就非常受用,通過看函數名,變量名就能明白函數的功能,Clean Code書中也是這樣建議的。

5、對我們來說第一語言是中文的,英語不好情況就不一樣了,這就是為什麼國人的建議大多要求注釋詳盡,讓代碼更易讀易懂;而老外的建議幾乎是盡可能的少。

6、我建議符合我們的國情:盡可能多的注釋。

本文轉自麒麟部落格園部落格,原文連結:http://www.cnblogs.com/zhuqil/archive/2010/10/30/1864882.html,如需轉載請自行聯系原作者