在方法中应用开/关原理

ale*_*dru 2 c# design-patterns solid-principles

嗨我的任务是重构一部分代码,以便它与开放/封闭原则相对应.我设法在两种方法中应用策略模式但在一种方法中我不知道应该如何进行.

public ProductPriceCalculator(Product product)
{
    this.product = product;
    buyerStrategy = new BuyerStrategy();
    discountStrategy = new DiscountStrategy();
}

public Price CalculatePrice()
{
    price = new Price();

    decimal productPrice = product.BasePrice + 
                           (product.BasePrice * product.Addition);
    decimal TVA = CalculateTVA();
    price.ProductPrice = productPrice*TVA;
    decimal discount = CalculateDiscount(price.ProductPrice);
    price.Discount = price.ProductPrice * discount;
    price.ProductPriceWithDiscount = price.ProductPrice - price.Discount;
    price.TransportPrice = product.Transport.GetTransportPrice();
    price.TotalPrice = price.ProductPriceWithDiscount + price.TransportPrice;

    return price;
} 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这个方法通过使用类中的方法来初始化对象.现在这个方法没有关闭进行修改,因为如果在某些时候我必须向Price添加另一个属性,我将不得不回到这里初始化它.

我该如何正确构建此代码?

bbo*_*nch 5

一种可能的解决方案如下:

 public class ProductPriceCalculator
 {
    private readonly Product _product;
    private readonly BuyerStrategy _buyerStrategy;
    private readonly DiscountStrategy _discountStrategy;
    private readonly Price _price;

    public ProductPriceCalculator(Product product,BuyerStrategy buyerStrategy,DiscountStrategy discountStrategy,Price price)
    {
        _product = product;
        _buyerStrategy = buyerStrategy;
        _discountStrategy = discountStrategy;
        _price = price;
    }

    public Price CalculatePrice()
    {
        decimal productPrice = _product.BasePrice + (_product.BasePrice * _product.Addition);
        decimal TVA = CalculateTVA();
        decimal discount = CalculateDiscount(productPrice * TVA);
        decimal transportPrice = _product.Transport.GetTransportPrice();

        return _price.CalculatePrice(productPrice*TVA,discount,transportPrice);
    }

    ...

 }

public class Price
{
    ...

    public virtual Price CalculatePrice(decimal productPrice, decimal discount, decimal transportPrice)
    {
        Price price = new Price();

        price.ProductPrice = productPrice;
        price.Discount = ProductPrice * discount;
        price.ProductPriceWithDiscount = ProductPrice - Discount;
        price.TransportPrice = transportPrice;
        price.TotalPrice = ProductPriceWithDiscount + TransportPrice;

        return price;
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

这是好事,把依赖关系(例如buyerStrategy,discountStrategy,price)在构造函数和不是通过IoC容器或填充的东西在别的而不是在构造函数中创建它们自己.引入_price字段后,您可以将填充价格的属性委托给Price类本身.方法Price.CalculatePrice可以作为Price类的Fabric方法调用.