1

我建议重构一位同事,他反驳说基本上是引用 SRP。这是情况。

我们有一堆对我来说都是相关目的的辅助方法 - html 生成。可能有很多选项可供应用,我们称它们为 AB 和 C,您可以混合搭配。

他的原始代码对每个选项和有效组合使用了单独的方法。我认为这很糟糕,因为排列可能会迅速升级失控。

public string MethodWithA() { /* ... */ }

public string MethodWithB() { /* ... */ }

public string MethodWithC() { /* ... */ }

public string MethodWithAandB() { /* ... */ }

public string MethodWithAndC() { /* ... */ }

public string MethodWithBandC() { /* ... */ }

我们的情况并不像这样极端,但我要求的是一般情况。

我说应该有一个方法,并且选项应该作为参数或枚举标志传递。

public string Method(SomeOptions flags)
{
    /* minimal base processing */

    if (/* flag A */)
    {
        ModifyForA();
    }

    /* etc for B and C */
}

他的回答是,打开这样的标志意味着该方法正在做多种事情。我知道“清洁代码”确实说明了标志或开关语句是一种气味,但我认为它不适用于这种情况。我认为这条规则是关于寻找多态性的机会。无论如何,我认为我的版本仍然在做一件事,但我想这取决于解释。

有没有什么不完全主观的东西可以用来解决哪种方法更好?

4

1 回答 1

1

很难说,因为你的例子有点太笼统了,但我不喜欢这两种方法。正如您正确指出的那样,第一个导致组合爆炸,但替代方案将导致无法测试或分析的可怕方法。我更喜欢某种构建器,或者像现在流行的那样称之为流利的界面。然后你会有类似的东西:

string html = htmlBuilder.WithA().WithC().Build()
于 2013-03-28T14:20:09.110 回答