这个重构建议是对第10天:提取方法的继续
我们在一个类中提取出来了大量的私有方法和变量,会造成这个类臃肿不堪,难以阅读
因此最好提取出来方法对象,用以将功能的一个个逻辑分离开
旧的代码:
Code public class OrderInfo { public decimal Price { get; private set; } } public class Order { private IList<OrderInfo> OrderLineItems { get; set; } private IList<decimal> Discounts { get; set; } private decimal Tax { get; set; } public decimal Calculate() { decimal subTotal = 0m; // Total up line items foreach (OrderInfo lineItem in OrderLineItems) { subTotal += lineItem.Price; } // Subtract Discounts foreach (decimal discount in Discounts) subTotal -= discount; // Calculate Tax decimal tax = subTotal * Tax; // Calculate GrandTotal decimal grandTotal = subTotal + tax; return grandTotal; } }
重构后的代码,我们通过构造方法,将返回计算结果的类的引用传递给包含多个计算方法的新建对象,或者向方法对象的构造函数中单独传递各个参数。
:
Code public class OrderInfo { public decimal Price { get; private set; } } public class Order { public IEnumerable<OrderInfo> OrderLineItems { get; private set; } public IEnumerable<decimal> Discounts { get; private set; } public decimal Tax { get; private set; } public decimal Calculate() { return new OrderCalculator(this).Calculate(); } } public class OrderCalculator { private decimal SubTotal { get; set; } private IEnumerable<OrderInfo> OrderLineItems { get; set; } private IEnumerable<decimal> Discounts { get; set; } private decimal Tax { get; set; } public OrderCalculator(Order order) { OrderLineItems = order.OrderLineItems; Discounts = order.Discounts; Tax = order.Tax; } public decimal Calculate() { CalculateSubTotal(); SubtractDiscounts(); CalculateTax(); return SubTotal; } private void CalculateSubTotal() { // Total up line items foreach (OrderInfo lineItem in OrderLineItems) SubTotal += lineItem.Price; } private void SubtractDiscounts() { // Subtract Discounts foreach (decimal discount in Discounts) SubTotal -= discount; } private void CalculateTax() { // Calculate Tax SubTotal += SubTotal * Tax; } }