1

假设我有一个代表电路的对象。

public class Circuit
{
  private int? resistance;
  private int? current;
  private int? voltage;
}

鉴于current = voltage/resistance如果我知道其他两个,我可以计算未知属性。

我的第一个想法是,属性之间的关系自然应该内置到对象中。因此,在设置任何属性时,如果其他两个已知,则可以自动填充未知数。这将正常工作,直到出现所有属性都已设置并且需要修改的情况,从而导致混淆其他两个属性中的哪一个应该修改以强制执行关系。我认为此时需要将其他属性设置为 null 。

有这样的副作用的二传手是否被视为可接受的做法?是否有其他方式来加强这种关系?

更多信息

这是一个简化的表示。电阻也可以通过输入电线长度和直径以及电阻常数来确定,我也可以有瓦数和相位。我在数据绑定场景中工作,并且必须保持对象的状态。随着属性数量的增加以及它们之间的关系变得更加复杂,我的设置器变得有点失控。

4

2 回答 2

0

您的实际问题是您的假设是错误的:电路中的导体不是由其电阻,电流和电压定义的,而只是其中的任何两个:第三个(无论哪个)都由其他值所暗示。因此,您只需要两个属性来描述您的导体的完全确定的状态。让我们resistancevoltage简单起见。然后,为了强制电流和电压之间的关系,您可以编写:

public class Conductor
{
  private float resistance;
  private float voltage;

  public void setVoltage( float voltage )
  {
    this.voltage = voltage;
  }
  public float getVoltage()
  {
    return voltage;
  }

  public float getCurrent()
  {
    return getVoltage() / getResistance();
  }
  public void setCurrent( float current )
  {
    this.voltage = current * getResistance();
  }

  public void setResistance( float resistance )
  {
    this.resistance = resistance;
  }
  public void setResistance( float current, float voltage )
  {
    setResistance( voltage / current );
  }
  public float getResistance()
  {
    return resistance;
  }

}

对于任何进一步的设置器,例如根据导线长度、直径和电阻常数设置导体的电阻,您不需要任何新属性(!),而只需要设置器本身:

  public void setResistance( float constant, float diameter, float length )
  {
    this.resistance = constant * length / ( 2 * Math.PI * diameter * diameter );
  }

对于其他吸气剂也是如此:

  public float getResistanceConstant( float diameter, float length )
  {
    return ( getResistance() * ( 2 * Math.PI * diameter * diamter ) ) / length;
  }

如果您仍然需要将直径存储为属性,则应Wire从派生一个类Conductor,因为并非每个导体的电阻都由其长度、直径和电阻常数定义,而仅由导线的电阻定义。但请记住:同样,您不需要将所有三个值都存储为参数,而只需要存储其中两个 - 第三个值已经隐式定义,因为您将阻力作为属性。

于 2013-01-14T09:50:24.453 回答
0

您不应该在or setter中设置current属性。而是简单地计算getter 中的值。resistancevoltagecurrent

public class Conductor
{
  private int? resistance;
  private int? current() { return voltage/resistance; }
  private int? voltage;
}
于 2013-01-14T09:43:33.233 回答