2

特定のタイプのコード (例: シミュレーション/ゲーム/最適化) では、オブジェクト (位置、速度、距離、面積、体積、時間、時間差) の多くの物理量/プロパティが格納、操作、および公開されます。これらのタイプのコードでは、これらすべての量は通常、浮動小数点数、つまり c# の double で表されます。

これにより、時間を距離に、面積を体積に、時間を時間に、位置を位置に追加できます。

しかし、あなたは決してこれをしたくありません。時間に時差を追加したり、他の距離や位置に距離を追加したり、エリアに距離を掛けたりするだけです。それでも、特に他の人がコードで作業している場合は、エラーが簡単に発生します。

この危険を軽減するための多くのオプションがあります。さまざまな物理量を表すカスタム クラスを定義し、その後、特定の種類の相互作用をプログラムで禁止することができます。または、厳密な命名規則 (delay_timedifference など) に従います。これらの 2 つのオプションのどちらが、(もしあれば) どのような状況で最適ですか? 最初のオプションを実装する方法は? 2 番目のオプションの命名方法は?

4

3 に答える 3

2

多くの場合、2 番目のオプションが使用されますが、より便利です。名前付けは、何を扱っているかを明確にする問題になります。つまり、プロパティAreaと名前を付けますVolumeが、それでも単位の問題があります。

カスタム クラス (または不変の構造体型) のセット全体を作成して、さまざまな組み合わせのそれぞれを処理することにより、最初のケースを処理できます。フレームワークのDateTime構造体は良い例です。その核心部分は、基本的に単なる long integer 値ですが、構造体にラップされて、瞬間的な使用以外には使用されないようになっています。

他の言語にはこれに対するオプションがあることに注意してください。たとえば、F# ではユニットを言語レベルで処理できますが、これは C# ではまったくサポートされていません。

于 2012-06-29T15:31:40.220 に答える
2

それらは値型であるため、クラスではなく構造体として実装するのが最も理にかなっていると思います。演算子のオーバーロードを実行して、同じ型および適切な異なる型の他の構造に対して適切な演算子を使用できるようにする必要があります。おそらく、ToString 関数をオーバーロードして、スカラー値を、場合によっては単位と共に出力することも必要になるでしょう。

また、他の構造のベクトルを作成するための汎用構造を作成することもできます。これらは、2 次元 (x および y プロパティ)、3 次元 (x、y および z プロパティ)、または N 次元 (値の配列) にすることができます。これらの構造体は、ベクトル計算を実行するための適切な演算子のオーバーロードを持つこともできます。正しく行えば、データを操作する非常に自然な方法になります。

于 2012-06-29T15:34:17.947 に答える
1

説明した 2 つのオプションはどちらも実行可能ですが、欠点があります。最初のオプションではクラスが多すぎて (そして、多くの関係を定義する必要があります)、2 番目のオプションではエラーが発生しやすくなります。

より良いオプションは、浮動小数点数と単位とその多重度のリストの両方をカプセル化する 1 つのカスタム クラスを作成することです。たとえば、1 メートル/秒は {n=1, types={length:1, time:-1}} になる場合があります。次に、単位が同じでない限り、数値を比較、加算、または減算できないようにすることができます。乗算と除算は、一致する型の多重度を加算します。

例えば。

1 m/s * 4 seconds = 4 meters
{n=1, types={length:1, time:-1}} * {n=4, types={time:1}} = {n=4, types={length:1,time:0}}
于 2012-06-29T15:35:06.883 に答える