【问题标题】:IF statement formatting best-practise, what's your style?IF 语句格式最佳实践,你的风格是什么?
【发布时间】:2008-11-26 20:27:21
【问题描述】:

希望改进我的 IF 语句,并且我想让我的代码看起来很漂亮

这是我目前正在做的,是否可读,还有改进的余地吗?

SomeObject o = LoadSomeObject();


if( null == o
    ||
    null == o.ID || null == o.Title
    ||
    0 == o.ID.Length || 0 == o.Title.Length
 )

我没有人可以问。这就是我第一个来这里的原因。请不要关闭我的问题:(

【问题讨论】:

  • “null.Title”?您正在查看 null 对象的 Title 成员?雪莉,大错特错?
  • 这完全是主观的,之前已经被问过(并关闭)。
  • @EBGreen - 我认为这是以合理的方式提出的(真正寻求改进建议),并且有许多不同的答案,但我认为没有任何争议。
  • 我认为这是一个非常相似的问题,如果它有帮助的话。 stackoverflow.com/questions/217710/…
  • 我不认为它是有争议的,但它是非常主观的,没有办法将它作为主观来结束。

标签: coding-style


【解决方案1】:

为了下一个人,我总是尽量避免使用复杂的布尔表达式,但如果我必须编写一个不容易放在一行的表达式,我会将其格式化如下:

if (value1 == value2 ||
    value3 == value4 ||
    value5 == value6 ||
    value7 == value8) {

  executeMyCode();
}

【讨论】:

  • 如果变量名的长度不同,运算符就不会排列得那么好。
【解决方案2】:

您的冗长导致代码可读性降低,我认为以下格式最好:

if ( null == o || null == o.ID || null.Title || 0 == o.ID.Length || 0 == o.Title.Length )
{
  // do stuff
}

我们都有高分辨率/宽屏显示器是有原因的,没有理由将您的代码锁定在一些非常短的语法上。另外,我会简单地创建一个名为 IsIDEmpty 的函数,以便代码看起来像

if ( IsIDEmpty(o) )
{
  // do stuff
}

使代码更简洁。该函数将执行实际检查并返回一个布尔值。我敢肯定,无论如何,这都是你可能会重复使用的东西,而且它是一种让代码更加自我记录/注释的简单方法。

【讨论】:

  • 也许吧,但最终会有一条线放在一条线上是不明智的。
  • 我真的不想成为你办公室里一个有视力障碍的人!
  • “没有理由将你的代码锁定在一些非常短的语法”。当然,在我的屏幕上,Stackoverflow 会在右侧显示最后几个字符并显示滚动条!
  • 我不太热衷于将所有内容放在一行中,但我同意将复杂的逻辑放在单独的函数中使其更具可读性。
  • @Paul - 不仅仅是你的屏幕。 SO 的列固定在一定数量的 em 宽。我认为这是因为 Jeff Atwood 讨厌那些说“好吧,我在像样的显示器上使用像样的编辑器进行编码,以及剩下的少数不应该死去痛苦的死亡的穴居人”的人。或类似的词语。
【解决方案3】:

对于你所拥有的最简单的格式,我会每行一个。

if(null == o
  || null == o.ID
  || null == o.Title
  || 0 == o.ID.Length
  || 0 == o.Title.Length)

如果您可以重构条件以使其适合一行,那就更好了。我发现大量||或 && 通常很难阅读。也许您可以将其重构为一个函数并留下:

if(myFunction(...))

【讨论】:

  • +1 在续行的开头使用运算符。这使程序员可以轻松快速地通知该行是前一行的延续,而不是 if 中的第一行代码
【解决方案4】:

我的经验法则:避免使用半智能自动格式化程序无法重现的任何格式。

在我看来,拥有一组已定义的格式一个能够实际生成该格式代码的自动化工具/模板/配置是一大优势。

如果您的代码在自动格式化后仍然不可读,那么您很可能还是需要重构。

【讨论】:

    【解决方案5】:

    如果合适的话,我要么把它全部放在一行上(这显然不适合)。有了这个,我会把 ||始终位于行首或行尾:

    if( null == o ||
        null == o.ID ||
        null == o.Title ||
        0 == o.ID.Length ||
        0 == o.Title.Length
    )
    

    if( null == o
        || null == o.ID
        || null == o.Title
        || 0 == o.ID.Length
        || 0 == o.Title.Length
    )
    

    你可以在一行上有 >1 个条件,|| 的位置我认为更重要。

    我忽略了 null.Title 似乎没有多大意义的事实

    【讨论】:

      【解决方案6】:

      说实话,我觉得这很让人分心。主要是因为'||'开始制作有趣的图案。

      我更喜欢类似的东西

      if ( o == null || o.ID == null || null.Title ||
           o.ID.Length == 0 || o.Title.Length )
      

      或者更好,如果可能的话,把它放在一行中。

      【讨论】:

        【解决方案7】:

        我认为它很难读。

        在我看来,将常量放在首位的感觉总是有点奇怪 - 大多数编译器可以被说服,如果他们在条件中找到赋值,就会发出警告。

        然后,您要为两个不同的事物测试 null ,然后为两个不同的事物测试零长度 - 但重要的不是长度检查,而是您要检查的成员。所以我把它写成

        if (o == null       ||
            o.ID == null    || o.ID.length == 0 ||
            o.Title == null || o.Title.Length == 0) 
        

        【讨论】:

          【解决方案8】:

          与其为这个问题制定一个标准,我建议对您使用的任何语言采用现有的编码标准。

          例如:

          GNU 编码标准
          http://www.gnu.org/prep/standards/

          Java 编程语言的代码约定
          http://java.sun.com/docs/codeconv/

          .NET Framework 类库开发人员通用参考设计指南
          http://msdn.microsoft.com/en-us/library/czefa0ke.aspx

          【讨论】:

            【解决方案9】:

            一般情况下,我支持 TravisO,但如果您的 if() 语句中有太多条件以至于它变得很长,请考虑放入它自己的小函数:

            bool wereTheConditionsMet()
            {
              if( NULL == 0 )
                return true;
              if( NULL == o.ID )
                return true;
              :  :   // and so on until you exhaust all the affirmatives
              return false;
            }
            
            if ( wereTheConditionsMet() )
            {
              // do stuff
            }
            

            传达一个命名良好的谓词函数的意图比无穷无尽的 ||s 和 &&s 字符串要容易得多。

            【讨论】:

              【解决方案10】:

              不可读。 这就是我如何做真的很长的如果(或者那些我必须经常玩弄的)。

              if(
                o == null  ||
                o.ID == null || 
                o.Title == null ||
                o.ID.Length == 0 || 
                o.Title.Length == 0
               )
              

              对于你的,我会写一行。

              if(o == null  || o.ID == null || o.Title == null || o.ID.Length == 0 ||  o.Title.Length == 0)
              

              或者,如果您使用的是 C++,我会这样做:

              if(!o)
              {}
              if(! (o.ID && o.Title && o.Length))
              {}
              

              ...因为它将创造与正确性分开。

              但是,告诫者,由于我喜欢换行符,我被指责为 LOC 臃肿。

              【讨论】:

                【解决方案11】:
                1. 使用自动代码格式化程序,并对其进行适当配置。
                2. 编写一个类似 isPresent(String) 的方法来检查 String 参数是否为非空和非空(零长度)。
                3. 重写原始条件以使用新的 isPresent(String) 方法,可能都在一行中。

                【讨论】:

                  【解决方案12】:

                  我通常会这样做:

                  if(x < 0 || x >= width
                  || y < 0 || y >= height)
                  {
                      /* Coordinate out of range ... */
                  }
                  

                  第一个 y 和 x 排成等宽字体,这很好,我不会被半缩进弄糊涂。

                  这种方法在进行类似比较时效果最好。否则,我通常会拆分我的 if。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-06-11
                    • 1970-01-01
                    • 2018-05-17
                    • 2012-02-24
                    • 1970-01-01
                    • 2021-01-06
                    • 2018-12-10
                    • 1970-01-01
                    相关资源
                    最近更新 更多