变量赋值操作的重复(Variable value assignment operation dupl

2019-09-28 02:19发布

上下文

程序员修炼

每一块知识必须有一个单一,明确,权威的系统内表示。

问题

  • 如何这句话用在整个在多个地方类直接设置私有成员变量的值一致?
  • 这很重要,因为可以在值没有外部依赖?
  • 难道重复直接改变那些在除访问其他地方的公共存取私有成员变量?

考虑下面的代码:

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.startthis.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执行复制“这块知识”?

Answer 1:

如何这句话用在整个在多个地方类直接设置私有成员变量的值一致?

有一个单一的私有成员变量。 因此,存在一个单个的表示。 这改变这种代表性的语句没有申述自己。 拥有多个语句访问/修改表示是不一样的有多种表示。

这很重要,因为可以在值没有外部依赖?

没有。

难道重复直接改变那些在除访问其他地方的公共存取私有成员变量?

没有。

这并不一定意味着它是一个好主意,这样做虽然。

在实施例中,选择的是访问和直接更新“脏”标志或经由轻重量私有方法这样做之间。 国际海事组织,这归结为一个价值判断哪个方法为您提供更可读的代码。 我的感觉是,有两种方法之间的差别不大,至少在这种情况下。 在其他情况下,有可能是使用内部方法来访问/更新时不会暴露个人状态更强的情况。

如果国家需要外部类暴露再有就是用于声明变量私营和其他类使用提供getter和setter强烈的情况下。 如果这些getter和setter已被宣布,那么你就可以使类本身应该使用他们(弱)的情况下。

对于这些人谁关心效率,或者以其他方式在Java中的getter和setter的,有机会,它将使性能没有区别。 JIT编译器在现代JVM几乎肯定会联方法一样clean() dirty()isDirty()导致机器指令等同于你在哪里得到和直接设置变量的情况下。 事实上,最新的JIT编译器甚至会内嵌非最终公共方法时,他们可以推断方法不需要出动。



Answer 2:

像的方法, dirty()具有比多个语义含义this.changed = true 。 如果你决定要处理复杂的跟踪不同的方式,你只需要改变一个地方---而且从其他代码点(即使所有在同一类),它仍然是更有意义(并且更容易为读者掌握)。

总之,我建议使用dirty()而不是this.changed = true



文章来源: Variable value assignment operation duplication
标签: java oop dry