1

角度をかなり処理するコードベースがありますが、入力が異なる角度形式で提供される場合があります。つまり、一部の形式は時計回り、一部は反時計回り、一部は0〜360、一部は-180〜180、一部はラジアンです。

これまでのところ、内部ですべて同じに保つことに成功しましたが、それは常に心配であり、発生したバグを追跡するのは難しい場合があります。

単位や方向、大きさを追跡する角度クラスを作成して、それほど心配することなく均一に処理できるようにしたいと思います。

私のグーグルでMartinFowlerのValueObjectが見つかりましが、参照する簡単な例がないと、彼の言語を理解するのに苦労しています。関連性があると思われるJavaAPIも見つけましたが、単純な例のようにも見えません...

ユニットを組み込んだクラスの簡単な例を誰かに教えてもらえますか?

4

3 に答える 3

2

値を単一の形式(たとえば、正のラジアン)で内部的に格納することによってこれにアプローチし、さまざまな入力形式から角度を構築するための静的ファクトリメソッドを提供します。例えば:

public class Angle {
  private final double radians;

  private Angle(double radians) {
    this.radians = radians;
  }

  // Static factory methods

  public static Angle radians(double rad) {
    return new Angle(rad);
  }

  public static Angle degrees(double deg) {
    return radians(Math.toRadians(deg));
  }

  public static Angle degreesCCW(double deg) {
    return degrees(360 - deg);
  }

  ...

  // Operations

  public Angle plus(Angle other) {
    return new Angle((this.radians + other.radians) % (2 * Math.PI));
  }

  ...
}

次に、次のように使用できます。

Angle a1 = Angle.radians(0.5);
Angle a2 = Angle.degreesCCW(60);
Angle a3 = a1.plus(a2);
于 2012-08-03T00:38:43.003 に答える
1

scalaのDurationは、さまざまな単位(秒、ミリ秒など)の数値を受け入れるため、良い例です。それが別の言語にどのように翻訳されるかはわかりませんが、チャンスはあります。

于 2012-08-01T00:21:50.430 に答える
1

次のようなものが必要です。

class Measurement
{
    double amount;
    Unit   unit;
}

金額は「数値」になり、単位はその数値の解釈方法を示します...数値にロジックを実装するか、異なる単位間で変換できるように「テーブル変換」を実装する必要がある場合もあります。

ところで:これはSmalltalk:Aconcaguaでそれを実装する素晴らしいライブラリです。もあります。これはC++のもう1つの非常に優れたものです:Boostunits

于 2012-08-01T00:25:46.087 に答える