我想在几乎每个程序中,有时候方法不需要一直调用,只能在特定条件下调用。 检查是否必须调用方法非常容易。一个简单的if-statment可以解决问题。
if (value == true)
{
DoSomething();
}
但是如果你有很多条件,验证会变得复杂,代码会变得越来越长。 所以我用每次调用的方法编写代码 并且方法本身将检查并验证她的代码是否需要执行。
DoSomething(value);
......然后......
public void DoSomething(bool value)
{
if (value == true)
{
// Do Something here ...
}
}
现在我有两种做事方式。我不确定哪种方式是正确的。 或者甚至还有另一种选择?
答案 0 :(得分:5)
Clean Code — A Handbook of Agile Software Craftsmanship促进不编写接受单个布尔参数的方法,因为每个方法应该只做一件事和一件事。如果一个方法采用布尔参数来决定做什么,它会自动做两件事:决定要做什么以及做某事。该方法应该重构为两个单独的方法做一些事情,一个方法决定调用两个方法中的哪一个。
此外,使用value == true
评估布尔值是多余且不必要的。值本身表示布尔状态(true
/ false
),不需要再次与true
进行比较。 也就是说,最佳做法是使用 if (value)
代替 if (value == true)
(或if ((value == true) == true
;这似乎是愚蠢的,但并没有多大差别从if (value == true)
)的方法。
答案 1 :(得分:2)
我发现这个问题的答案相当明显 - 除非我遗漏了什么。适应每种情况。 被调用的函数应该按照预期的方式执行。如果它的目的是处理一些参数集,那么一定要在函数内部进行检查。 如果您打算有条件地调用该功能,请在外面进行检查。 将检查内部移动以便您可以保存一些额外的验证我认为不是一个好主意,因为其他人可能想要调用您的函数而不知道它是否在给定参数的情况下实际工作。我说,除非检查内部是必要的,否则将检查留在外面。
编辑: 我刚刚重新阅读你的问题...... 你基本上有:
void foo(bool actuallyExecuteFoo)
{
////
}
真的?真的?
答案 2 :(得分:1)
但是如果你有很多条件,验证会变得复杂,代码会变得越来越长。
如果验证很复杂,则意味着下面的逻辑很复杂。期待你的代码像你的逻辑一样复杂 - 它必须在某个地方,对吧?试想一下如何以干净的方式编写它。 干净的方式并不总是最短的方式。
我推荐这个变种:
if (value == true)
{
DoSomething();
}
为什么呢?这是因为:
DoSomething
的代码更清晰(*),因为它明确显示何时应执行DoSomething
的逻辑,何时不执行,DoSomething
本身取决于较少的参数(这使得它更通用和可重复使用)。*)是的,“更清晰”实际上意味着“更长”,但它也意味着“明确”和“自我记录”。较短的变体实际上试图隐藏某些逻辑,这使得代码更少清晰。
答案 3 :(得分:0)
查看this了解C#,不知道为什么需要C ++:)
答案 4 :(得分:0)
如果该方法可以抛出Argument / ArgumentNull异常,那么您应该在调用该方法之前验证它。此外,微软Code Contracts将告诉您是否需要在调用方法之前验证输入,使用契约的任何代码(基本上是静态分析的断言)。
一般规则是不要过多地验证输入。如果某些内容无效,则应抛出异常(C#),或返回错误(C ++)。由于输入无效而不执行代码而没有告诉原因,下一个开发人员几乎不可能找出问题所在。
答案 5 :(得分:0)
我会推荐第二种方式,但我有一些评论:
您无需检查if (value == true)
,只需检查if (value)
。
早点回复,我的意思是if (!value) { return; }
答案 6 :(得分:0)
第二种方式会占用更多的执行时间,尽管代码看起来会更好。你为什么不用宏?
#define DOSOMETHING(value) if (value) {DoSomething();}
全部替换
if (value == true) {DoSomething(); }
使用宏DOSOMETHING(value)
您的目的将得到解决,代码看起来会更好