学习重构(4)-重新组织数据

柔情痞子 提交于 2019-12-03 13:42:04

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内的重复数据进行同步控制。

应用场景:

示例:

未完待续

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!