上下文
从程序员修炼 :
每一块知识必须有一个单一,明确,权威的系统内表示。
问题
- 如何这句话用在整个在多个地方类直接设置私有成员变量的值一致?
- 这很重要,因为可以在值没有外部依赖?
- 难道重复直接改变那些在除访问其他地方的公共存取私有成员变量?
例
考虑下面的代码:
public class Line {
private boolean changed;
private double length;
private Point start;
private Point end;
public Line( Point p1, Point p2 ) {
this.start = p1;
this.end = p2;
this.changed = true;
}
public void setStart( Point p ) { this.start = p; this.changed = true; }
public void setEnd( Point p ) { this.end = p; this.changed = true; }
public Point getStart() { return this.start; }
public Point getEnd() { return this.end; }
public double getLength() {
if( this.changed ) {
this.length = start.distanceTo( end );
this.changed = false;
}
return this.length;
}
}
即使changed
可变不会暴露(通过公共acccessors或其他方式),代码的同一行基本上重复四次: this.changed = true
(三次)和this.changed = false
(一次)。 同样,分配this.start
和this.end
发生多次。 而不是:
public Line( Point p1, Point p2 ) {
setStart( p1 );
setEnd( p2 );
}
public void setStart( Point p ) { this.start = p; dirty(); }
public void setEnd( Point p ) { this.end = p; dirty(); }
public double getLength() {
if( isDirty() ) {
setLength( getStart().distanceTo( getEnd() ) );
clean();
}
return this.length;
}
更新后的代码非常相似,但所有分配的复制被删除(假设dirty()
和clean()
使用访问器)。 (有一个重复呼叫dirty()
中,这是以前没有的,由于重复使用用于分配的存取方法构造。)
现在的问题是不是关于是否this.changed = true
被更容易地理解为dirty()
澄清
问题是关于是否this.variable = value
是一个“片知识的”,因此应该有一个被一贯使用“单,明确,权威表示”:对应的存取器。 因此一般情况下:
public class C1 {
private Object v;
public C1() {
this.v = new C1();
}
public void m1() {
this.v = new String();
}
public void m2() {
System.out.println( this.v );
}
}
与:
public class C2 {
private Object v;
public C2() {
setV( new C2() );
}
public void m1() {
setV( new String() );
}
public void m2() {
System.out.println( getV() );
}
private void setV( Object o ) { this.v = o; }
private Object getV() { return this.v; }
}
在C1中,变量v
直接分配在多个位置。 在C2,可变v
被直接分配在一个单一的点。 即便如此,在这两种情况下, v
是完全私人的,不会的C1执行复制“这块知识”?