我继承了1000多行意大利面条代码。我可以将它分解为十几种方法,每种方法都创建一个FinancialTransactionObject,但是使用不同的日期,金额和其他参数来创建它们的事务。
我的直觉告诉我要让每个方法成为自己的类。所以我可以使用1个方法从基类或接口继承十几个类:
abstract FinancialTransactionObject Calculate();
并将参数移动到构造函数或将它们设置为公共属性。构造函数意味着我无法重用我的实例,每次都必须创建一个新对象。属性意味着消费代码可能忘记设置它们。在每个方法中保留参数只是在单独的文件中提供了十几种方法,并且不会感觉面向对象。
这个问题的变化似乎经常出现。是否有一个良好,一致,行业范围的设计模式来处理它?</ p>
答案 0 :(得分:0)
这对我来说听起来像Visitor pattern。
访问者模式的基本思想是根据实现的类型动态地改变行为。
您需要两件事:
IVisitable
使用Accept
方法,IVisitor
为
参数。 IVisitor
,每个实现都有许多Visit
个方法
IVisitable
我将从数字2开始。这个(在你的情况下)将是一个接口,它具有你的计算方法的所有实现(对于你提到的你想要创建的每个类)。让我们调用您的Visitor
和Visit
方法Calculator
和Calculate
。然后你会有:
interface ICalculator
{
FinancialTransactionObject Calculate(Element1 element);
FinancialTransactionObject Calculate(Element2 element);
FinancialTransactionObject Calculate(Element3 element);
.
.
}
然后第一部分 - 所有元素类将继承基类Element
,它将实现IVisitable
。然后是:
abstract class Element
{
public FinancialTransactionObject result { get; private set; }
protected void Accept(ICalculator calculator)
{
this.result = calculator.Calculate(this);
}
}
你最终会得到类似的东西:
var calculator = new Calculator(); //this is the class that implements the interface
var el1 = new Element1();
var el2 = new Element2();
el1.Accept(calculator);
el2.Accept(calculator);
然后当然基于你的el对象的实现,将得到它们的结果值。
我不确定这是你问题的最佳解决方案(如果有这样的话),但在我看来就像你正在寻找的那个。希望这会有所帮助。
PS:我在考虑将IVisitable
命名为ICalculatable
,但这听起来很奇怪:)。