C# if 语句的设计模式或(文献)最佳做法



我知道这个问题的答案是否可能是主观的,(而且我没有找到类似的问题),但我的问题如下:

我在互联网/文献上看到了来自不同来源的代码片段,其中一个来自我项目中的队友。通常他们中的一些人会采用这样的方法......

if(a == true && b == false || c == true) {}

从我的角度来看,if 语句可能是

  1. 如果 a 为真且 b 为假或 c 为真

    或者(口译员可能理解的内容,即使对我来说也是如此)

  2. 如果 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-语句的工作原理或布尔值或其优先级的工作原理无关。它是关于在默认情况下不需要的语句中添加额外的括号(例如不需要编码中的注释),但可能是一种有助于更清晰编码的模式(如注释或其他设计模式)。

查看 MSDN 上的评估优先级和顺序。

关于您的示例,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 设计模式,没有什么可以跳跃到脑海中。这似乎更适合来自函数式编程世界的方面,例如模式匹配。

这是一个非常基于意见的问题,正如您在评论中已经看到的那样。

我更喜欢保留括号以使其更明显,因为我自己有时会交换 &&&和 ||' 的顺序的评价牢记在心。

if((a == true && b == false) || c == true)
vs
if(a == true && b == false || c == true)

这给我一个即时的印象,a和b必须是真的,或者只有c是真的。如果我错过了括号,我需要另一个艰难的"是 &&之前 ||反之亦然?有些人需要它,有些人不需要。

总是尝试使用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) ...;
}

如果您首先检查 and 或 or 条件,顺序可能取决于许多因素。如果检查 OR 条件花费的时间最多怎么办?拿和第一。如果 and 条件最不可能满足怎么办?最后放置。

这在很大程度上取决于您所处的情况。重点是在您的团队中保持一种每个人都能理解的风格,以及最具可读性、工作、性能和被所有人接受的解决方案。

。最好的解决方案并不总是最短或性能最高的。

我也支持series0ne的"if(a)>if(a == true)"。

编辑: 我还想提到困扰我的另一点

if(someCondition &&
someOtherCondition ||
someThirdCondition)
and
if(someCondition
&& someOtherCondition
|| someThirdCondition)

第二个对我来说似乎更具可读性,因为我知道与 && 在同一行中正在 &&'ed 的内容。但在这一点上,肯定也有足够的人对可读性有另一种看法。

相关内容

最新更新