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

    Move Method

    概述

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

    动机(Motivation)

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

    示例

      public class MoveMethod
        { 
            private AccountType _type;
            private int _daysOverdrawn;
            public double OverDraftCharge()
            {
                if (_type.IsPremium())
                {
                    double result = 10;
                    if (_daysOverdrawn > 7)
                        result += (_daysOverdrawn - 7) * 0.85;
                    return result;
                }
                else
                    return _daysOverdrawn * 1.75;
            }
            public double BankCharge()
            {
                double result = 4.5;
                if (_daysOverdrawn > 0)
                    result += OverDraftCharge();
                return result;
            }
        }
    
        public class AccountType
        {
            public bool IsPremium()
            {
                return true;
            }
        }

    改为

        public class MoveMethod
        {
            private AccountType _type;
    
            public double BankCharge()
            {
                double result = 4.5;
                if (_type._daysOverdrawn > 0)
                    result += _type.OverDraftCharge();
                return result;
            }
        }
    
        public class AccountType
        {
            private int _daysOverdrawn;
    
            public int DaysOverdrawn
            {
                get { return _daysOverdrawn; }
                set { _daysOverdrawn = value; }
            }
    
            public bool IsPremium()
            {
                return true;
            }
    
            public double OverDraftCharge()
            {
                if (IsPremium())
                {
                    double result = 10;
                    if (_daysOverdrawn > 7)
                        result += (_daysOverdrawn - 7) * 0.85;
                    return result;
                }
                else
                    return _daysOverdrawn * 1.75;
            }
        }

    Move Field(搬移值域)

    概述

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

    动机(Motivation)

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

    示例

        public class MoveMethod
        {
            private AccountType _type;
            private double _interestRate;
            public double InterestForAmountDay(double amount,int days)
            {
                return _interestRate * amount * days / 365;
            }
        }
    
        public class AccountType
        {
    
        }

    改为

        public class MoveMethod
        {
            private AccountType _type;
    
            public double InterestForAmountDay(double amount, int days)
            {
                return _type.InterestRate * amount * days / 365;
            }
        }
    
        public class AccountType
        {
            private double _interestRate;
            public double InterestRate
            {
                get { return _interestRate; }
                set { _interestRate = value; }
            }
        }

    总结

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

  • 相关阅读:
    Windows 配置 allure report 环境
    ruby 异常处理 begin rescue end
    ruby 安装 mysql2 命令
    Linux 新建文件/文件夹,删除文件文件夹,查找文件 打开文件
    Ubuntu 共享 转载
    单元测试框架 unittest 的运行方法if __name__ == '__main__': unittest.main()
    Python 字典和json的本质区别(个人理解)

    接口自动化大致流程。
    iOS开发UI篇—CAlayer(自定义layer)
  • 原文地址:https://www.cnblogs.com/springyangwc/p/2054774.html
Copyright © 2011-2022 走看看