C#If语句的设计模式或(文献)最佳实践
我理解这个问题的答案是否主观,(我没有发现类似的问题),但我的问题如下: 我在互联网/文献中看到了来自不同来源的代码片段,其中一个来自我项目中的团队成员。通常,他们中的一些人会选择一种类似于C#If语句的设计模式或(文献)最佳实践,c#,C#,我理解这个问题的答案是否主观,(我没有发现类似的问题),但我的问题如下: 我在互联网/文献中看到了来自不同来源的代码片段,其中一个来自我项目中的团队成员。通常,他们中的一些人会选择一种类似于 if(a == true && b == false || c == true) {} 在我看来,if语句可能是 如果a为真,b为假或c为真 或者(口译员可能理解的内容,甚至对我来说) 如果a为真,b为假或c为真 由于我的这种冲突,我必须正确地思考什么是陈述 A) 执行或B)最初是指代
if(a == true && b == false || c == true) {}
在我看来,if语句可能是
if(a == true && (b == false || c == true)) {}
或
或者(更好的可读性,因为我认为括号内的子语句应该是最后一个,而不是第一个)
现在我错了吗?如果我是对的,有没有支持这种语法的设计模式?尽管我认为这是一个更好的方法,但Resharper却不这么认为,认为它是多余的
另一方面,我想学习以任何方式更好地编写代码,如果我的队友做得不对,我也应该让他们有机会变得更好,他们的代码也变得更可读(如果这是真的)
编辑:它不是关于If语句如何工作,或者布尔值或其前导如何工作。它是关于在默认情况下不需要的语句中添加额外的括号(如不需要编码中的注释),但可能是一种有助于更清晰编码的模式(如注释或其他设计模式)。查看MSDN上的
关于您的示例,如果(a==true&&b==false | | c==true)
被计算为如果(a为true,b为false)或c为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设计模式并没有让人想到什么。这似乎更适合于函数式编程领域的一些方面,例如模式匹配。这是一个非常基于观点的问题,正如您在评论中已经看到的那样 我更喜欢保留括号以使其更清晰可见,因为我自己有时会在脑海中交换&&和| |的评估顺序
if((a == true && b == false) || c == true)
vs
if(a == true && b == false || c == true)
这给了我一个瞬间的印象,a和b必须是真的,或者只有c是真的。如果我错过了括号,我需要另一个问题:“是&&before | |还是反之亦然?”。有些人需要,有些人不需要
总是试着用吻——保持简单愚蠢。
如果条件太复杂,最简单的方法是将其封装到函数中:
if(ObjectIsValid(obj))
...
private bool ObjectIsValid(object obj)
{
return obj.Condition1 == true || (obj.IsSpecial && obj.Specialprop == true) || (obj.SomeEnum == Enumvalue.Value && obj.Specialprop == false) ...;
}
如果首先检查and或or条件,则顺序可能取决于许多因素。如果检查或状况花费的时间最多怎么办?以第一个和第一个为例。如果最不可能满足和条件,该怎么办?放在最后
这在很大程度上取决于你的处境。主要的一点是在你的团队中保持一种大家都能理解的风格,一种最具可读性、工作性、表现力并为所有解决方案所接受的风格
…最佳解决方案并不总是最短或最有效的。
我还支持series0ne的“if(a)>if(a==true)”
编辑:
我还想提到另一个困扰我的问题
if(someCondition &&
someOtherCondition ||
someThirdCondition)
and
if(someCondition
&& someOtherCondition
|| someThirdCondition)
第二个对我来说似乎更具可读性,因为我知道与&&&&在同一行中的是什么。但在这一点上,肯定也有足够的ppl对可读性有另一种看法。这里没有歧义<代码>&的优先级高于
|
我个人不想记住优先级,我总是用括号来表示这样的和/或混合-那么我可以肯定。Lyosha Korogoda的可能副本问题很简单:“为什么只在它有不同的含义时才放括号,而不是在没有括号的情况下含义保持不变?”->可能的原因:它应该变得更具可读性,作者不必添加额外的注释(部分)来解释,也不必简单地用代码写下自己的意图,而无需让其他人再次检查代码是否存在可能的逻辑错误。虽然知道逻辑运算符的优先级很好,对于仍在学习并需要理解您的逻辑的初级开发人员来说,大量使用括号仍然很有帮助。从您的第二个链接“下面的部分列出了从最高优先级到最低优先级的C#运算符。每个部分中的运算符共享相同的优先级。”-因此不需要链接到其他语言的文档。就像我写的那样,我可以解释代码的含义。问题在于可读性和可能的设计模式,以帮助更好、可能更干净的编码。最重要的是,我知道缩短布尔语句,在我看来,这只是一个示例。@在可读性和干净编码方面的半步,如果(a&&!b)是c,那么许多其他开发人员的
if(ObjectIsValid(obj))
...
private bool ObjectIsValid(object obj)
{
return obj.Condition1 == true || (obj.IsSpecial && obj.Specialprop == true) || (obj.SomeEnum == Enumvalue.Value && obj.Specialprop == false) ...;
}
if(someCondition &&
someOtherCondition ||
someThirdCondition)
and
if(someCondition
&& someOtherCondition
|| someThirdCondition)