【问题标题】:What design pattern for functions that produce the same result but take different parameters?产生相同结果但采用不同参数的函数的设计模式是什么?
【发布时间】:2018-03-14 15:43:21
【问题描述】:

我继承了 1000 多行意大利面条式代码。我可以将其分解为十几个方法,每个方法都创建一个 FinancialTransactionObject,但采用不同的日期、金额和其他参数来创建它们的交易。

我的直觉告诉我要让每个方法都有自己的类。因此,我可以使用 1 个方法从基类或接口继承十几个类:

abstract FinancialTransactionObject Calculate();

并将参数移动到构造函数或使其成为公共属性。构造函数意味着我不能重用我的实例并且每次都必须创建一个新对象。属性意味着消费代码可以忘记设置它们。在每个方法上保留参数只会在单独的文件中给我十几个方法,并且感觉不是面向对象的。

似乎这个问题的变体经常出现。是否有一个好的、一致的、全行业的设计模式来处理它?

【问题讨论】:

  • 我想说:一个班级。一堆返回 FinancialTransactionObject 的静态函数。同名,重载参数。
  • 如果它们都返回同一个类(而不是继承的东西),为什么它们不是构造函数?如果它们返回不同的对象,它们仍然可以只是构造函数,但用于不同的类。如果重点是隐藏出现的对象,我会将它们作为方法保留在同一个类中。
  • 为什么重用实例对您很重要?这些类是否拥有创建/打开成本高昂的资源?
  • 是否有任何共同的属性或只是一个Calculate() 方法?
  • 请注意,@Christopher 建议的是 Factory 模式,听起来确实像你想要的那样

标签: c# oop design-patterns


【解决方案1】:

这对我来说真的很像Visitor pattern

所以访问者模式的基本思想是根据实现的类型动态地改变行为。

你需要两件主要的东西:

  1. IVisitable 使用 Accept 方法,将 IVisitor 作为 范围。
  2. IVisitor 每个实现都有许多 Visit 方法 IVisitable

我将从数字 2 开始。这(在您的情况下)将是一个接口,它具有您的计算方法的所有实现(对于您提到的每个要创建的类)。让我们调用您的VisitorVisit 方法CalculatorCalculate。然后你将拥有:

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,但这听起来很奇怪 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2021-11-17
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多