博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)...
阅读量:7010 次
发布时间:2019-06-28

本文共 2737 字,大约阅读时间需要 9 分钟。

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

总结

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

转载地址:http://zvttl.baihongyu.com/

你可能感兴趣的文章
xxl-job安装教程
查看>>
SpringBoot(十八)@value、@Import、@ImportResource、@PropertySource
查看>>
[dubbo] Dubbo API 笔记——配置参考
查看>>
The last access date is not changed even after reading the file on Windows 7
查看>>
SQL Server 字符串处理函数
查看>>
恢复系统管理员密码的五大奇招
查看>>
英语形容“漂亮女孩”知多少
查看>>
GridView 获取当前行的索引值
查看>>
PHPCMS V9二次开发:内容模块PC标签调用详解
查看>>
Virtual-Key Codes
查看>>
Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
查看>>
xmapp 404设置
查看>>
[js - 算法可视化] 汉诺塔(Hanoi)演示程序
查看>>
Note:JSON
查看>>
分享.NET 3.0的书籍下载(持续更新中)
查看>>
几道有意思的逻辑分析题
查看>>
apache svn下新建一个项目
查看>>
高效 JavaScript 单元测试(转)
查看>>
[Windows Azure] What is a cloud service?
查看>>
使用C#的泛型队列Queue实现生产消费模式
查看>>