如果布尔值为真,我有一个应该执行的方法 实现这一目标的正常方法是:
private void OneMethod() {
if (ShouldExecute)
OtherMethod();
}
private void OtherMethod() {
Do Stuff...
}
请注意,varibale" shouldExecute"是类的全局变量。
但我的一位同事最近开始将if
放入方法本身
所以现在它看起来像这样:
private void OneMethod() {
OtherMethod(ShouldExecute);
}
private void OtherMethod(bool shouldExecute) {
if (shouldExecute) {
Do Stuff...
}
}
他认为决定是否应该执行该方法是该方法本身的一个功能,因此应该是该方法的一部分。
虽然我可以看到他来自哪里但我仍然不喜欢他的方式。我认为这似乎是错误和令人困惑的 如果我看到这样的话:
var list = FilterList(list, otherParameter, yetAnotherParameter, shouldExecute);
如果他们不感兴趣我,我不会阅读所有参数。我会假设,列表以某种方式被某些参数过滤。总是
但我的论点"感觉错了"这是一个非常糟糕的论点 他的方式可能与"分离关注"或者单一责任原则"同样,这将是一个更强有力的论点,但我不确定是否是这种情况。
但我真的无法找到任何两个观点的有力证据。而且我真的不知道要搜索什么,或者......
所以也许有人知道哪种方式更符合面向对象的编程范式
我的目标不是要证明我的同事是错的,当然,如果我是对的,我会感到高兴。 :)
我的目标是找到一个良好的基础,我们可以根据我们公司的编程标准为此案例制定政策。
感谢您的帮助。
答案 0 :(得分:4)
我会回答您对描述真实案例的疑虑。
你去工作场所,一名警察阻止你。你告诉他: 嘿代理人,我在这条路上超过了最高速度吗?
那个警察会认为你很可笑,因为如果你知道你的违规行为,你为什么这么做?而且,无论如何,无论如何,他会好好的!
通常规则是由谁来定义的,而不是整个规则的目标(除非我们谈论法律应该由您所在国家的任何人履行)。
对我来说,一个方法并不负责知道它是否应该被执行,但它是调用者的责任,因为同样的方法应该可以通过其他方法调用,而那些方法可能有其他条件决定是否应该调用某种方法。
答案 1 :(得分:0)
这种方式(你的同事建议的那个)你向调用堆栈添加一个函数,如果boolean值为false,它基本上什么都不做。只有在必须真正执行该方法以避免滥用内存时才应调用该方法。
关于"关注点分离"是你的同事有过错,因为所谓的功能不应该知道"为什么"它被称为
答案 2 :(得分:0)
从下面的代码中可以看出OtherMethod
已经跟随Single Responsibility Principle
,即它正在为它的目的而做。但是在ShouldExecute
内使用OneMethod
隐藏了一些调用OneMethod
的人。
private void OneMethod()
{
if (ShouldExecute)
OtherMethod();
}
private void OtherMethod()
{
Do Stuff...
}
当方法需要某个参数时,该函数的调用者知道该参数在该函数的工作中具有某种相关性。所以下面的代码更具描述性。但是,如果所有的东西OtherMethod
继续执行只取决于它的参数shouldExecute
,那么为什么要调用方法本身。在这种情况下,以前的代码更好。
private void OneMethod()
{
OtherMethod(ShouldExecute);
}
private void OtherMethod(bool shouldExecute)
{
if (shouldExecute)
{
//Do Stuff...
}
}
最后,这会更好,维护SRP以及不隐藏OneMethod
来电者的任何内容:
private void OneMethod(bool _bShouldExecute)
{
if (_bShouldExecute)
OtherMethod();
}
private void OtherMethod()
{
Do Stuff...
}
答案 3 :(得分:0)
我不认为有一个参数来确定方法的逻辑是否被执行是明智的。应尽可能将方法视为一条始终执行相同任务(针对不同参数)的逻辑。正如Clean Code中所建议的那样,如果您有布尔参数可以显着改变方法的行为,那么它可能应该是一种不同的方法。
根据经验,我会说,如果文档最终类似于"此方法执行X,除非参数P取值V,在这种情况下,它执行Y" (在某些情况下可能除了空值或空值)这可能意味着应该有不同的方法,调用者应该更明确地知道需要做什么。