打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)

步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)

2011-05-23 21:55byspring yang,991visits,网摘,收藏,编辑

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 }

总结

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c++ 静态数据成员和静态成员函数
wpf datagrid如何添加汇总行
面向对象设计(一)——对象和类的理解
C++中的重载、覆盖、隐藏机制
殊途同归 四个程序员的一天
enum使用详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服