zoukankan      html  css  js  c++  java
  • 步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Move Field)

    Move Method

    概述

    程序中,有个函数与其所驻class之外的另一个class进行更多交流,调用后者或被后者调用

    动机(Motivation)

    如果一个class有太多行为,或如果一个class与另一个class有太多合作而形成高度耦合(highly coupled),我们就会搬移函数。通过这种手段,我们可以使系统中的classes更简单,这些classes最终也将更干净利落地实现系统交付的任务。

    示例

    01 public class MoveMethod
    02   {
    03       private AccountType _type;
    04       private int _daysOverdrawn;
    05       public double OverDraftCharge()
    06       {
    07           if (_type.IsPremium())
    08           {
    09               double result = 10;
    10               if (_daysOverdrawn > 7)
    11                   result += (_daysOverdrawn - 7) * 0.85;
    12               return result;
    13           }
    14           else
    15               return _daysOverdrawn * 1.75;
    16       }
    17       public double BankCharge()
    18       {
    19           double result = 4.5;
    20           if (_daysOverdrawn > 0)
    21               result += OverDraftCharge();
    22           return result;
    23       }
    24   }
    25  
    26   public class AccountType
    27   {
    28       public bool IsPremium()
    29       {
    30           return true;
    31       }
    32   }

    改为

    01 public class MoveMethod
    02 {
    03     private AccountType _type;
    04  
    05     public double BankCharge()
    06     {
    07         double result = 4.5;
    08         if (_type._daysOverdrawn > 0)
    09             result += _type.OverDraftCharge();
    10         return result;
    11     }
    12 }
    13  
    14 public class AccountType
    15 {
    16     private int _daysOverdrawn;
    17  
    18     public int DaysOverdrawn
    19     {
    20         get return _daysOverdrawn; }
    21         set { _daysOverdrawn = value; }
    22     }
    23  
    24     public bool IsPremium()
    25     {
    26         return true;
    27     }
    28  
    29     public double OverDraftCharge()
    30     {
    31         if (IsPremium())
    32         {
    33             double result = 10;
    34             if (_daysOverdrawn > 7)
    35                 result += (_daysOverdrawn - 7) * 0.85;
    36             return result;
    37         }
    38         else
    39             return _daysOverdrawn * 1.75;
    40     }
    41 }

    Move Field(搬移值域)

    概述

    在target class建立一个new field,修改source field的所有用户,令它们改用new field。

    动机(Motivation)

    对于一个field(值域),在其所驻class之外的另一个class中有更多函数使用了它,我就会考虑搬移这个field。

    示例

    01 public class MoveMethod
    02 {
    03     private AccountType _type;
    04     private double _interestRate;
    05     public double InterestForAmountDay(double amount,int days)
    06     {
    07         return _interestRate * amount * days / 365;
    08     }
    09 }
    10  
    11 public class AccountType
    12 {
    13  
    14 }

    改为

    01 public class MoveMethod
    02 {
    03     private AccountType _type;
    04  
    05     public double InterestForAmountDay(double amount, int days)
    06     {
    07         return _type.InterestRate * amount * days / 365;
    08     }
    09 }
    10  
    11 public class AccountType
    12 {
    13     private double _interestRate;
    14     public double InterestRate
    15     {
    16         get return _interestRate; }
    17         set { _interestRate = value; }
    18     }
    19 }

    总结

    把公用函数和值域放到其基类中去,方便其它函数调用。

  • 相关阅读:
    MaaS系统概述
    流处理认识
    事务补偿
    Hystrix原理与实战
    RPC概念和框架
    git remote: error: hook declined to update
    Unity CombineTexture
    Windows Powershell统计代码行数
    unity面试题二
    unity面试题一
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2054858.html
Copyright © 2011-2022 走看看