假设我有一个代表电路的物体。
public class Circuit
{
private int? resistance;
private int? current;
private int? voltage;
}
鉴于我current = voltage/resistance
我可以计算未知属性,如果我知道其他两个属性。
我的第一个想法是,属性之间的关系应该自然地建立在对象中。因此,当设置任何属性时,如果已知其他两个属性,则可以自动填充未知。这样可以正常工作,直到出现所有属性都已设置且需要修改一个属性的情况,导致混淆应该修改其他两个属性中的哪个属性以强制执行关系。我认为其他属性此时需要设置为null。
有这样的副作用的制定者被视为可接受的做法吗?是否还有其他方式来加强这种关系?
更多信息
这是一个简化的表示。电阻也可以通过输入导线长度和直径以及电阻常数来确定,我也可以有瓦数和相位。我在数据绑定场景中工作,必须坚持对象的状态。随着属性数量的增加以及它们之间的关系变得越来越复杂,我的安装人员就会失控。
答案 0 :(得分:0)
您不应在current
或resistance
设置器中设置voltage
属性。而只是简单地计算current
getter中的值。
public class Conductor
{
private int? resistance;
private int? current() { return voltage/resistance; }
private int? voltage;
}
答案 1 :(得分:0)
您的实际问题是您的假设是错误的:电路中的导体不是由其电阻,电流和电压定义的,而是仅由它们中的任何两个定义:第三个(无论哪个)是由值所暗示的其他。因此,您只需要两个属性来描述导体的完全确定状态。为简单起见,我们可以resistance
和voltage
。然后,为了强制实现电流和电压之间的关系,你可以写:
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
类,因为不是每个导体的电阻都是由它的长度,直径和电阻常数定义的,而只是那些电线。但请记住:同样,您不需要将所有三个值都存储为参数,而只需将其中两个存储 - 第三个值的值已经隐式定义,因为您将阻力作为属性。