惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
U
Unit 42
A
About on SuperTechFans
宝玉的分享
宝玉的分享
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog
I
Intezer
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
V
V2EX
L
LangChain Blog
AI
AI
G
GRAHAM CLULEY
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
Docker
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
I
InfoQ
Y
Y Combinator Blog
C
Comments on: Blog
GbyAI
GbyAI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
H
Help Net Security
Vercel News
Vercel News
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿

博客园 - 网络金领

C# WinForm 导出导入Excel/Doc 完整实例教程[使用Aspose.Cells.dll] DataTable的数据批量写入数据库 C# .NET锁屏程序(顺带屏蔽任务管理器) 步步为营 .NET 代码重构学习 十一 - 网络金领 步步为营 .NET 代码重构学习笔记 十 步步为营 .NET 代码重构学习笔记 九 步步为营 .NET 代码重构学习笔记 八 步步为营 .NET 代码重构学习笔记 七 步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm) 步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable) 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method) 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method) 步步为营 .NET 代码重构学习笔记 一、为何要代码重构 步步为营 .NET 设计模式学习笔记 二十四、Factory Method(工厂方法模式) 步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式) 步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式) 步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式) 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式) 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
步步为营 .NET 代码重构学习笔记 六、移动函数和移动值域(Move Method And Move Field)
网络金领 · 2011-06-02 · via 博客园 - 网络金领

Move Method

概述

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

动机(Motivation)

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

示例

01 public class MoveMethod
03       private AccountType _type;
04       private int _daysOverdrawn;
05       public double OverDraftCharge()
07           if (_type.IsPremium())
09               double result = 10;
10               if (_daysOverdrawn > 7)
11                   result += (_daysOverdrawn - 7) * 0.85;
12               return result;
15               return _daysOverdrawn * 1.75;
17       public double BankCharge()
19           double result = 4.5;
20           if (_daysOverdrawn > 0)
21               result += OverDraftCharge();
22           return result;
26   public class AccountType
28       public bool IsPremium()
30           return true;

改为

01 public class MoveMethod
03     private AccountType _type;
05     public double BankCharge()
07         double result = 4.5;
08         if (_type._daysOverdrawn > 0)
09             result += _type.OverDraftCharge();
10         return result;
14 public class AccountType
16     private int _daysOverdrawn;
18     public int DaysOverdrawn
20         get { return _daysOverdrawn; }
21         set { _daysOverdrawn = value; }
24     public bool IsPremium()
29     public double OverDraftCharge()
31         if (IsPremium())
33             double result = 10;
34             if (_daysOverdrawn > 7)
35                 result += (_daysOverdrawn - 7) * 0.85;
36             return result;
39             return _daysOverdrawn * 1.75;

Move Field(搬移值域)

概述

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

动机(Motivation)

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

示例

01 public class MoveMethod
03     private AccountType _type;
04     private double _interestRate;
05     public double InterestForAmountDay(double amount,int days)
07         return _interestRate * amount * days / 365;
11 public class AccountType

改为

01 public class MoveMethod
03     private AccountType _type;
05     public double InterestForAmountDay(double amount, int days)
07         return _type.InterestRate * amount * days / 365;
11 public class AccountType
13     private double _interestRate;
14     public double InterestRate
16         get { return _interestRate; }
17         set { _interestRate = value; }

总结

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