《重构:改善既有代码的设计》读书笔记3 重新组织数据

(1)self encapsulate field 自封装字段。

不要直接访问字段,为这个字段建立取值/设置函数。 好处是:子类取值时可以通过覆盖而进行值校验。

(2)replace data value with object  以对象取代数据值

开发初期,往往以简单的数据项表示简单的数据。但随后会发现,比如phonenumber需要格式化,抽取区号之类的行为,如果数据项只有一两个,可以把相关函数放入所在对象里。

(3) change value to reference 将值对象改为引用对象

对象要区分值对象还是实体对象(引用对象),值对象的使用一般在每一次出现的地方都是新的实例,可以对比基本类型一样,每一个基本类型,都是在内存中唯一分配;实体对象,基本上多对一的时候都是只存在一个对象实例,这个没有什么异议;

  在对象创建工厂函数--存入map中,并提供访问对象的访问点 get--从map中获取

(4) change reference to value

值对象有一个非常重要的特性,它们应该是不可变的。保证这一点,就可以放心的用多个对象表示同一事物。  equals  hashCode方法

(5)以对象取代数组  

一个数组容纳了很多种不同的对象,这会给用户带来麻烦,他们那很难记住数组的第几个是什么。

新建一个类表示数组的所有信息,在里面用字段表示一个数组,并通过set get 对数组的各个数据进行访问。

(7) change unidrectional association to bidirectional 将单向关联改为双向关联    一个类的修改 引发另一个类的变化

两个类对需要对方的特性,但其间只有一条单向链接。(order customer)

Order Customer ----> setCustomer(Customer customer){this.customer=customer;customer.addOrders(this);}   一对多时    一(Order)控制关联关系。

(8)将双向关联改为单向关联      除非现有Customer对象 否则不会存在Order对象  将Order到Customer的连接移除      将Customer对象作为参数传递给用户

(9)以字面常量取代魔数。  魔数是指拥有特殊意义,却又不能明确表现出这种意义的数字。 一旦这些数发生改变,你需要在程序中找到所有的魔法数。

  static final double PI=3.14

(10) Encapsulate Field  封装字段

  private String name;

  public String getName(){return name;}

  public String setName(String name){this.name=name;}

(11)Encapsulate Collection 封装集合

  private Set cources;

  记得不要把set 赋值给cources,因为修改set后,cources也会改变,必须创建一个set副本  比如 cources.addAll(set)

(12)Replace record with data class 以数据类取代记录

  1、新建一个类,表示这个结构

  2、对于记录中的每一项数据,在新建的类中建立一个对应的private字段,并提供相应的取值/设置函数

(13)Replace type code with class 以类取代类型码   

把数值换成一个类,编译器就可以对这个类进行检验。

  public static final int O=0;

  public static final int A=1;

  public static final int B=2;

=>enum

原文地址:https://www.cnblogs.com/zdcsmart/p/12487701.html