(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