这个重构是一种元重构(meta-refactoring),它只是不停地使用提取方法重构,直到将一个大的方法分解成若干个小的方法。下面的例子有点做作,AcceptPayment方法没有丰富的功能。因此为了使其更接近真实场景,我们只能假设该方法中包含了其他大量的辅助代码。 下面的AcceptPayment方法可以被划分为多个单独的方法。

public class CashRegister {
public CashRegister() {
Tax = 0.06d;
}
private Double Tax;
public void AcceptPayment(Customer customer, List<Product> products,Double payment) {
Double subTotal = 0d;
for(Product product : products) {
subTotal += product.Price;
}
for(Product product : products) {
subTotal -= product.AvailableDiscounts;
}
Double grandTotal = subTotal * Tax;
customer.DeductFromAccountBalance(grandTotal);
}
}
public class Customer {
public void DeductFromAccountBalance(Double amount) {
// deduct from balance
}
}
public class Product {
public Double Price;
public Double AvailableDiscounts;
}
如您所见,AcceptPayment方法包含多个功能,可以被分解为多个子方法。因此我们
多次使用提取方法重构,结果如下: 
public class CashRegister {
public CashRegister() {
Tax = 0.06d;
}
private Double Tax;
private List<Product> Products;
public void AcceptPayment(Customer customer, List<Product> products, Double payment) {
Double subTotal = CalculateSubtotal();
subTotal = SubtractDiscounts(subTotal);
Double grandTotal = AddTax(subTotal);
SubtractFromCustomerBalance(customer, grandTotal);
}
private void SubtractFromCustomerBalance(Customer customer, Double grandTotal) {
customer.DeductFromAccountBalance(grandTotal);
}
private Double AddTax(Double subTotal) {
return subTotal * Tax;
}
private Double SubtractDiscounts(Double subTotal) {
for(Product product : Products){
subTotal -= product.AvailableDiscounts;
}
return subTotal;
}
private Double CalculateSubtotal() {
Double subTotal = 0d;
for(Product product : Products){
subTotal += product.Price;
}
return subTotal;
}
}
public class Customer {
public void DeductFromAccountBalance(Double amount) {
// deduct from balance
}
}
public class Product {
public Double Price;
public Double AvailableDiscounts;
}
 
 

最新文章

  1. 微信支付(.NET版)
  2. JAVA 教程推荐
  3. java微信开发(wechat4j)——发送客服消息
  4. 小菜鸟学 MQ(三)
  5. IE 下加载jQuery
  6. SQLite判断某表是否存在
  7. eclipse svn 修改了类名之后提交
  8. 武汉科技大学ACM:1004: Lake and Island
  9. ISO9126 质量模型
  10. 使用composer更新thinkphp5或则yii2的版本
  11. 配置GO开发环境
  12. 颜色空间之CIE2000色差公式
  13. XamarinAndroid组件教程RecylerView自定义适配器动画
  14. web工程启动时,在一个类中延迟加载Bean,因为该Bean类可能还没被JVM加载
  15. JQuery中$.cookie()方法的使用[转]
  16. CRC分段校验
  17. php递归获取目录下所有文件
  18. odoo开发环境搭建(二):安装Ubuntu 17虚拟机
  19. js节流函数高级版
  20. Centos7安装Openresty

热门文章

  1. How Tomcat Works(七)
  2. 创建类模式(四):原型(Prototype)
  3. SOA服务开发小计
  4. as自定义菜单。
  5. xx.exe 中的 0x7c92e4df 处最可能的异常: 0xC0000008: An invalid handle was specified
  6. atprogram.exe : Atmel Studio Command Line Interface
  7. MySQL通配符过滤
  8. ASP.NET中上传并读取Excel文件数据
  9. js日期计算及快速获取周、月、季度起止日
  10. Codeforces Gym 100803F There is No Alternative 暴力Kruskal