Getter、Function或只是在构造函数上设置它

本文关键字:构造函数 设置 Function Getter | 更新日期: 2023-09-27 18:29:30

我找不到一种良好的性能和易读性的方法来在类中编写一些计算。想象一下以下课程和获得最终价格的所有方法:

public class Order {
    public Order(Product[] products) {
        Items = products;

选项1:为每个要计算的属性都有一个变量声明,易读性很差


        var orderPrice = products.Sum(p => p.Price * p.Quantity);
        var orderTaxes = products.Sum(p => p.Taxes * p.Quantity);
        var orderDiscount = products.Sum(p => p.Price * p.Quantity * p.Discount);
        OrderPrice = orderPrice;
        OrderTaxes = orderTaxes;
        OrderDiscount = orderDiscount;
        FinalPrice = orderPrice + orderTaxes - orderDiscount;

选项2:课堂秩序问题很重要!FinalPrice线不能在其他线之前,否则它不会工作,但不会出错。


        OrderPrice = products.Sum(p => p.Price * p.Quantity);
        OrderTaxes = products.Sum(p => p.Taxes * p.Quantity);
        OrderDiscount = products.Sum(p=> p.Price * p.Quantity * p.Discount);
        FinalPrice = OrderPrice + OrderTaxes - OrderDiscount;

选项3:重写所有公式-不利于维护。最有可能在以后引起价格差异。


        FinalPrice = products.Sum(p => p.Price * p.Quantity) + 
                     products.Sum(p => p.Taxes * p.Quantity) - 
                     products.Sum(p => p.Price * p.Quantity * p.Discount);
    }

选项4:使用getter。这将在每次调用时进行计算。这是一个简单的计算,但假设有更多的代码。


    public decimal FinalPrice { get {
        return OrderPrice + OrderTaxes - OrderDiscount;
    } }
}

选项5:使用函数。这是好事还是坏事??


    public decimal CalculateFinalPrice() {
        return OrderPrice + OrderTaxes - OrderDiscount;
    }

Getter、Function或只是在构造函数上设置它

我会完成getters中的所有逻辑:

public decimal CalculateFinalPrice
{
    get { return CalculateOrderPrice + CalculateOrderTaxes - CalculateOrderDiscount; }
}
public decimal CalculateOrderPrice
{
    get { return products.Sum(p => p.Price*p.Quantity); }
}
public decimal CalculateOrderTaxes
{
    get { return products.Sum(p => p.Taxes*p.Quantity); }
}
public decimal CalculateOrderDiscount
{
    get { return products.Sum(p => p.Price*p.Quantity*p.Discount); }
}

如果在secenario中速度较慢,则可以缓存属性。

private decimal? _calculateOrderPrice;
public decimal CalculateOrderPrice
{
    get
    {
        if (_calculateOrderPrice == null)
        {
            _calculateOrderPrice = products.Sum(p => p.Price*p.Quantity;
        }
        return _calculateOrderPrice.Value;
    }
}

如果转到特性的定义,可以立即看到它是如何计算的。此外,您也不关心需要先进行哪些计算。

我会为CalculateFinalPriceCalculateOrderPriceCalculateOrderTaxesCalculateOrderDiscount创建方法,如下所示:

public decimal CalculateFinalPrice() {
    return CalculateOrderPrice() + CalculateOrderTaxes() - CalculateOrderDiscount();
}
public decimal CalculateOrderPrice()
{
    // Logic here to calculate order price
    return theOrderPrice;
}
public decimal CalculateOrderTaxes()
{
    // Logic here to calculate order taxes
    return theOrderTaxes;
}
public decimal CalculateOrderDiscount()
{
    // Logic here to calcuate order discount
    return theOrderDiscount;
}

这为您提供了更多但更小的部分,更易于维护、读取和单元测试,因为每个方法都有一个单独的责任。