我应该检查方法本身内部还是外部执行方法?

时间:2017-01-25 10:28:22

标签: oop

如果布尔值为真,我有一个应该执行的方法 实现这一目标的正常方法是:

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);

如果他们不感兴趣我,我不会阅读所有参数。我会假设,列表以某种方式被某些参数过滤。总是

但我的论点"感觉错了"这是一个非常糟糕的论点 他的方式可能与"分离关注"或者单一责任原则"同样,这将是一个更强有力的论点,但我不确定是否是这种情况。

但我真的无法找到任何两个观点的有力证据。而且我真的不知道要搜索什么,或者......

所以也许有人知道哪种方式更符合面向对象的编程范式 我的目标不是要证明我的同事是错的,当然,如果我是对的,我会感到高兴。 :)
我的目标是找到一个良好的基础,我们可以根据我们公司的编程标准为此案例制定政策。

感谢您的帮助。

4 个答案:

答案 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" (在某些情况下可能除了空值或空值)这可能意味着应该有不同的方法,调用者应该更明确地知道需要做什么。