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; }
            }
        }

    总结

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

  • 相关阅读:
    如何进行端到端开发? | 我的物联网成长记
    华为OceanConnect物联网平台概念全景 | 我的物联网成长记
    使用T4模板生成MySql数据库实体类
    Windows Server 创建环回网卡
    使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)
    Agile已死, Agility长存
    ASP.NET Identity 使用 RoleManager 进行角色管理 (VS2013RC)
    Visual Studio调试技巧 -- Attach to Process
    一文搞懂 Elasticsearch 之 Mapping
    看完这篇还不会 Elasticsearch 搜索,那我就哭了!
  • 原文地址:https://www.cnblogs.com/springyangwc/p/2054774.html
Copyright © 2011-2022 走看看