期待改善我的IF语句,并且我希望保持我的代码看起来很漂亮
这就是我目前正在做的事情,可读,还有改进的空间?
SomeObject o = LoadSomeObject();
if( null == o
||
null == o.ID || null == o.Title
||
0 == o.ID.Length || 0 == o.Title.Length
)
我没有人问过。这就是我首先来到这里的原因。请不要关闭我的问题:(
答案 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)
答案 11 :(得分:-1)
我通常会这样做:
if(x < 0 || x >= width
|| y < 0 || y >= height)
{
/* Coordinate out of range ... */
}
第一个y和x排成一个等宽字体,这很好,而且我不会被半韵混淆。
此方法在进行类似比较时效果最佳。否则,我通常会将我的if分开。