if-then-else 结构中的注释应该放在哪里? [关闭]

Posted

技术标签:

【中文标题】if-then-else 结构中的注释应该放在哪里? [关闭]【英文标题】:Where to put comments in an if-then-else construct? [closed] 【发布时间】:2010-10-12 03:51:59 【问题描述】:

我从未决定评论if-then-else 构造的最佳方式是什么,因此我从未标准化一致的方式来评论它们。 我感谢任何见解。

一些选项:

一)

if (blabla)  
   // this comment explains what happens in the IF case
   dothis();
 else  
  // this comment explains what happens in the ELSE case
   dosomethingelse();

缺点:在多个 dothis() 语句的情况下,我喜欢对主要块进行注释,在这种情况下,IF 注释是属于第一个 dothis() 块还是属于整个 IF 并不总是很清楚案例

或 b)

if (blabla)  // this comment explains what happens in the IF case
   dothis();
 else  // this comment explains what happens in the ELSE case
   dosomethingelse();

缺点:仅适用于短 cmets。如果代码中没有直接明确 IF 和 ELSE 的情况,我通常会注释 IF-THEN-ELSE 结构,这通常需要超过一行的注释。

或 c)

// if the following happens
if (blabla)  // then do this
   dothis();
 else  // or else do this
   dosomethingelse();

PS:我知道“代码应该是自我解释的”,但情况并非总是如此......

【问题讨论】:

评论应该解释原因,而不是正在发生的事情。如果发生的事情不清楚 - 您需要修复它,也许将条件转出一个可以逐步分解的函数。 【参考方案1】:

对我来说,IF 上方的评论解释了 IF 语句本身。例如,如果正在测试的条件特别复杂。

IFELSE 下方块中的注释描述了评估条件并做出选择后会发生什么。

像这样:

//Is this a favoured customer and do we have a promotion?
if customer.special() and monthly.hasOffer() 
  //Add discount
  invoice.addDiscount();
 
else 
  //Add note about favoured customer scheme
  invoice.addNotes(JOIN_OUR_DISCOUNT_SCHEME);

【讨论】:

你知道那些 cmets 并没有真正为可读性做任何事情,对吧? @pzycoman:你知道这是关于风格的讨论,而不是内容,对吧?您也知道 cmets 确实可以提高可读性,对吧?【参考方案2】:

我从来没有认真考虑过;就个人而言,当需要时,我已将 cmets 置于 IF 和 ELSE 语句之上。这让我很好地将关于分支语句的 cmets 和关于代码的 cmets 区分开来。

// comment about the if statement
if (expression)

    // comment about the code
    doSomething();

// comment about the else statement
else

    // comment about the code
    doSomethingElse();

我还注意到,到目前为止,我是使用“开放花括号样式”的唯一答案,这可能是对我 Pascal 时代的一种回归,尽管我确实更喜欢代码块开始和结束的视觉理由,所以我的评论风格可能不适用于“封闭的花括号风格社区。​​p>

【讨论】:

您对 else 语句有何评论?通常它们是不言自明的。 :-) 如果一个分支在函数的输出上,它可能需要一些解释,一个更好的例子可能是 elseif。 如果不需要对其中一个或另一个进行评论,请忽略该评论。这就像函数开始时的样板;如果在某个标题下没有什么可说的,请省略该标题。 (我不提倡按功能使用样板;我看到的大部分内容都已过时且错误!) 如果 else 看起来不太可能,但由于某些极端情况它不是?【参考方案3】:

我会做 case a) 但有一点额外的空格:

if (blabla) 
   // This explains the whole if case

   // Can comment here for specific block comments
   doThis();
 else 
   // This explains the else case

   // Same again
   doSomethingElse();

【讨论】:

【参考方案4】:

就个人而言,我发现编写不需要小 cmets 的代码会更好,这些小 cmets 会说“about do do x”,然后是“DoX()”。如果有必要,我宁愿写一个名为“DoXBecauseOfY”的方法,而不是写一个评论说“do x because of y”。如果稍后的重构删除了“BecauseOfY”部分,那么在 if 语句之前添加注释仍然更有意义,记录整体逻辑。

当然,您需要将每个分支中的代码量减少到可以一次读取整个 if 语句的程度。

【讨论】:

【参考方案5】:

我猜,使用对您有意义的东西(除非您使用的编码标准指定了评论风格)。我个人不使用 (c) ,因为它在第一个和后续案例之间不一致。我偶尔会在简短的评论中使用(b),但通常我更喜欢(a)。如果我在 if 块中注释几个子块,我可能会在 case 注释后留下一个空行:

if (blabla) 
    // here's a comment about this case

    // comment about this bit of code
    bit_of_code();
    // comment about this other bit of code
    other_bit_of_code();

等等。

【讨论】:

【参考方案6】:
// Not very much sure, but here is a snippet of my code

// tweak URL as per query params and hash index positions
if (hasQueryParams && hashPos > -1) 
    // both query params and hash available
    ...
    ...
 else if (hasQueryParams) 
    // only query params available
    ...
    ...
 else if (hashPos > -1) 
    // only hash available
    ...
    ...
 else 
    // neither query params nor hash available
    ...
    ...

【讨论】:

【参考方案7】:

来自 oracle java docs 的代码约定

单行 if-else 的 cmets:

if (condition) 
 /* Here is a single line comment. */
 ...

单行很短 if-else 的 cmets:

if (a == 2) 
   return TRUE; /* special case */
 else 
 return isprime(a); /* works only for odd a */

多行 if-else 的 cmets:

if (condition) 
 /*
  * Here is a block comment.
  */

【讨论】:

【参考方案8】:

只是为 else 的注释位置添加缺少的答案,我认为这是代码可读性的最佳位置,原因如下:

如果注释放在 else 之上,它会破坏 if-else 的连续性 如果放在里面,它可以与 else 中第一条语句的注释混合

// match jth arc
if (j < Count)

     // arc matched
     if (arcs[j].IsBlue) List.Add(arcs[j])

else // all arcs were matched

     // check if there more arcs
     if (arcs[j + 1] != null) continue;

如果你把积木折叠起来看起来真的很棒

// match jth arc
if (j < Count)|...|
else // all arcs were matched|...|

【讨论】:

【参考方案9】:

这种风格怎么样? 使用// 注释整个 if-else 语句描述, 和/* */ 注释用于内部描述。 我使用/* */ 注释不会与 if-else 语句的内部注释混淆。

    // Process1
    if (cond1-1) 
        /* Process1 > Process1-1 */
        Process1-1();
        // Process1-1 description...
        Process1-1();
        Process1-1();
        ... 

     else if (cond1-2) 
        /* Process1 > Process1-2 */
        // Process1-2 description...
        Process1-2();
        Process1-2();
        Process1-2();
        ... 

        // Process1-2
        if (cond1-2-1) 
            /* Process1 > Process1-2 > Process1-2-1 */
            Process1-2-1();
            Process1-2-1();
            Process1-2-1();
            ...

         else if (cond1-2-2) 
            /* Process1 > Process1-2 > Process1-2-2 */
            Process1-2-2();
            // Process1-2-2 description...
            Process1-2-2();
            // Process1-2-2 description...
            Process1-2-2();
            ...

         else 
            /* Process1 > Process1-2 > Process1-2-else */
            Process1-2-else();
            Process1-2-else();
            Process1-2-else();
            ...
        

     else 
        /* Process1 > Process1-else */
        Process1-else();
        Process1-else();
        Process1-else();
        ...
    

【讨论】:

【参考方案10】:

这个怎么样? 在 if 关键字之后立即发表评论。像自然语言一样可读,只为真正感兴趣的人留下可能复杂的条件代码。

    if /* user is logged in */ (user && user.loggedin()) 
        ...
     else if /* user was logged in before */ (cookies.user && sizeof(cookies.user)>0 && cookies.user.value=="foobar" && some_other_things_in_a_long_condition) 
        ...
     else /* apparently there's no user */ 
        ...
    

【讨论】:

以上是关于if-then-else 结构中的注释应该放在哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中的哪里放置特征?

Lumen 中的业务逻辑应该放在哪里?

Meteor 中的单元测试应该放在哪里?

Lumen 框架中的 auth.php 应该放在哪里?

Flux 应用程序中的缓存逻辑应该放在哪里?

我应该把我的 .jasper 文件放在哪里以及如何访问它? [复制]