1

我有一个处理角度的代码库,但有时输入有不同的角度格式。也就是说,有些格式是顺时针度数,有些是逆时针度数,有些是0到360,有些是-180到180,有些是弧度......

到目前为止,我已经成功地让它们在内部保持不变,但这总是令人担忧,而且出现的错误很难追踪。

我想创建一个角度类来跟踪单位和方向以及幅度,以便我可以以统一的方式处理它们而不必担心。

我的谷歌搜索出现了 Martin Fowler 的Value Object,但如果没有一个简单的示例可供参考,我无法理解他的语言。我还发现了一个似乎相关的Java API,但它看起来也不是一个简单的例子......

谁能指出一个包含单元的类的简单示例?

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++ 中另一个非常好的:Boost units

于 2012-08-01T00:25:46.087 回答