gpt4 book ai didi

c# - 在方法中应用开/闭原则

转载 作者:行者123 更新时间:2023-12-01 22:55:23 26 4
gpt4 key购买 nike

您好,我的任务是重构一部分代码,使其符合开放/封闭原则。我设法在其中两种方法中应用策略模式,但在一种方法中我不知道应该如何做继续。

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;
}

在这种情况下,此方法使用类中的方法初始化对象。就目前情况而言,此方法不会关闭以进行修改,因为如果在某个时候我必须向 Price 添加另一个属性,我将不得不返回此处初始化它。

如何正确构建此代码?

最佳答案

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

 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;
}

...

}

最好将依赖项(例如 buyerStrategydiscountStrategyprice)放入构造函数中,然后通过 IoC 容器或其他方式填充它们否则,不要在构造函数中创建它们。引入 _price 字段后,您可以将填充价格的属性委托(delegate)给 Price 类本身。方法 Price.CalculatePrice 可以作为 Price 类的 Fabric 方法进行调用。

关于c# - 在方法中应用开/闭原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16103665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com