最初に、3つの式すべてが異なる値を計算するため、DRY原則に違反するとは思わない。3つの値すべての間の依存関係であるという事実は、それをプログラム変数の割り当てではなく、数学の方程式として見るためです。
次のように不変クラスIdealGasであなたのケースを実装することをお勧めします
public class IdealGas {
private static final double R = 8.3145;
private final Pressure pressure;
private final Temperature temperature;
private final SpecificVolume specificVolume;
public IdealGas(Pressure pressure, Temperature temperature)
{
this.pressure = pressure;
this.temperature = temperature;
this.specificVolume = calculateSpecificVolume(pressure.getValue(), temperature.getValue());
}
public IdealGas(Pressure pressure, SpecificVolume specificVolume)
{
this.pressure = pressure;
this.specificVolume = specificVolume;
this.temperature = calculateTemperature(pressure.getValue(), specificVolume.getValue());
}
public IdealGas(Temperature temperature, SpecificVolume specificVolume)
{
this.temperature = temperature;
this.specificVolume = specificVolume;
this.pressure = calculatePressure(temperature.getValue(), specificVolume.getValue());
}
private SpecificVolume calculateSpecificVolume(double pressure, double temperature)
{
return new SpecificVolume(R * temperature / pressure);
}
private Temperature calculateTemperature(double pressure, double specificVolume)
{
return new Temperature(pressure * specificVolume / R);
}
private Pressure calculatePressure(double temperature, double specificVolume)
{
return new Pressure(R * temperature / specificVolume);
}
public Pressure getPressure()
{
return pressure;
}
public Temperature getTemperature()
{
return temperature;
}
public SpecificVolume getSpecificVolume()
{
return specificVolume;
}
}
実装について説明させてください。クラスIdealGasは、不変性の最終値として3つのプロパティPressure、Temperature、SpecificVolumeをカプセル化しました。getXXXを呼び出すたびに、計算は行われません。秘訣は、与えられた2つのパラメーターの3つの組み合わせすべてに対して3つのコンストラクターを持つことです。すべてのコンストラクターで、不足している3番目の変数を計算します。計算は構築時に1回行われ、3番目の属性に割り当てられます。これはコンストラクタで行われるため、3番目の属性はfinalで不変にすることができます。不変性のために、クラスPressure、Temperature、SpecificVolumeも不変であると想定しています。
残りの部分は、すべての属性のゲッターを持つことです。パラメーターをコンストラクターに渡すため、セッターは存在しません。属性を変更する必要がある場合は、目的のパラメーターを使用して新しいIdealGasインスタンスを作成します。
私の例では、Pressure、Temperature、SpecificVolumeクラスは、double値の単純なラッパーです。サンプルコードはJavaですが、一般化することもできます。
このアプローチは一般化でき、すべての関連データをコンストラクターに渡し、コンストラクターで関連データを計算し、ゲッターのみを持ちます。