IF语句格式化最佳实践,你的风格是什么?

时间:2008-11-26 20:27:21

标签: coding-style

期待改善我的IF语句,并且我希望保持我的代码看起来很漂亮

这就是我目前正在做的事情,可读,还有改进的空间

SomeObject o = LoadSomeObject();


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

我没有人问过。这就是我首先来到这里的原因。请不要关闭我的问题:(

12 个答案:

答案 0 :(得分:12)

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

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

  executeMyCode();
}

答案 1 :(得分:10)

你的详细程度导致代码不太可读,我认为以下格式是最好的:

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

出于某种原因,我们都有高分辨率/宽屏显示器,没有理由以一些可怕的短语法锁定代码。另外,我只是创建一个名为IsIDEmpty的函数,以便代码看起来像

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

保持代码更简单&清洁器。该函数将执行实际检查并返回布尔值。我确信这是你可能会重复使用的东西,而且它可以作为一种简单的方式让代码更自我记录/评论。

答案 2 :(得分:6)

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

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

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

if(myFunction(...))

答案 3 :(得分:4)

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

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

如果您的代码在自动格式化后仍然无法读取,那么无论如何您都需要进行重构。

答案 4 :(得分:3)

如果它适合的话,我会把它全部放在一行上(这显然没有)。有了这个,我会把||始终在行的开头或结尾:

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似乎没有多大意义的事实

答案 5 :(得分:3)

我认为这是非常难以理解的。

将常量放在第一位的感觉对我来说似乎总有些奇怪 - 如果他们在条件中找到一个赋值,大多数编译器都可以被说服警告。

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

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

答案 6 :(得分:2)

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

我更喜欢像

这样的东西
if ( o == null || o.ID == null || null.Title ||
     o.ID.Length == 0 || o.Title.Length )

甚至更好,如果可能的话,将它保持在一行。

答案 7 :(得分:2)

我建议不要为这一个问题制定标准,而是建议采用现有的编码标准。

例如:

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

答案 8 :(得分:1)

一般来说我和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串更容易。

答案 9 :(得分:0)

不可读。 这就是我做Really Long Ifs的方式(或者我必须经常使用的那些)。

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。

答案 10 :(得分:0)

  1. 使用自动代码格式化程序,并对其进行适当配置。
  2. 编写一个像isPresent(String)这样的方法,检查String参数是否为null,非空(零长度)。
  3. 重写原始条件以使用新的isPresent(String)方法,可能全部在一行上。

答案 11 :(得分:-1)

我通常会这样做:

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

第一个y和x排成一个等宽字体,这很好,而且我不会被半韵混淆。

此方法在进行类似比较时效果最佳。否则,我通常会将我的if分开。