最佳实践:validation方法调用的条件?

我想几乎在每个程序中,有时候方法不需要一直调用,只能在特定条件下调用。 检查是否必须调用方法非常容易。 一个简单的if-statment可以解决问题。

if (value == true) { DoSomething(); } 

但是,如果您有许多条件,validation可能会变得复杂,代码会变得越来越长。 所以我用每次调用的方法编写代码,方法本身将检查并validation她的代码是否需要执行。

 DoSomething(value); 

… 然后 …

 public void DoSomething(bool value) { if (value == true) { // Do Something here ... } } 

现在我有两种做事方式。 我不确定哪种方式是正确的方式。 或者甚至还有另一种选择?

清洁代码 – 敏捷软件手册技巧促进不要编写接受单个布尔参数的方法,因为每个方法应该只做一件事和一件事。 如果一个方法采用布尔参数来决定做什么,它会自动做两件事:决定什么和实际做某事。 该方法应该重构为两个单独的方法做某事,一个方法决定调用两个方法中的哪一个。

此外,使用value == true布尔值是多余且不必要的。 值本身表示布尔状态( true / false ),不需要再次与true进行比较。 也就是说,最好的做法是使用 if (value) 而不是 if (value == true) (或者if ((value == true) == true ;这看起来很愚蠢,但与if (value == true)的方法没什么不同if (value == true) )。

我发现这个问题的答案相当明显 – 除非我遗漏了什么。 适应每种情况。 被调用的函数应该按照预期的方式执行。 如果它的目的是处理一些参数集,那么一定要在函数内部进行检查。 如果您打算有条件地调用该function,请在外面进行检查。 将检查内部移动以便您可以保存一些额外的validation我认为不是一个好主意,因为其他人可能想要调用您的函数而不知道它是否真的在给定参数的情况下工作。 我说,除非检查内部是必要的,否则将检查留在外面。

编辑:我刚刚重新阅读你的问题…你基本上有:

 void foo(bool actuallyExecuteFoo) { //// } 

真? 真?

但是,如果您有许多条件,validation可能会变得复杂,代码会变得越来越长。

如果validation很复杂,则意味着下面的逻辑很复杂 。 期望你的代码像你的逻辑一样复杂 – 它必须在某个地方,对吧? 试想一下如何以干净的方式编写它。 干净的方式并不总是最短的方式。


我推荐这个变种:

 if (value == true) { DoSomething(); } 

为什么? 因为:

  • 调用DoSomething的代码更清晰 (*),因为它明确显示何时应该执行DoSomething的逻辑,何时不执行,
  • DoSomething本身依赖于较少的参数(这使得它更通用和可重用)。

*)是的,“更清晰”实际上意味着“更长”,但它也意味着“明确”和“自我记录”。 较短的变体实际上试图隐藏一些逻辑,这使得代码不太清晰。

看看这个 C#不知道为什么你需要C ++ 🙂

如果该方法可以抛出Argument / ArgumentNullexception,那么您应该在调用该方法之前validation它。 此外,微软代码合同将告诉您是否需要在调用方法之前validation输入,使用合同的任何代码(基本上是静态分析的断言)。

一般规则是不要过多地validation输入。 如果某些内容无效,则应抛出exception(C#),或返回错误(C ++)。 由于输入无效而不执行代码而没有告诉原因,下一个开发人员几乎不可能找出问题所在。

我会推荐第二种方式,但我有一些评论:

  1. 您不需要检查if (value == true) ,只需检查if (value)

  2. 早点回来,我的意思if (!value) { return; } if (!value) { return; }

第二种方式将花费更多的执行时间,尽管代码看起来会更好。 你为什么不用宏?

 #define DOSOMETHING(value) if (value) {DoSomething();} 

全部替换

 if (value == true) {DoSomething(); } 

使用宏DOSOMETHING(value)您的目的将得到解决,代码看起来会更好