我找不到一种良好的性能和易读性的方法来在类中编写一些计算。想象一下以下课程和获得最终价格的所有方法:
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;
}
我会完成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;
}
}
如果转到特性的定义,可以立即看到它是如何计算的。此外,您也不关心需要先进行哪些计算。
我会为CalculateFinalPrice
、CalculateOrderPrice
、CalculateOrderTaxes
和CalculateOrderDiscount
创建方法,如下所示:
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;
}
这为您提供了更多但更小的部分,更易于维护、读取和单元测试,因为每个方法都有一个单独的责任。