zoukankan      html  css  js  c++  java
  • 31天重构指南之十三:提取方法对象

    这篇文章要说的重构来自于Martin Fowlwrs的重构列表,你可以在这里查看原始描述

    这是一个不常用的重构。当你发现一个方法中存在过多的局部变量时,你可以通过使用“提取方法对象”重构来引入一些方法,每个方法完成任务的一个步骤,这样可以使得程序更具有可读性。

        1: public class OrderLineItem

       2: {
       3:     public decimal Price { get; private set; }
       4: }
       5:  
       6: public class Order
       7: {
       8:     private IList<OrderLineItem> OrderLineItems { get; set; }
       9:     private IList<decimal> Discounts { get; set; }
      10:     private decimal Tax { get; set; }
      11:  
      12:     public decimal Calculate()
      13:     {
      14:         decimal subTotal = 0m;
      15:  
      16:         // Total up line items
      17:         foreach (OrderLineItem lineItem in OrderLineItems)
      18:         {
      19:             subTotal += lineItem.Price;
      20:         }
      21:  
      22:         // Subtract Discounts
      23:         foreach (decimal discount in Discounts)
      24:             subTotal -= discount;
      25:  
      26:         // Calculate Tax
      27:         decimal tax = subTotal * Tax;
      28:  
      29:         // Calculate GrandTotal
      30:         decimal grandTotal = subTotal + tax;
      31:  
      32:         return grandTotal;
      33:     }
      34: }
     

    下面是重构后的代码中,我们引入了OrderCalculator类,该类实现了所有的计算方法,Order类将自身传递给OrderCalculator类并调用Calculate方法完成计算。

       1: public class OrderLineItem
       2: {
       3:     public decimal Price { get; private set;}
       4: }
       5:  
       6: public class Order
       7: {
       8:     public IEnumerable<OrderLineItem> OrderLineItems { get; private set;}
       9:     public IEnumerable<decimal> Discounts { get; private set; }
      10:     public decimal Tax { get; private set; }
      11:  
      12:     public decimal Calculate()
      13:     {
      14:         return new OrderCalculator(this).Calculate();
      15:     }
      16: }
      17:  
      18: public class OrderCalculator
      19: {
      20:     private decimal SubTotal { get; set;}
      21:     private IEnumerable<OrderLineItem> OrderLineItems { get; set; }
      22:     private IEnumerable<decimal> Discounts { get; set; }
      23:     private decimal Tax { get; set; }
      24:  
      25:     public OrderCalculator(Order order)
      26:     {
      27:         OrderLineItems = order.OrderLineItems;
      28:         Discounts = order.Discounts;
      29:         Tax = order.Tax;
      30:     }
      31:  
      32:     public decimal Calculate()
      33:     {
      34:         CalculateSubTotal();
      35:  
      36:         SubtractDiscounts();
      37:  
      38:         CalculateTax();
      39:  
      40:         return SubTotal;
      41:     }
      42:  
      43:     private void CalculateSubTotal()
      44:     {
      45:         // Total up line items
      46:         foreach (OrderLineItem lineItem in OrderLineItems)
      47:             SubTotal += lineItem.Price;
      48:     }
      49:  
      50:     private void SubtractDiscounts()
      51:     {
      52:         // Subtract Discounts
      53:         foreach (decimal discount in Discounts)
      54:             SubTotal -= discount;
      55:     }
      56:  
      57:     private void CalculateTax()
      58:     {
      59:         // Calculate Tax
      60:         SubTotal += SubTotal * Tax;
      61:     }
      62: }
     

    原文链接:http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/13/refactoring-day-13-extract-method-object.aspx

    PS:我个人不是很喜欢重构,我还是喜欢提取方法这个重构。

  • 相关阅读:
    Openstack Swift 原理、架构与 API 介绍
    ReentrantLock 以及 AQS 实现原理
    AtomicInteger源码分析——基于CAS的乐观锁实
    深入浅出ThreadLocal
    Spring IOC的理解
    tomcat8 注册成服务后接sql数据失败
    Video.js 截图 Failed to execute 'drawImage' on 'CanvasRenderingContext2D'
    H5 播放Hls
    Video.js 源码浅析
    Hls流播放延时
  • 原文地址:https://www.cnblogs.com/zhangronghua/p/1576412.html
Copyright © 2011-2022 走看看