2010-04-13 28 views
48

比方說你有:如何評論if-else結構?

if(condition) { 
    i = 1; 
} else { 
    i = 2; 
} 

,你需要把註釋解釋ifelse塊。做這件事最可讀的方式是什麼,所以有人可以很容易地撿起它們?

我通常不喜歡這樣:

//check for condition 
if(condition) { 
    i = 1; 
} else { 
    //condition isn't met 
    i = 2; 
} 

,我覺得不夠好意見分別位於不同的層次,所以在快速瀏覽你只需拿起if評論和else評論看起來像它屬於某種內部結構。

把他們像這樣:

if(condition) { 
    //check for condition 
    i = 1; 
} else { 
    //condition isn't met 
    i = 2; 
} 

不好看我要麼因爲它會像整個結構沒有被註釋掉(條件可能是大的,並採取多線)。

類似的東西:

//check for condition 
if(condition) { 
    i = 1; 
//condition isn't met 
} else { 
    i = 2; 
} 

將可能從查看評論點最好的風格,但令人困惑的代碼結構。

你如何評論這樣的塊?

PS。我不是在重構這兩行代碼,只關注代碼樣式和註釋格式。

+0

有了所有這些文字,問題不過是快速的:-) – 2010-04-13 06:30:55

+2

感謝您提出這個問題,我也一直在想這件事。 – helpermethod 2010-04-13 07:05:32

+0

我認爲應該重新打開 - 這是一個關於編碼風格的問題,可以根據專業知識來回答。 – Cookie 2014-04-11 09:19:21

回答

4

我不會在這些特殊情況下發表評論 - 評論不會爲您已經清晰的代碼增加任何價值。如果你有一個非常複雜的條件難以閱讀,我會考慮把它分解成一個函數(可能是inline),它的名字很乾淨。

14

如果代碼不是自我解釋的,那麼只應該註釋。所以讓自我解釋。像這樣也許

bool fooIsNotReallyGood = ....; 

if(fooIsNotReallyGood) { 
... 
} else { 
... 
} 
+0

+1我盡我所能,讓我的代碼可以理解,無需評論 – 2010-04-13 06:59:14

+26

謝謝,但這不是什麼問題。 – serg 2010-04-13 15:12:15

+0

@ serg555:你可能沒有明確地問這個問題,但這個答案都是一樣的。如果你在上面的例子中使用了實際的評論,那麼很明顯它完全取決於具體評論的相關內容。例如,在外層的實際評論可能會解釋,如果您安裝了特定的圖形卡,則會出現一個錯誤,否則這個錯誤不會成爲問題,所以您根據該條件採取不同的處理方式。內部註釋可能解釋了一個特別複雜的算法,以及它如何與if語句的特定分支綁定。 – 2010-04-13 20:39:28

2

//condition isn't met似乎是一個無用的註釋。但是,在需要這樣的評論的情況下,我不喜歡這樣(C#):

//check for condition 
if(condition) 
{ 
    i = 1; 
} 
//some other condition 
else 
{ 
    i = 2; 
} 

然而,如果該塊正好的if-else,比我之前如果合併雙方的意見。

對於JavaScript我喜歡

//check for condition 
if(condition) { 
    i = 1; 
} else { //some other condition 
    i = 2; 
} 

附:似乎有許多意見,還有人:)

-3

您可以提取if-else代碼的方法和正確命名它們:

function main() { 
    checkForCondition(condition); 
    conditionIsNotMet(condition); 
} 

function checkForCondition(boolean condition) { 
    if (condition) { 
    i = 1; 
    } 
} 

function conditionIsNotMet(boolean condition) { 
    if (!condition) { 
    i = 2; 
    } 
} 

在這似乎是一個矯枉過正這樣一個小例子,但是想象一下,有更多的比每if-else分支一行。

+2

哈哈,在這種情況下做這樣的事情不是更好嗎? if(condition) conditionIsMet(); else conditionIsNotMet(); – 2010-04-13 06:44:58

19

另一種選擇是:

if(condition) { //check for condition 
    i = 1; 
} else { //condition isn't met 
    i = 2; 
} 
+2

這是我喜歡的選項...除非評論真的很長,那麼你就搞砸了......我感到沮喪並刪除評論,因爲看起來很醜。 – mpen 2010-04-13 06:21:10

+0

+1我認爲最好的解決方案。 – helpermethod 2010-04-13 07:06:01

+0

這就是我所做的。如果評論很長,那麼將註釋塊放在條件之上,解釋整個事情。 – drawnonward 2010-04-13 07:45:44

1

的變量是重要的,而不是條件本身。

if condition: # <condition dependent variable> was <predicated> 
    dosomething() 
elif othercondition: # <othercondition dependent variable> <predicated> 
    dootherthing() 
else: # <all variables> <not predicated> 
    doelsething() 
2

這是我如何做我的意見,如果然後語句,雖然我通常發現它並不需要。我喜歡把它與if/else一致,並且選項卡在相同的地方

if (condition) //if above the bar 
{ 
    i = 0; 
    k = 1; 
} 
else    //else if below 
{ 
    i = 1; 
    k = 2; 
} 
+0

我喜歡這種做事的方法。它可能會佔用更多的空間,但它完全清楚了循環/ if語句所涵蓋的內容。 – Faken 2010-04-13 07:23:40

5

查看自我評論條件,則不需要額外註釋。假設條件是達到了最大的貸款價值。這給了我們:

if (maximumLoanToValueIsReached) 
{ 
    i=1; 
} 
else 
{ 
    i=2; 
} 

無需指定i = 2時,最大的貸款價值還沒有達到,因爲這是自explanitory。另外,我還會將i重命名爲更有意義的內容。

20

如果需要評論else語句,我更願意描述使代碼達到那個點的情況。 特別是在高圈複雜

if (condition) { 
// User is taking a course at college x: 
    i = 1; 
} else { 
// User is not taking any course at college x: 
    i = 2; 
} 
+0

我喜歡這...特別是在「其他」塊中的評論。您的條件應該清楚,但取決於代碼的長度和複雜性(尤其是嵌套),「其他」的含義可能根本不明顯。 – mmc 2012-08-21 15:30:41

+0

例如,如果您想爲'i = 2'在else塊中添加註釋,則這將不起作用。看起來他們都是'i = 2',或者兩者都是'else'塊。 – aandis 2015-05-03 07:33:08

1

沒有單一的答案代碼 - 不同的人就會有什麼是最可讀不同意見。然而,我認爲,評論應該實際上爲(不言自明的)代碼增加價值並且評論風格應該一致。

我處理不立即不言自明的條件意見的方式是這樣的:

// If the condition for a local tree imbalance is met, 
    // juggle the immediate nodes to re-establish the balance. 
    // Otherwise, execute a global balancing pass. 
    if (somewhat muddled condition) 
    { 
    ...code... 
    } 
    else // Tree is in local balance 
    { 
    ... more code... 

    } // if/else (tree locally imbalanced) 

最終「}」註釋的存在主要是給的條件更視覺重量的結束,使通過源閱讀更容易。

9

如果代碼是沒有自我記錄,那麼我將如下構建它:

if (someCondition) { 
    // If some condition, then do stuff 1. 
    doStuff1(); 
} 
else { 
    // Else do stuff 2. 
    doStuff2(); 
} 

但同樣,它並沒有多大意義,如果代碼已經是自文檔。如果你想補充的,因爲像一些複雜條件評論:

if (x == null || x.startsWith("foo") || x.endsWith("bar") || x.equals("baz")) { 
    doStuff1(); 
} 
else { 
    doStuff2(); 
} 

然後我會考慮重構它爲:

boolean someCondition = (x == null || x.startsWith("foo") || x.endsWith("baz") || x.equals("waa"); 

if (someCondition) { 
    doStuff1(); 
} else { 
    doStuff2(); 
} 

其中的變量名someCondition實際上總結整個狀態簡而言之。例如。 usernameIsValiduserIsAllowedToLogin左右。

+0

我也喜歡在同一個選項卡級別上的其他評論。我不同意不評論代碼,如果聲明可能像someCondition一樣簡單,但在其結構中有300行,在這種情況下,NOT commenting else語句將會很愚蠢,因爲您需要滾動300行另有300個底部.. – s3m3n 2013-04-19 21:49:21

1

評論是非常個人的事情,並且(從一些早期的答案中可以看出)引起了與代碼一樣多的爭論。

在簡單情況下,評論會減損代碼。但假設一個更復雜的條件,我更喜歡:

/* 
** Comment explaining what the condition 
** is trying to determine 
*/ 
if (condition) 
{ 
    /* 
    ** Comment explaining the implications 
    ** of the condition being met 
    */ 
    do_something(); 
} 
else 
{ 
    /* 
    ** Comment explaining the implications 
    ** of the condition not being met 
    */ 
    do_something_else(); 
} 

在任何情況下,評論不能只是重複代碼。