让Angle
& Distance
struct
,而不只是传递float
或double
?
例如在C#中,我可以创建一个Angle
结构,它将具有如下方法:
angle.Sin();
angle.Cos();
这样我就不必考虑是否使用Radians或360 Deg。
对Distance
,Speed
,...等我可以做同样的事情
构建这样的类和结构是否是好的设计?
答案 0 :(得分:3)
设置类/结构的一些优点:
您可以处理不同的单位。您已经提到不必担心弧度/度数,但这也适用于距离(您可以在km
,cm
,miles
,furlongs
设置距离,无论如何)和其他测量。
这样做可以防止意外混淆不相称的值。如果您对所有内容使用double
,则可能会意外地说x = y;
其中x
是距离的度量,y
是质量的度量。如果你做得对,定义你自己的类来表示测量可以防止这种情况发生。您还可以防止添加和减少与测量不同。 (处理乘法和除法很有意思,但是......)
在角度的情况下,你可以做90°相同的处理450°或-270°(即写一个将它们视为相等的equals()
函数。)
答案 1 :(得分:2)
域类的缺点是算术。想象一下,你想要计算弧长。如果是double
,那很简单:
double radius = 12.345;
double angle = Math.PI / 6.0;
double arcLength = radius * angle;
在 Java 的情况下,这个简单的解决方案变成了一些精简版
Distance radius = new Distance(12.345);
Angle angle = new Angle(Math.PI / 6.0);
// please, notice that we lose safety with getValue(), but "gain" wordiness
Distance arcLength = new Distance(radius.getValue() * angle.getValue());
// An alternative version can be even worse:
// Distance arcLength = radius.multiply(angle);
在 C#中,您可以使用运算符来缓解这种冗长:
Distance radius = 12.345; // implicit operator at work
Angle angle = Math.PI / 6.0; // implicit operator at work
Distance arcLength = radius * angle; // * operator
但是,即使在C#的情况下,您也可能会发现不断更新退出域:想象您要引入Speed
类。你必须考虑是否允许Speed * Angle
,Speed / Distance
,以防它们是什么结果类型(例如Speed / Distance == Frequency
?)
答案 2 :(得分:0)
根据您的最终目的,我建议您考虑在System.Numerics中使用.NET“Complex”结构。通过这种方式,角度&距离将是向量,您可以使用许多包含的数学函数直接对这些向量进行操作。您提到了angle.sin()
和angle.cos()
方法。您不需要这些,因为复杂结构包含FromPolarCoordinates(Double, Double)
方法来转换您的角度&到X&的距离Y坐标。您还可以对复数进行矩阵计算,并使您的代码通用&可重复用于许多其他类型的应用程序。