上下文
每一段知识都必须在系统中具有单一,明确,权威的表示。
问题
如何在多个位置的整个类中直接设置私有成员变量的值来协调该语句?
是否重要,因为该值不存在外部依赖性?
是否重复直接更改除访问者之外的其他地方具有公共访问者的私有成员变量?
例
请考虑以下代码:
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变量从未暴露(通过公共访问者或其他方式),相同的代码行基本上重复四次: this.changed = true (三次)和this.changed = false (一次)。 同样, this.start和this.end的赋值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 is直接分配在单个点中。 即使在这两种情况下, v都是完全私有的,C1实现是否会复制“知识”?