我有一个代码库可以处理角度很多,但有时输入有不同的角度格式。也就是说,有些格式是顺时针度数,有些是逆时针度数,有些是0到360度,有些是-180到180度,有些是弧度......
到目前为止,我已经成功地在内部对它们保持一致,但它总是令人担心,而且出现的错误很难追查。
我想创建一个角度类来跟踪单位和方向以及幅度,以便我可以统一处理它们而不必担心。
我的谷歌搜索出现了马丁福勒的Value Object,但我没有一个简单的例子来理解他的语言。我还发现了一个似乎相关的Java API,但它看起来不像简单的示例......
有人能指出一个包含单位的类的简单例子吗?
答案 0 :(得分: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);
答案 1 :(得分:1)
scala's Duration是一个很好的例子,因为它接受各种单位的数字(秒,毫秒等)。不确定这可能会转化为另一种语言,但是有机会。
答案 2 :(得分:1)
你需要这样的东西:
class Measurement
{
double amount;
Unit unit;
}
金额将是“数字”,单位将告诉您如何解释该数字...您可能还需要在数字中实现一些逻辑,或“表格转换”以便能够在不同单位之间进行转换...
顺便说一句: 这是一个很好的库,在Smalltalk中实现它:Aconcagua。它也有一个paper。 这是C ++中另一个非常好的:Boost units。