C#If-Statement的设计模式或(文献)最佳实践

时间:2018-04-20 09:05:14

标签: c#

我理解这个问题的答案是否可能是主观的,(我还没有找到类似的问题),但我的问题是:

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

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

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

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

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

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

  3. 由于我的这种冲突必须正确地思考什么声明 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如何工作或布尔或其优先级如何工作。它是关于在默认情况下不需要的语句中添加额外的括号(如不需要编码中的注释),但可能是一种模式(如注释或其他设计模式)有助于更清晰的编码。

2 个答案:

答案 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)

第二个似乎更多对我来说是可读的,因为我知道什么是和&&'在与&&同一行。但在这一点上,肯定还有足够的人来对可读性发表另一种意见。