步步为营 .NET 代码重构学习笔记 八
一、Introduce Foreign Method(引入外加函数)
动机(Motivation)
在client class 中建立一个函数,并以一个server class实体作为第一引数(argument)。
示例
1 DateTime newStart = DateTime.Now.AddDays(1);
改为
1 public DateTime NextDate()
2 {
3 return DateTime.Now.AddDays(1);
4
5 }
二、Introduce Local Extension(引入本地扩展)
动机(Motivation)
建立一个新class,使它包含这些额外函数。让这个扩展品成为source class的subclass(子类)或wrapper(外覆类)。
示例
01 protected void Main()
02 {
03 Computer _computer;
04 StringBuilder strCom = new StringBuilder();
05 strCom.AppendLine( "你的电脑配置如下:" );
06 strCom.AppendLine( "主板是:" + _computer.MainBoard());
07 strCom.AppendLine( "处理器是:" + _computer.Cpu());
08 strCom.AppendLine( "显卡是:" + _computer.PhenoType());
09 strCom.AppendLine( "内存是:" + _computer.Memory());
10 strCom.AppendLine( "硬盘是:" + _computer.HardDisk());
11 strCom.AppendLine( "显示器是:" + _computer.Display());
12 strCom.AppendLine( "己组装完成" );
13 Console.WriteLine(strCom.ToString);
14 }
改为
01 protected void Main()
02 {
03 Console.WriteLine(ShowComputerConfigure());
04 }
05
06 public string ShowComputerConfigure()
07 {
08 Computer _computer;
09 StringBuilder strCom = new StringBuilder();
10 strCom.AppendLine( "你的电脑配置如下:" );
11 strCom.AppendLine( "主板是:" + _computer.MainBoard());
12 strCom.AppendLine( "处理器是:" + _computer.Cpu());
13 strCom.AppendLine( "显卡是:" + _computer.PhenoType());
14 strCom.AppendLine( "内存是:" + _computer.Memory());
15 strCom.AppendLine( "硬盘是:" + _computer.HardDisk());
16 strCom.AppendLine( "显示器是:" + _computer.Display());
17 strCom.AppendLine( "己组装完成" );
18
19 return strCom.ToString();
20 }
三、Self Encapsulate Field(自封装值域)
动机(Motivation)
为这个值域建立取值/设置函数(getting/setting methods),并且只以这些函数来访问值域。
示例
1 public int _low, _high;
2 public bool Includes( int arg)
3 {
4 return arg >= _low && arg <= _high;
5 }
改为
01 private int _low, _high;
02
03 public int Low
04 {
05 get { return _low; }
06 set { _low = value; }
07 }
08
09 public int High
10 {
11 get { return _high; }
12 set { _high = value; }
13 }
14
15 public bool Includes( int arg)
16 {
17 return arg >= Low && arg <= High;
18 }
四、Replace Data Value with Object(以对象取代数据值)
动机(Motivation)
将数据项变成一个对象
示例
1 public class Customer
2 {
3 private string _name;
4 public string Name
5 {
6 get { return _name; }
7 set { _name = value; }
8 }
9 }
改为
01 public class Customer
02 {
03 private string _name;
04 public string Name
05 {
06 get { return _name; }
07 set { _name = value; }
08 }
09 public Customer( string name)
10 {
11 this ._name = name;
12 }
13 }
引用时
1 string name = new Customer( "spring yang" );
五、Change Value to Referencce(将实值对象改为引用对象)
动机(Motivation)
将value object(实值对象)变成一个reference object(引用对象)
示例
1 public void GetCustomers()
2 {
3 string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };
4 }
改为
01 private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();
02
03 public void GetCustomers()
04 {
05 string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),
06 dicUserName.TryGetValue( "Associated Coffee" ) };
07 }
08
09 private void LoadCustomers()
10 {
11 AddCustomer( "Spring Yang" );
12 AddCustomer( "Lemon Car" );
13 AddCustomer( "Associated Coffee" );
14 }
15
16 private void AddCustomer( string name)
17 {
18 dicUserName.Add(name, new Customer(name));
19 }
六、Change Reference to Value(将引用对象改为实值对象)
动机(Motivation)
reference object(引用对象),很小且不可变(immutable),而且不易管理。
示例
01 private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();
02
03 public void GetCustomers()
04 {
05 string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),
06 dicUserName.TryGetValue( "Associated Coffee" ) };
07 }
08
09 private void LoadCustomers()
10 {
11 AddCustomer( "Spring Yang" );
12 AddCustomer( "Lemon Car" );
13 AddCustomer( "Associated Coffee" );
14 }
15
16 private void AddCustomer( string name)
17 {
18 dicUserName.Add(name, new Customer(name));
19 }
改为
1 public void GetCustomers()
2 {
3 string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };
4 }
七、Replace Array with Object(以对象取代数组)
动机(Motivation)
以对象替换数组。对于数组中的每个元素,以一个值域表示。
示例
1 public void Main()
2 {
3 string [] UserInfo = new string [3];
4 UserInfo[0] = "1" ;
5 UserInfo[1] = "spring yang" ;
6 UserInfo[2] = "IT" ;
7 }
改为
1 public void Main()
2 {
3 User user = new User();
4 user.ID = "1" ;
5 user.Name = "spring yang" ;
6 user.Depart = "IT" ;
7 }
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于步步为营 .NET 代码重构学习笔记 八的详细内容...