• 31天重构指南之二十二:分解方法


    今天要说的重构没有明确的出处,分解方法是我给它起的名字,我相信肯定还有别人做过类似的重构但却叫别一个名字,如果你在看完本文后觉得还有比“分解方法”更好的名字,请通知我。

    分解重构是元重构的一种,所做的事情就是不停的分解方法,直到将一个大方法分解为可读性更好的若干个小方法。本文一会要遇到的例子是虚构的,因为现实中AcceptPayment方法不会做这么多的事情。

    下面我们通过几次分解将AcceptPayment分解成若干个小方法。

       1: public class CashRegister
       2: {
       3:     public CashRegister()
       4:     {
       5:         Tax = 0.06m;
       6:     }
       7:  
       8:     private decimal Tax { get; set; }
       9:  
      10:     public void AcceptPayment(Customer customer, IEnumerable<Product> products, decimal payment)
      11:     {
      12:         decimal subTotal = 0m;
      13:         foreach (Product product in products)
      14:         {
      15:             subTotal += product.Price;
      16:         }
      17:  
      18:         foreach(Product product in products)
      19:         {
      20:             subTotal -= product.AvailableDiscounts;
      21:         }
      22:  
      23:         decimal grandTotal = subTotal * Tax;
      24:  
      25:         customer.DeductFromAccountBalance(grandTotal);
      26:     }
      27: }
      28:  
      29: public class Customer
      30: {
      31:     public void DeductFromAccountBalance(decimal amount)
      32:     {
      33:         // deduct from balance
      34:     }
      35: }
      36:  
      37: public class Product
      38: {
      39:     public decimal Price { get; set; }
      40:     public decimal AvailableDiscounts { get; set; }
      41: }
     
    如你所看到的,AcceptPayment方法中许多代码可以提取到独立的方法中,所以我们应用“提取方法”重构将这些代码提取到独立的方法中,下面是提取后的代码:
       1: public class CashRegister
       2: {
       3:     public CashRegister()
       4:     {
       5:         Tax = 0.06m;
       6:     }
       7:  
       8:     private decimal Tax { get; set; }
       9:     private IEnumerable<Product> Products { get; set; }
      10:  
      11:     public void AcceptPayment(Customer customer, IEnumerable<Product> products, decimal payment)
      12:     {
      13:         decimal subTotal = CalculateSubtotal();
      14:  
      15:         subTotal = SubtractDiscounts(subTotal);
      16:  
      17:         decimal grandTotal = AddTax(subTotal);
      18:  
      19:         SubtractFromCustomerBalance(customer, grandTotal);
      20:     }
      21:  
      22:     private void SubtractFromCustomerBalance(Customer customer, decimal grandTotal)
      23:     {
      24:         customer.DeductFromAccountBalance(grandTotal);
      25:     }
      26:  
      27:     private decimal AddTax(decimal subTotal)
      28:     {
      29:         return subTotal * Tax;
      30:     }
      31:  
      32:     private decimal SubtractDiscounts(decimal subTotal)
      33:     {
      34:         foreach(Product product in Products)
      35:         {
      36:             subTotal -= product.AvailableDiscounts;
      37:         }
      38:         return subTotal;
      39:     }
      40:  
      41:     private decimal CalculateSubtotal()
      42:     {
      43:         decimal subTotal = 0m;
      44:         foreach (Product product in Products)
      45:         {
      46:             subTotal += product.Price;
      47:         }
      48:         return subTotal;
      49:     }
      50: }
      51:  
      52: public class Customer
      53: {
      54:     public void DeductFromAccountBalance(decimal amount)
      55:     {
      56:         // deduct from balance
      57:     }
      58: }
      59:  
      60: public class Product
      61: {
      62:     public decimal Price { get; set; }
      63:     public decimal AvailableDiscounts { get; set; }
      64: }
     

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

    PS:个人认为“分解方法”重构和“提取方法”重构好像是一个重构,只是名字不一样吗?

  • 相关阅读:
    【git】Git回退代码到指定版本
    【ts】 VSCode自动编译TypeScript终端报错
    【js】 vue 2.5.1 源码学习(十二)模板编译
    【js】vue 2.5.1 源码学习 (十一) 模板编译compileToFunctions渲染函数
    【js】vue 2.5.1 源码学习 (十) $mount 挂载函数的实现
    【js】vue 2.5.1 源码学习 (九) 响应数组对象的变
    【js】Vue 2.5.1 源码学习 (八)响应式入口observe
    【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路
    【js】 vue 2.5.1 源码学习(六) initProxy initLifeCycle 渲染函数的作用域代理
    antdv中表单添加电话校验
  • 原文地址:https://www.cnblogs.com/zhangronghua/p/1584461.html
Copyright © 2020-2023  润新知