理解:經常寫的代碼中,有一些計算邏輯比較復雜的方法,寫下來一個很長很長的方法,我們可以把這個方法,根據功能,分解成單獨的幾個小方法。這樣做不僅能夠增加代碼的可維護性,而且增加了易讀性。
詳解:
重構前代碼:
1 public class Receipt 2 { 3 private IList<decimal> Discounts { get; set; } 4 private IList<decimal> ItemTotals { get; set; } 5 6 public decimal CalculateGrandTotal() 7 { 8 decimal subTotal = 0m; 9 foreach (decimal itemTotal in ItemTotals) 10 subTotal += itemTotal; 11 12 if (Discounts.Count > 0) 13 { 14 foreach (decimal discount in Discounts) 15 subTotal -= discount; 16 } 17 18 decimal tax = subTotal * 0.065m; 19 20 subTotal += tax; 21 22 return subTotal; 23 } 24 }
我們看到CalculateGrandTotal方法,里面用到了2個foreach循環,看一下,還真不宜理解,不曉得每個foreach主要做什么。
看看重構后的代碼:
1 public class Receipt 2 { 3 private IList<decimal> Discounts { get; set; } 4 private IList<decimal> ItemTotals { get; set; } 5 6 public decimal CalculateGrandTotal() 7 { 8 decimal subTotal = CalculateSubTotal(); 9 10 subTotal = CalculateDiscounts(subTotal); 11 12 subTotal = CalculateTax(subTotal); 13 14 return subTotal; 15 } 16 17 private decimal CalculateTax(decimal subTotal) 18 { 19 decimal tax = subTotal * 0.065m; 20 21 subTotal += tax; 22 return subTotal; 23 } 24 25 private decimal CalculateDiscounts(decimal subTotal) 26 { 27 if (Discounts.Count > 0) 28 { 29 foreach (decimal discount in Discounts) 30 subTotal -= discount; 31 } 32 return subTotal; 33 } 34 35 private decimal CalculateSubTotal() 36 { 37 decimal subTotal = 0m; 38 foreach (decimal itemTotal in ItemTotals) 39 subTotal += itemTotal; 40 return subTotal; 41 } 42 }
重構后,我們把CalculateGrandTotal方法分解成3個小方法,每個方法名稱根據其功能命名。CalculateTax顧名思義,就是計算稅收,CalculateDiscounts就是計算折扣金額。
這樣就把邏輯剝離的很清楚了。