我认为您误会了DRY。
我们来看一个例子:
public Class A
{
public int Multiply(int x, int y)
{
return x * y;
}
}
public Class B
{
public int Multiply(int x, int y)
{
return x * y;
}
public int Add(int x, int y)
{
return x + y;
}
}
与
public Class C : A
{
public int Add(int x, int y)
{
return x + y;
}
}
通过用C代替B类,我们遵循了DRY原理并减少了代码重复。但是我们并没有增加项目的未知数或风险(除非您之前从未做过继承)。
我认为谈论DRY时的意思更像是设计任务。即:
public Class A
{
public int Multiply(int x, int y)
{
return x * y;
}
}
!!!新要求!一些客户需要能够增加双打!
// Use class B for new clients!!
public Class B
{
public int Multiply(double x, double y)
{
return x * y;
}
}
与
public Class A // Version 2
{
public int Multiply(int x, int y)
{
return Multiply(x as double, y as double);
}
public int Multiply(double x, double y)
{
return x * y;
}
}
在这里(假设它可行),我们设计了一种解决方案,该解决方案可以满足旧的和新的要求,本质上是尝试为现实生活中的问题或业务规则创建数学模型。在现实生活中,我们正在建模的系统显然要复杂得多,我们的模型无法完全拟合,边缘情况和意外结果将需要时间来查找和纠正。
那么,在这种情况下,我们应该采用B还是A版本2?
我再次要说,这取决于规范和要求的质量。
如果我们有涵盖边缘情况和向后兼容性的非常清晰的规范,则可以确信我们对系统的了解足够深,可以重构模型而不会产生错误。
如果我们有一个针对单个客户的紧急请求,而唯一的要求是该客户的行为发生变化而无需考虑整个系统;然后通过重构A“改善”模型会带来很大的风险。由于设计和测试解决方案需要额外的未知时间,因此打破了其他客户或超过了最后期限。