设计数据结构的时候常常为了性能考虑,很容易引入一些冗余的属性,不是说多余的属性不好,我们应该按照一个正常的思维方法去设计数据结构。
看看一个记录路线的数据结构的例子,一条路线有起点,终点以及距离三个基本的信息,第一种设计方式如下,分别用三个属性值记录三个值
import java.awt.Point; public class Line { public Point start; public Point end; public double distance; }
我们可以看出距离是受另外起点和终点控制的,它们的变化会导致距离值的变化,所以第二种设计我们考虑使用一个方法来记录距离的信息如下
import java.awt.Point; public class Line { public Point start; public Point end; public double distance(){ return start.distance(end); } }
这种设计和数据库的范式原则原理上也是一样的(比如通过个人信息的出生年份即可推算出年龄信息,所以没必要多设计一个字段保存年龄信息)但是实际开发过程中,我们为了业务的方便或者是出于性能的考虑,我们可能会考虑设计缓存来记录计算结果,第三种设计方式如下
import java.awt.Point; public class Line { public Point start; public Point end; public boolean changed = true; public double distance; public Point getStart() { return start; } public void setStart(Point start) { this.start = start; changed = true; } public Point getEnd() { return end; } public void setEnd(Point end) { this.end = end; changed = true; } public double distance(){ if(changed){ distance = start.distance(end); changed = false; } return distance; } }
建议尽量使用get/set来获取和设置属性信息,如上面的例子,可以很方便地添加缓存控制。