2

我有以下课程设计。完整代码可在“如何使用泛型实现此功能? ”中找到。该代码工作正常,并解决了“重构代码以避免类型转换”中提到的转换问题

RetailInvestmentReturnCalculator类中,该GetInvestmentProfit()方法利用抽象基类CalculateBaseProfit()中存在的方法。InvestmentReturnCalculator这一事实在类设计中并不明显。

问题

  1. 如何重构此类设计以传达上述事实?
  2. 防止此类设计错误的设计指南是什么?

注:Martin Fowler:设计死了吗?

我们所说的软件架构是什么意思?对我来说,架构这个术语传达了系统核心元素的概念,即难以改变的部分。其余部分必须建立的基础

类图

在此处输入图像描述

抽象的

public abstract class InvestmentReturnCalculator
{
    #region Public

    public double ProfitElement { get; set; }
    public abstract double GetInvestmentProfit();

    #endregion

    #region Protected

    protected  double CalculateBaseProfit()
    {
        double profit = 0;
        if (ProfitElement < 5)
        {
            profit = ProfitElement * 5 / 100;
        }
        else
        {
            profit = ProfitElement * 10 / 100;
        }
        return profit;
    }

    #endregion
}

public abstract class InvestmentReturnCalculator<T> : InvestmentReturnCalculator where T : IBusiness
{
    public T BusinessType { get; set; }
}

具体的

public class RetailInvestmentReturnCalculator : InvestmentReturnCalculator<IRetailBusiness>
{
    public RetailInvestmentReturnCalculator(IRetailBusiness retail)
    {
        BusinessType = retail;
        //Business = new BookShop(100);
    }

    public override double GetInvestmentProfit()
    {
        ProfitElement = BusinessType.GrossRevenue;
        return CalculateBaseProfit();
    }
}
4

1 回答 1

2

ProfitElement领域相当丑陋。我会将其设为抽象属性InvestmentReturnCalculator并在基类中实现(而不是设置值)——这称为模板方法模式。那你就不需要这个GetInvestmentProfit()方法了。

public abstract class InvestmentReturnCalculator
{
    #region Public

    public abstract double ProfitElement { get; }

    #endregion

    #region Protected

    public double GetInvestmentProfit()
    {
        double profit = 0;
        if (ProfitElement < 5)
        {
            profit = ProfitElement * 5 / 100;
        }
        else
        {
            profit = ProfitElement * 10 / 100;
        }
        return profit;
    }

    #endregion
}

public abstract class InvestmentReturnCalculator<T> : InvestmentReturnCalculator where T : IBusiness
{
    public T BusinessType { get; set; }
}

public class RetailInvestmentReturnCalculator : InvestmentReturnCalculator<IRetailBusiness>
{
    public RetailInvestmentReturnCalculator(IRetailBusiness retail)
    {
        BusinessType = retail;
        //Business = new BookShop(100);
    }

    public override double ProfitElement {get { return BusinessType.GrossRevenue;}}

}
于 2014-02-05T14:12:50.180 回答