1: public class OrderLineItem
2: {
3: public decimal Price { get; private set;}
4: }
5:
6: public class Order
7: {
8: public IEnumerable<OrderLineItem> OrderLineItems { get; private set;}
9: public IEnumerable<decimal> Discounts { get; private set; }
10: public decimal Tax { get; private set; }
11:
12: public decimal Calculate()
13: {
14: return new OrderCalculator(this).Calculate();
15: }
16: }
17:
18: public class OrderCalculator
19: {
20: private decimal SubTotal { get; set;}
21: private IEnumerable<OrderLineItem> OrderLineItems { get; set; }
22: private IEnumerable<decimal> Discounts { get; set; }
23: private decimal Tax { get; set; }
24:
25: public OrderCalculator(Order order)
26: {
27: OrderLineItems = order.OrderLineItems;
28: Discounts = order.Discounts;
29: Tax = order.Tax;
30: }
31:
32: public decimal Calculate()
33: {
34: CalculateSubTotal();
35:
36: SubtractDiscounts();
37:
38: CalculateTax();
39:
40: return SubTotal;
41: }
42:
43: private void CalculateSubTotal()
44: {
45: // Total up line items
46: foreach (OrderLineItem lineItem in OrderLineItems)
47: SubTotal += lineItem.Price;
48: }
49:
50: private void SubtractDiscounts()
51: {
52: // Subtract Discounts
53: foreach (decimal discount in Discounts)
54: SubTotal -= discount;
55: }
56:
57: private void CalculateTax()
58: {
59: // Calculate Tax
60: SubTotal += SubTotal * Tax;
61: }
62: }