角度和角度是否是个好主意?距离结构或类

时间:2016-11-30 06:48:09

标签: java c# class struct

Angle& Distance struct,而不只是传递floatdouble

例如在C#中,我可以创建一个Angle结构,它将具有如下方法:

angle.Sin();
angle.Cos();

这样我就不必考虑是否使用Radians或360 Deg。

DistanceSpeed,...等我可以做同样的事情

构建这样的类和结构是否是好的设计?

3 个答案:

答案 0 :(得分:3)

设置类/结构的一些优点:

  1. 您可以处理不同的单位。您已经提到不必担心弧度/度数,但这也适用于距离(您可以在kmcmmilesfurlongs设置距离,无论如何)和其他测量。

  2. 这样做可以防止意外混淆不相称的值。如果您对所有内容使用double,则可能会意外地说x = y;其中x是距离的度量,y是质量的度量。如果你做得对,定义你自己的类来表示测量可以防止这种情况发生。您还可以防止添加和减少与测量不同。 (处理乘法和除法很有意思,但是......)

  3. 在角度的情况下,你可以做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 * AngleSpeed / Distance,以防它们是什么结果类型(例如Speed / Distance == Frequency?)

答案 2 :(得分:0)

根据您的最终目的,我建议您考虑在System.Numerics中使用.NET“Complex”结构。通过这种方式,角度&距离将是向量,您可以使用许多包含的数学函数直接对这些向量进行操作。您提到了angle.sin()angle.cos()方法。您不需要这些,因为复杂结构包含FromPolarCoordinates(Double, Double)方法来转换您的角度&到X&的距离Y坐标。您还可以对复数进行矩阵计算,并使您的代码通用&可重复用于许多其他类型的应用程序。