zoukankan      html  css  js  c++  java
  • 重构22-Break Method(重构方法)

    这个重构是一种元重构(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;
    }
     
     





  • 相关阅读:
    gc buffer busy解释
    验证db time
    如何优化log file sync
    客户数据库出现大量cache buffer chains latch
    一份awr分析
    Statspack报告中Rollback per trans过高怎么办
    awr分析要点记录
    Oracle AWR报告及统计数据之DB Time说明
    Oracle 相关视图tips
    struts2 action 乱码
  • 原文地址:https://www.cnblogs.com/jgig11/p/5786361.html
Copyright © 2011-2022 走看看