学习重构(4)-重新组织数据
1. self encapsulate field(自封装值域)
你直接访问一个值域,但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设值函数(get/set),并且只以这些函数来访问值域。
应用场景:其实这种为每个变量提供两个操作函数的做法并不是百分百可取的,这样做的一个好处就是做到数据存储和使用隔离,尤其对于对象数据的保护是非常好的,可以返回给调用方一个数据拷贝,不用担心自己的数据会被篡改。但是也有不好的地方,就是会带来非常多的小函数,无形中增大了类的体量。
示例:
private int _low, _high
boolean includes (int arg) {
return arg >= _low && arg <= _high;
}
重构为:
private int _low, _high
boolean includes (int arg) {
return arg >= getlow() && arg <= gethigh();
}
int getlow() {return _low};
int gethigh() {return _high};
2. replace data value with object(以对象取代数据值)
将一些数据按照一定的规则或特征整合到一个对象中
应用场景:开发代码初期,仅需要一些简单的数据,比如一个人的基本信息:姓名,身份证号码,随着时间的推移,还需要其他的数据:手机号,地址,学历等等,这样就会罗列一排的变量,每次处理一个人的数据是,要传入很多参数。此时将这个人的信息就可以规整到一个类里面,仅声明一个对象即可,而且随着这个人信息的持续丰富,不会每次都冲击到原有的接口。
示例:略
3. change value to reference(将实值对象改为引用对象)
你有一个class,衍生出许多相等的实体,你希望将他们替换为单对象。将这个实值对象变成一个引用对象。
应用场景:我们一般使用一个类的时候都是需要了就new一个对象出来,这些每次new出来的对象就是实值对象,但很多场景下我们会改变这些对象的内部状态,并且需要对这些对象进行传递,此时用实值对象来满足这个诉求就会显得非常笨拙,比如new出来一个car,然后设置下品牌是宝马,设置下颜色是蓝色等等。这种场景下我们就需要一个引用对象,同一个类中可以是成员变量,不同的类中使用可以使用类似工厂、单例等模式来有一个对象管理类来供其他类取用。
示例:略
4. change reference to value(将引用对象改为实值对象)
和3相反。
应用场景:实值对象一个重要特点是保持不变,这样可以保证每个使用者不用担心数据的变化和同步。引用对象往往会让逻辑变得复杂,所以使用的时候要做好选择。
示例:略
5. replace array with object(以对象取代数组)
以对象替换数组,对于数组中的每个元素,以一个值域表示。
应用场景:数组是一种常见的用于组织数据的结构体。不过它们应该只用于以某种顺序容纳一组相似对象。有时候你会发现,一个数组容纳了数种不同对象,这会给数组用户带来麻烦,因为它们很难记住像“数组的第一个元素是人名“这样的约定。对象就不一样。可以通过命名和函数来传递一些信息。让使用者更容易理解。
示例:
string[] row = new string[3];
row[0] = "liverpool";
row[1] = "15";
重构为:
performance row = new performance();
row.setname("liverpool");
row.setwins("15");
6. duplicate observed data(赋值“被监视数据”)
你有一笔domain data置身于gui空间中,而domain method需要访问它们。将这笔数据拷贝到一个domain object中,建立一个observer模式,用意对domain object和gui object内的重复数据进行同步控制。
应用场景:
示例:
未完待续
推荐阅读