I would do all the logic in the 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); }
}
If this is slow in your secenario, you can cache the properties.
private decimal? _calculateOrderPrice;
public decimal CalculateOrderPrice
{
get
{
if (_calculateOrderPrice == null)
{
_calculateOrderPrice = products.Sum(p => p.Price*p.Quantity;
}
return _calculateOrderPrice.Value;
}
}
If you go to the definition of the property, you can see immediately how it is calculated. Also you don't care about wich calculation needs to be done first.