我建议重构一位同事,他反驳说基本上是引用 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 */
}
他的回答是,打开这样的标志意味着该方法正在做多种事情。我知道“清洁代码”确实说明了标志或开关语句是一种气味,但我认为它不适用于这种情况。我认为这条规则是关于寻找多态性的机会。无论如何,我认为我的版本仍然在做一件事,但我想这取决于解释。
有没有什么不完全主观的东西可以用来解决哪种方法更好?