1

電気回路を表すオブジェクトがあるとします。

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

残りの 2つがわかれcurrent = voltage/resistanceば、未知のプロパティを計算できます。

私が最初に考えたのは、当然、プロパティ間の関係はオブジェクトに組み込まれるべきだということでした。そのため、プロパティのいずれかを設定するときに、他の 2 つがわかっている場合に不明なプロパティを自動入力できます。これは、すべてのプロパティが設定されていて、1 つを変更する必要がある状況が発生し、他の 2 つのプロパティのどちらを変更して関係を強化する必要があるかについて混乱が生じるまでは問題なく機能します。この時点で、他のプロパティを null に設定する必要があると思います。

このような副作用のあるセッターを持つことは、許容される慣行と見なされますか? そのような関係を強制する他の方法はありますか?

詳細情報

これは簡略化された表現です。抵抗は、ワイヤの長さと直径、および抵抗定数を入力することによって決定することもできます。ワット数と位相も使用できます。私はデータバインドされたシナリオで作業しており、オブジェクトの状態を保持する必要があります。プロパティの数が増加し、それらの相互関係がより複雑になるにつれて、セッターは少し制御不能になります。

4

2 に答える 2

0

またはセッターcurrentでプロパティを設定しないでください。代わりに、ゲッターで値を計算するだけです。resistancevoltagecurrent

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

実際の問題は、仮定が間違っていることです。回路内の導体は、抵抗、電流、電圧によって定義されるのではなく、そのうちの 2 つだけで定義されます。したがって、コンダクターの完全に決定された状態を記述するために必要な属性は 2 つだけです。簡単にするために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の導体の抵抗が長さ、直径、および抵抗定数によって定義されるわけではなく、ワイヤの抵抗のみによって定義されるためです。ただし、覚えておいてください: 繰り返しますが、3 つの値すべてを引数として保存する必要はありませんが、そのうちの 2 つだけを保存する必要があります。抵抗を属性として取得したため、3 番目の値は既に暗黙的に定義されています。

于 2013-01-14T09:50:24.453 に答える