有很多方法可以解决这个问题,但让我挑几个。
首先,所有条件(if 语句中的所有 AND 条件)+如果它们都为真则要执行的代码是一次性的情况。
在这种情况下,请使用您拥有的代码。您可能想要执行其他几个人已经建议的操作,重写以使用 Guard 子句类型的代码。
换句话说,不是这样:
if (a && b && c && d && ......)
DoSomething();
...你改写成类似这样的东西:
if (!a) return;
if (!b) return;
if (!c) return;
if (!d) return;
if (!...) return;
DoSomething();
为什么?因为一旦你开始将 OR 标准引入到组合中,就很难阅读代码并弄清楚会发生什么。在上面的代码中,您在每个 AND 运算符 (&&) 上拆分条件,因此代码变得更易于阅读。基本上,您将代码从说“如果这个和那个,或者那个其他事情和那个第三个事情,或者其他事情,然后做某事”改写为“如果这个,然后退出;如果那个其他事情;然后退出;如果一些其他的;然后退出;如果以上都不是,做点什么”。
但是,在许多情况下,您也有可重用性的情况。如果其中一些标准出现在其他地方,但实际执行的代码(DoSomething)不一样,那么我会再次选择其他人已经建议的内容。根据评估条件的结果,将条件重写为返回 Boolean 结果的方法。
例如,什么更容易阅读,这个?
if (a && b && c && d && e && f && (h || i) && (j || k) || l)
或者这个:
if (CanAccessStream() && CanWriteToStream())
假设所有这些字母都可以分为这两个标准。
在这种情况下,我会采用一些标准并将其放入这些方法中,并为标准选择一个合适的名称。
第三个选项是代码中的几个地方的标准不同,但实际执行的代码是相同的。
在这种情况下,我会重写,以便您将条件组合在一起并将方法分层,以便调用一个方法将检查某些条件,然后调用另一个方法,该方法将检查一些其他条件,等等。
例如,你可以这样写:
if (stream != null && buffer != null && inBuffer > 0 && stream.CanWrite)
stream.Write(buffer, 0, inBuffer);
else
throw new InvalidOperationException();
或者你可以这样写:
if (inBuffer > 0)
{
Debug.Assert(buffer != null);
WriteToStream(buffer, inBuffer);
}
...
private void WriteToStream(Byte[] buffer, Int32 count)
{
if (stream.CanWrite)
stream.Write(buffer, 0, count);
else
throw new InvalidOperationException();
}
我会说第二种方式比第一种方式更容易阅读,并且更可重复使用。