我理解这个问题的答案是否可能是主观的,(我还没有找到类似的问题),但我的问题是:
我已经在互联网/文献中看到了来自不同来源的代码片段,其中一个来自我的项目中的队友。通常他们中的一些人会选择像...这样的方法。
if(a == true && b == false || c == true) {}
从我的角度来看,if语句可能是
如果a为真且b为假或者c为真
或(口译员可能会理解的内容,即使对我来说也是如此)
如果a为真且b为假或c为真
由于我的这种冲突必须正确地思考什么声明 A)执行或B)最初由编码人员所指,我总是使用我自己的模式使其他人更容易理解,其内容如下......
if(a == true && (b == false || c == true)) {}
或
if((a == true && b == false) || c == true) {}
或(更好的可读性,因为我认为括号内的子语句应该是最后的,而不是第一个)
if(c == true || (a == true && b == false)) {}
现在我错了吗?如果我是对的,是否有支持这种语法的设计模式?尽管我认为这是一种更好的方法,但Resharper认为不是这样,并认为它是减少的。
另一方面,我想以任何方式学习更好的代码,如果我的队友做错了,我也应该让他们有机会变得更好,他们的代码也变得更易读(如果这是真的)
编辑:它不是关于If-Statement如何工作或布尔或其优先级如何工作。它是关于在默认情况下不需要的语句中添加额外的括号(如不需要编码中的注释),但可能是一种模式(如注释或其他设计模式)有助于更清晰的编码。
答案 0 :(得分:2)
查看MSDN上的Precedence and Order of Evaluation。
关于您的示例,if (a == true && b == false || c == true)
被评估为if (a is true AND b is false) OR c is true
,因为&& 的评价顺序高于 ||
就可读性而言,我不会明确评估== true
或== false
。
这不太可读,也不那么干净......
if (a == true && b == false || c == true) { ... }
这更具可读性和清洁性......
if(a && !b || c) { ... }
Resharper抱怨是因为你不需要明确指定评估顺序,如果它与没有括号的情况完全相同,例如:
if ((a && !b) || c) { ... }
与if (a && !b || c) { ... }
相同,因此额外的括号是多余的,并为您的代码添加噪音,因此不具备可读性。
如果您需要明确更改评估顺序,那么Resharper不应该抱怨,例如:
if (a && (!b || c)) { ... }
关于设计模式,关于OOP设计模式没有任何想法。这似乎更适合功能编程领域的各个方面,例如模式匹配。
答案 1 :(得分:0)
这是一个非常基于意见的问题,您可以在评论中看到。
我更喜欢保留括号以使其更明显,因为我自己有时会更换&&和||的评价。
if((a == true && b == false) || c == true)
vs
if(a == true && b == false || c == true)
这给我一个即时印象,即a和b必须为真或只有c为真。如果我错过括号,我需要另一个“是&& before ||,反之亦然?”。一些人需要它,其他人不需要。
总是尝试使用KISS - 保持简单愚蠢。 最简单的方法是在条件过于复杂的情况下将其封装到函数中:
if(ObjectIsValid(obj))
...
private bool ObjectIsValid(object obj)
{
return obj.Condition1 == true || (obj.IsSpecial && obj.Specialprop == true) || (obj.SomeEnum == Enumvalue.Value && obj.Specialprop == false) ...;
}
如果您首先检查和/或条件,订单可能取决于许多因素。如果检查或条件花费最多时间怎么办?拿第一个。如果和条件最不可能满足怎么办?把它放在最后。
这在很大程度上取决于你所处的情况。主要的一点是在你的团队中保持一种每个人都能理解的风格,以及最具可读性,工作性,高性能和全部接受的解决方案。
......最好的解决方案并不总是最短或最高效。
我也支持series0ne的“if(a)> if(a == true)”。
修改强>: 我还想提到困扰我的另一点
if(someCondition &&
someOtherCondition ||
someThirdCondition)
and
if(someCondition
&& someOtherCondition
|| someThirdCondition)
第二个似乎更多对我来说是可读的,因为我知道什么是和&&'在与&&同一行。但在这一点上,肯定还有足够的人来对可读性发表另一种意见。