自动填充实体中与数学相关的属性

时间:2013-01-14 09:37:34

标签: oop language-agnostic getter-setter

假设我有一个代表电路的物体。

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

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

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

有这样的副作用的制定者被视为可接受的做法吗?是否还有其他方式来加强这种关系?

更多信息

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

2 个答案:

答案 0 :(得分:0)

您不应在currentresistance设置器中设置voltage属性。而只是简单地计算current getter中的值。

public class Conductor
{
  private int? resistance;
  private int? current() { return voltage/resistance; }
  private int? voltage;
}

答案 1 :(得分: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类,因为不是每个导体的电阻都是由它的长度,直径和电阻常数定义的,而只是那些电线。但请记住:同样,您不需要将所有三个值都存储为参数,而只需将其中两个存储 - 第三个值的值已经隐式定义,因为您将阻力作为属性。