TL; DR-最適なデータ構造を設計して、測定単位内の単位を定義しようとしています。
A Unit of measure
は、本質的ににvalue
関連付けられた(または数量)unit
です。 SIユニットには7つのベースまたはディメンションがあります。すなわち:長さ、質量、時間、電流、温度、物質の量(モル)、および光度。
これは十分に簡単ですが、多くの派生ユニットと頻繁に使用するレートがあります。結合されたユニットの例はNewton:でkg * m / s^2
あり、レートの例はですtons / hr
。
暗黙のユニットに大きく依存するアプリケーションがあります。変数または列名に単位を埋め込みます。しかし、異なる単位で測定単位を指定する必要がある場合、これは問題を引き起こします。はい、入力および表示時に値を変換できますが、これにより、独自のクラス内にカプセル化する多くのオーバーヘッドコードが生成されます。
コードプレックスやその他の共同作業環境には多くのソリューションがあります。プロジェクトのライセンスは同意できますが、プロジェクト自体は通常、非常に軽量または重すぎます。「ちょうどいい」というユニコーンを追いかけています。
理想的には、次のようなものを使用して新しい測定単位を定義できます。
UOM myUom1 =新しいUOM(10、ボルト);
UOM myUom2 = new UOM(43.2、Newtons);
もちろん、クライアントのニーズに基づいて、ImperialユニットとSIユニットを組み合わせて使用します。
また、このユニットの構造を将来のデータベーステーブルと同期させて、データ内で同じ程度の一貫性を提供する必要があります。
測定単位クラスを作成するために使用する必要がある単位、派生単位、およびレートを定義する最良の方法は何ですか?1つ以上の列挙型を使用していることはわかりましたが、他の開発者にとってはイライラする可能性があります。単一の列挙型は200以上のエントリで巨大になりますが、複数の列挙型はSIと帝国のユニットに基づいて混乱し、ユニット自体の分類に基づいた追加の内訳があります。
私の懸念のいくつかを示す列挙型の例:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
使用中のユニットのセットはかなり明確に定義されており、有限のスペースです。クライアントから需要がある場合、新しい派生ユニットまたはレートを拡張および追加する機能が必要です。このプロジェクトはC#で作成されていますが、より広範な設計の側面は複数の言語に適用できると思います。
私が調べたライブラリの1つでは、文字列を介したユニットの自由形式の入力が可能です。次に、UOMクラスは文字列を解析し、それに応じてスロットを割り当てました。このアプローチの課題は、正しい文字列形式が何であるかを開発者に考えさせ、記憶させることです。そして、コンストラクターで渡される文字列を検証するためにコード内に追加のチェックを追加しないと、ランタイムエラー/例外のリスクが発生します。
別のライブラリは、開発者が作業しなければならないクラスを本質的に多く作成しました。同等のUOMとともに、DerivedUnit
などRateUnit
を提供しました。基本的に、コードは、私たちが解決しようとしている問題に対して非常に複雑でした。そのライブラリは基本的にany:anyの組み合わせ(ユニットの世界では合法です)を許可しますが、可能なすべての組み合わせを許可しないことで問題の範囲を広げることができます(コードを簡素化します)。
他のライブラリはとてつもなくシンプルで、たとえば演算子のオーバーロードも考慮していませんでした。
さらに、誤った変換(たとえば:ボルトからメートル)の試みについても心配していません。この時点でこのレベルでアクセスできるのは開発者だけであり、これらのタイプの間違いから保護する必要は必ずしもありません。