一、Introduce Foreign Method(引入外加函数)
动机(Motivation)
在client class 中建立一个函数,并以一个server class实体作为第一引数(argument)。
示例
1 |
DateTime newStart = DateTime.Now.AddDays(1); |
改为
1 |
public DateTime NextDate()
|
3 |
return DateTime.Now.AddDays(1);
|
二、Introduce Local Extension(引入本地扩展)
动机(Motivation)
建立一个新class,使它包含这些额外函数。让这个扩展品成为source class的subclass(子类)或wrapper(外覆类)。
示例
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);
|
改为
03 |
Console.WriteLine(ShowComputerConfigure());
|
06 |
public string ShowComputerConfigure()
|
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( "己组装完成" );
|
19 |
return strCom.ToString();
|
三、Self Encapsulate Field(自封装值域)
动机(Motivation)
为这个值域建立取值/设置函数(getting/setting methods),并且只以这些函数来访问值域。
示例
1 |
public int _low, _high;
|
2 |
public bool Includes( int arg)
|
4 |
return arg >= _low && arg <= _high;
|
改为
01 |
private int _low, _high;
|
12 |
set { _high = value; }
|
15 |
public bool Includes( int arg)
|
17 |
return arg >= Low && arg <= High;
|
四、Replace Data Value with Object(以对象取代数据值)
动机(Motivation)
将数据项变成一个对象
示例
改为
07 |
set { _name = value; }
|
09 |
public Customer( string name)
|
引用时
1 |
string name = new Customer( "spring yang" );
|
五、Change Value to Referencce(将实值对象改为引用对象)
动机(Motivation)
将value object(实值对象)变成一个reference object(引用对象)
示例
1 |
public void GetCustomers()
|
3 |
string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };
|
改为
01 |
private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();
|
03 |
public void GetCustomers()
|
05 |
string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),
|
06 |
dicUserName.TryGetValue( "Associated Coffee" ) };
|
09 |
private void LoadCustomers()
|
11 |
AddCustomer( "Spring Yang" );
|
12 |
AddCustomer( "Lemon Car" );
|
13 |
AddCustomer( "Associated Coffee" );
|
16 |
private void AddCustomer( string name)
|
18 |
dicUserName.Add(name, new Customer(name));
|
六、Change Reference to Value(将引用对象改为实值对象)
动机(Motivation)
reference object(引用对象),很小且不可变(immutable),而且不易管理。
示例
01 |
private Dictionary< string , Customer> dicUserName = new Dictionary< string , Customer>();
|
03 |
public void GetCustomers()
|
05 |
string [] UserName = { dicUserName.TryGetValue( "Spring Yang" ), dicUserName.TryGetValue( "Lemon Car" ),
|
06 |
dicUserName.TryGetValue( "Associated Coffee" ) };
|
09 |
private void LoadCustomers()
|
11 |
AddCustomer( "Spring Yang" );
|
12 |
AddCustomer( "Lemon Car" );
|
13 |
AddCustomer( "Associated Coffee" );
|
16 |
private void AddCustomer( string name)
|
18 |
dicUserName.Add(name, new Customer(name));
|
改为
1 |
public void GetCustomers()
|
3 |
string [] UserName = { new Customer( "Spring Yang" ), new Customer( "Lemon Car" ), new Customer( "Associated Coffee" ) };
|
七、Replace Array with Object(以对象取代数组)
动机(Motivation)
以对象替换数组。对于数组中的每个元素,以一个值域表示。
示例
3 |
string [] UserInfo = new string [3];
|
5 |
UserInfo[1] = "spring yang" ;
|
改为
3 |
User user = new User();
|
5 |
user.Name = "spring yang" ;
|