码迷,mamicode.com
首页 > 其他好文 > 详细

重构13-Extract Method Object(提取方法对象)

时间:2016-08-19 10:02:10      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。 
在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开

public class OrderLineItem {
public Double Price;
}
public class Order {
private List<OrderLineItem> OrderLineItems;
private List<Double> Discounts;
private Double Tax;
public Double Calculate() {
Double subTotal = 0d;
// Total up line items
for(OrderLineItem lineItem : OrderLineItems) {
subTotal += lineItem.Price;
}
// Subtract Discounts
for(Double discount : Discounts) subTotal -= discount;
// Calculate Tax
Double tax = subTotal * Tax;
// Calculate GrandTotal
Double grandTotal = subTotal + tax;
return grandTotal;
}
}
我们通过构造函数,将返回计算结果的类的引用传递给包含多个计算方法的新建对象,或者向方法对象的构造函数中单独传递各个参数。如下面的代码:

public class OrderLineItem{
public Double Price;
}

public class Order {
public List<OrderLineItem> OrderLineItems;
public List<Double> Discounts;
public Double Tax;
public Double Calculate() {
return new OrderCalculator(this).Calculate();
}
}

public class OrderCalculator {
private Double SubTotal;
private List<OrderLineItem> OrderLineItems;
private List<Double> Discounts;
private Double Tax;

public OrderCalculator(Order order) {
OrderLineItems = order.OrderLineItems;
Discounts = order.Discounts;
Tax = order.Tax;
}

public Double Calculate() {
CalculateSubTotal();
SubtractDiscounts();
CalculateTax();
return SubTotal;
}

private void CalculateSubTotal() {
// Total up line items
for(OrderLineItem lineItem : OrderLineItems) SubTotal += lineItem.Price;
}
private void SubtractDiscounts() {
// Subtract Discounts
for(Double discount : Discounts) SubTotal -= discount;
}
private void CalculateTax() {
// Calculate Tax
SubTotal += SubTotal * Tax;
}
}
 





重构13-Extract Method Object(提取方法对象)

标签:

原文地址:http://www.cnblogs.com/jgig11/p/5786329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!