2012-07-31 73 views
1

我有一个处理角度相当多的代码库,但有时输入以不同的角度格式。也就是说,有些格式是顺时针度数,有些是逆时针度数,有些是0到360度,有些是-180到180度,有些是弧度...需要一个包含单位的类型的简单示例

到目前为止,我成功地保持它们都一样在内部,但它总是令人担忧,并且出现的错误很难追查到。

我想创建一个角度类,跟踪单位和方向以及幅度,以便我可以以统一的方式处理它们,而没有太多的担忧。

我的谷歌搜索引起了马丁福勒的Value Object,但我无法理解他的语言,没有一个简单的例子来参考。我还发现一个Java API似乎有关,但它看起来并不像一个简单例如要么...

任何人都可以点我朝着这一合并单位类的简单的例子?

+0

你需要记住原单位,否则会好起来的一切转化为公共单位里面的类? – casablanca 2012-08-01 02:29:09

+0

我希望能够以各种单位存储和检索角度。我不知道在课堂上转换为一个单元并提供存取器转换或存储单元(然后还要在存取器上进行有条件转换...?) – tugs 2012-08-01 16:11:54

+0

您是否还可以详细说明“各种单位”?你有更多的单位,而不仅仅是度和弧度? – casablanca 2012-08-02 01:48:26

回答

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); 
+0

这看起来很完美。简单而重要。谢谢。 – tugs 2012-08-03 19:07:02

1

scala's Duration是一个很好的例子,因为它接受各种单位(秒,毫秒等)的数字。不知道这可能会翻译成另一种语言,但有机会。

1

你需要的东西是这样的:

class Measurement 
{ 
    double amount; 
    Unit unit; 
} 

量将是“号”,和单位将告诉你如何解释这个数字...你可能还需要实现数字一些逻辑,或“表转换”,以便能够在不同的单位之间进行转换...

这是一个很棒的图书馆在Smalltalk:Aconcagua。它也有一个paper。 这是另一个非常好的C++:Boost units