更好地保护方法调用或方法本身?


12

我正在编写一个应用程序,到此为止:

private void SomeMethod()
{
    if (Settings.GiveApples)
    {
        GiveApples();
    }

    if (Settings.GiveBananas)
    {
        GiveBananas();
    }
}

private void GiveApples()
{
    ...
}

private void GiveBananas()
{
    ...
}

这看起来很简单。有一些条件,如果满足,则将调用方法。但是,我在想,这样做是否更好:

private void SomeMethod()
{
    GiveApples();
    GiveBananas();
}

private void GiveApples()
{
    if (!Settings.GiveApples)
    {
        return;
    }

    ...
}

private void GiveBananas()
{
    if (!Settings.GiveBananas)
    {
        return;
    }

    ...
}

在第二种情况下,每个方法都会自我保护,因此,即使这些方法中的任何一个GiveApplesGiveBananas从外部被调用SomeMethod,也只有在设置中具有正确标志的情况下,它们才会被执行。

这是我实际上应该考虑的问题吗?

在我当前的上下文中,不太可能从该方法之外调用这两种方法,但没有人能保证这一点。


5
这取决于您是否需要不先检查就调用GiveApples或GiveBananas。由于防护与该方法相关联,因此它可能属于该方法。
罗伯特·哈维

相关(可能是重复的):Guard语句和Small Function如何共存?
蚊蚋

Answers:


13

我认为警卫是该方法必须遵守的东西。在您的示例中,如果Settings.GiveApples为false,则该方法不得提供apples。

如果是这种情况,则警卫肯定属于该方法内部。这样可以防止您在不首先检查防护措施的情况下意外地从应用程序的另一点调用它。

另一方面,如果设置仅适用于调用方法,而无论设置如何,代码中其他位置的另一个方法都可以给Apple,则它不是保护措施,可能应该在调用代码中。


5

将防护罩放置在方法本身内。的使用者GiveApples()GiveBananas()不应该负责管理的防护措施GiveApples()

从设计的角度来看,SomeMethod()应该只知道它需要成果,而不必关心应用程序需要做什么才能获得它。如果SomeMethod()负责知道存在允许检索某些水果的全局设置,那么水果检索的抽象就会变得不完整。如果您的防护机制发生了变化,这会级联,因为现在需要GetApples()GetBananas()需要分别重构以实现此新防护的所有方法。在编写代码时,如果没有检查就忘记尝试并取得成果也很容易。

在这种情况下,您应该考虑的是,当“设置”不允许您的应用程序产生结果时,您的应用程序应如何反应。


4

通常,最好将测试职责(例如外部提供的设置)和“核心业务代码”(例如)分开来GiveApples。另一方面,具有将属于什么的功能组合在一起的功能也是一个好主意。您可以通过重构代码来实现这两个目标:

private void SomeMethod()
{
    GiveApplesIfActivated();
    GiveBananasIfActivated();
}

private void GiveApplesIfActivated()
{
    if (Settings.GiveApples)
    {
        GiveApples();
    }
}

private void GiveBananasIfActivated()
{
    if (Settings.GiveBananas)
    {
        GiveBananas();
    }
}

private void GiveApples()
{
    ...
}

private void GiveBananas()
{
    ...
}

这为您提供了一个更好的机会,可以将代码的重构GiveApples和/或重构GiveBananas到单独的位置,而无需任何Settings类的依赖。当您想在单元测试中调用那些不需要任何方法的方法时,这显然是有益的Settings

但是,如果您的程序中总是存在错误,则在任何情况下,即使在测试环境中,也要GiveApplesSettings.GiveApples首先检查的环境外部调用类似的东西,并且您印象中只是提供诸如GiveApples不进行Settings检查之类的功能就容易出错,然后坚持到你测试的变体Settings.GiveApples里面GiveApples

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.