第八章:重新组织数据
- 1、Self Encapsulate Field(自封装字段)
- 2、Replace Data Value With Object(以对象取代数据值)
- 3、Change Value to Reference(将值对象改为引用对象)
- 4、Change Reference to Value(将引用对象改为值对象)
- 5、Replace Array with Object(以对象取代数组)
- 6、Duplicate Observed Data(复制“被监视数据”)
- 7、Change Unidirectional Associate to Bidirectional(将单项关联改为双向关联)
- 8、Change Bidirectional Associate to Unidirectional(将双向关联改为单项关联)
- 9、Replace Magic Number with Symbolic Constant(以字面常量取代魔法书)
- 10、Encapsulated Field(封装字段)
- 11、Encapsulated Collection(封装集合)
1、Self Encapsulate Field(自封装字段)
与某字段的耦合关系逐渐变得笨拙。
为这个字段建立强制/设置函数,并以这些函数开访问字段。
private string name;
public string GetName(){
return name;
}
public void SetName(string _name){
name = _name;
}
或者:
private string name;
public String Name {
get{ return name; }
Set{ name = value; }
}
或者:
public String Name { get; Set; }
- 为字段建立Get Set方法,
- 修改该字段的所有引用点
2、Replace Data Value With Object(以对象取代数据值)
某一数据,需要与其他数据一起使用,或者需要对数据进行多项处理
把数据封装成对象,把处理方法移进去
3、Change Value to Reference(将值对象改为引用对象)
一个类存在许多类型、职责、功能相同的实例,
将这些对象变成引用对象
- 通过Replace Constructor with Factory Method(以工厂函数取代构造函数),把产生的对象存进集合、字典等中
4、Change Reference to Value(将引用对象改为值对象)
有一个对象,很小且不可变,并不易管理。把他变成一个值对象。
是用引用对象还是用值对象,这是一个问题。
个人建议先使用值对象,当值对象难以使用时再改为引用对象
5、Replace Array with Object(以对象取代数组)
有一个数组,其中的元素各自代表不同的东西。
以对象替换数组,对于数组中的每一个元素,以一个字段表示。
string[] student =new string[]{"小明","三一班","150"};
public class Student {
public string name;
public string class;
public string height;
}
6、Duplicate Observed Data(复制“被监视数据”)
- 一个分层良好的系统,应该将处理用户界面和处理业务逻辑的代码分开。
比较有名的就是MVC模式
7、Change Unidirectional Associate to Bidirectional(将单项关联改为双向关联)
两个类都需要使用对方特性,但只有一方(A)引用另一方(B)
给B添加对A的引用。
双向,万恶之源。
8、Change Bidirectional Associate to Unidirectional(将双向关联改为单项关联)
两个类之间有双向关联,但其中一个类如今不在需要另一个类的特性。
去除不必要的关联
9、Replace Magic Number with Symbolic Constant(以字面常量取代魔法书)
有一个字面数值,带有特别含义。
创建一个常量,根据其意义为它命名,并将字面数值替换成这个常量。
return height > 130;
==>:
int FREEHEIGHT = 130;
return height > FREEHEIGHT ;
10、Encapsulated Field(封装字段)
- 请看自封装字段
11、Encapsulated Collection(封装集合)
有个函数返回一个集合,让这个函数返回该集合的一个副本,并再这个类中提供曾/删集合元素的函数。