僕の場合は、各重さ毎に別々のクラスにするか、enumで区切ってしまいます。
色々妥協案を考えた結果、他の規約を破りたくないので、enumだけ小文字から始めるのオッケー、みたいに考えてます。
enumだと他の機能を持てないというところがなんか良いんですよね。
それはプロパティなのか、変数なのか、publicなのか、privateなのか、そんな悩みとは外にあるので。
enum PressureUnit
{
hPa,
bar,
mmHg,
psi
}
public class Pressure
{
public Pressure(decimal value, PressureUnit unit);
public decimal To(PressureUnit unit);
}
あと、変数の内部は常に1種類の単位で持っておく方が僕は好みです。
一つの文脈に複数の状態が混在するのを忌避するからですが。
このため、質問の回答とはちょっとズレます。
なんていうか、プロパティとして直接hPaとかが実装される、ようなことは避ける、というのが回答でしょうか。
他の回答を見るに、mmHgをデフォルトにしたい…のかなと思いますので、それをベースに回答します。
mmHg用のクラスを1個作成して、各値からコンバートできるパブリックコンストラクタと、変換用の関数を作ります。
全部の値を生の値で保持したい場合でも変数をいくつも一つのクラスで持つのはオススメしがたいです。
public struct MmHg
{
private readonly decimal value;
public MmHg(decimal value, PressureUnit unit)
{
// それぞれのケースでmmHg化する
switch(unit)
{
case PressureUnit.hPa:
// ...
case PressureUnit.bar:
// so on...
}
}
public decimal To(PressureUnit unit)
{
// mmHgから変換する方法だけをそれぞれ実装する
}
// 直接プロパティ, 又はメソッド呼び出す形式にしたければ内部的にToメソッドを呼び出す
// ただし、UIのあるアプリケーションで、各単位に変更可能、なんてのを作りたければToメソッドのが便利。
// HectoPascalが省略形じゃなくて、Psiが省略形なのは、Psiが省略形で一般的だと思えるから
public decimal AsHectoPascal { get { return To(PressureUnit.hPa; } }
public decimal AsBar { get { return To(PressureUnit.bar; } }
public decimal AsPsi { get { return To(PressureUnit.psi; } }
}
面倒じゃなければ残りの3つもクラスにします。
その場合はパブリックコンストラクタもAsメソッド群もつくらず、お互いにキャスト可能にします。
変換関数のパターンがクラス数分増えてしまいますが、それを簡易化する場合は一度全部統一単位に変換するようにすると簡単です。
※変換関数に誤差が含まれる場合は繰り返すほど誤差が大きくなるので注意が必要です。
public struct HectoPascal;
public struct Bar;
public struct Psi;
// 圧力という文脈にしてしまいたい場合は以下のような感じで改めてぼかす。。。
// Box化が微妙なんだけど仕方ない。。。
public struct Pressure
{
private readonly object value;
public Pressure(HectoPascal value) { this.value = value; }
public Pressure(MmHg value) { this.value = value; }
public Pressure(Bar value) { this.value = value; }
public Pressure(Psi value) { this.value = value; }
public HectoPascal AsHectoPascal { get { return (HectoPascal)value; } }
public MmHg AsMmHg { get { return (MmHg)value; } }
public Bar AsBar { get { return (Bar)value; } }
public Psi AsPsi { get { return (Psi)value; } }
}
mmHgだけは悩みます…単位をそのままクラスにするなら問答無用でMmHgです。(規約を破りたくないので。)
もしくは、元の名前を使います。Millimeter of mercuryなんで、MillimeterOfMercuryですかね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/01 02:44
退会済みユーザー
2016/12/01 04:01
2016/12/02 01:16