zoukankan      html  css  js  c++  java
  • 重构13-Extract Method Object(提取方法对象)

    重构来自于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;
    }
    }
     





  • 相关阅读:
    vue --- 全局弹窗,只调用对应实例
    代理相关;win操作
    mongoBD + node + express
    菜鸟初学 node 推荐 亲测easy
    H5 ---- 点击遍历所有标签,复制对应的文本
    async与await初步应用
    C# Enum 添加自定义Attribute,然后通过泛型与反射的方式得到事先定义的标记
    VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误
    C# 获取数组的内存地址
    利用反射插入数据库与更新数据库
  • 原文地址:https://www.cnblogs.com/jgig11/p/5786329.html
Copyright © 2011-2022 走看看