2013-02-21 64 views
1

比方说,我有一个函数旋转(浮动角度)。当我调用这个函数时,我可能不会记得这个函数是以角度还是弧度表示的。出于这个原因,我称之为这些RotateDegrees(浮点角度)函数。这更好,尤其是,如果我打电话给变量degAngle或radAngle。这样,您可以立即看到代码是否正确,而无需查看其他地方。为不同的单位制作课程?

但是可能有更好的办法!

为什么我不为每个单位制作不同的课程?像

public class Degree 
{ 
    public float value; 

    public Degree (float value) 
    { 
     this.value = value; 
    } 
} 

和小时,公里,摩尔,光年等相同。

这样就没有歧义,我只需为每个函数做一堆重载,或为每个类定义转换运算符。

但我从来没有见过这样的代码。这在实践中没有用吗?另外,我正在编写的代码对性能至关重要,会有什么性能损失?

+2

为什么不使用一种度量单位来衡量一切,这样你就不必担心转换(直到与用户交互),并且将由于转换(舍入,浮点限制)而导致的不准确性最小化? – Matthew 2013-02-21 03:12:23

+1

您应该考虑F#提供的有关度量单位的内容(http://blogs.msdn.com/b/andrewkennedy/archive/2008/08/29/units-of-measure-in-f-part-one-introducing- units.aspx)。我知道它是一种不同的语言,但它的语法相似。作为一个c#dev,我发现F#是一个小的学习曲线。 – 2013-02-21 03:16:40

+0

来自MSDN的更多信息:http://msdn.microsoft.com/en-us/library/dd233243.aspx – 2013-02-21 03:17:41

回答

1

如果您的程序频繁使用该特定单元,那绝对是一个好主意。

虽然你可能希望使它成为一个结构而不是类。

例如,我喜欢使用百分比结构。它提高了可读性,并有助于防止开发人员在50或0.5之间混淆以指示50%的问题。

作为示例,请参阅.NET框架中的Unit structure,用于在处理Web相关大小时区分像素,百分比和点。

+3

并确保结构不可变! – 2013-02-21 03:19:27

+1

我也喜欢使用Percent类型。重载加法,以便你可以做(​​例如)value + = 10.Percent()'也很好。 :) – porges 2013-02-21 03:56:46

+0

@ Jesse为什么结构必须是不可变的?我仍然需要了解不可变类型,所以我不知道在这种情况下是否有一个特定的原因,或者我会找到一个通用的原因。 – NounVerber 2013-02-21 05:45:34

1

我不确定C#,但有一篇关于使用C++模板在编译时强制执行单元的非常有名的文章。我找不到这篇文章,但jist是任何单位都可以被视为基本度量权力的产物。因此,例如velocity =(length)^ 1 *(time)^ - 1。所以,你定义像

template <int lenPower, int timePower> 
class Unit { 
    double val; 
}; 

typedef meter Unit<1,0>; 
typedef second Unit<0,1>; 
typedef velocity Unit<1,-1>; 

然后你重载*和+运营商,以确保您只能添加兼容的单位和乘法产生一个单元用正确的权力,你已经强制在编译时正确的单元操作。对不起,我不记得更多的细节,也找不到文章。谷歌的“模板元编程单元示例”将出现。也很抱歉,我正在谈论C++。我知道C#支持泛型,所以类似的东西应该是可能的。

+0

在C++中,您可以使用值(例如1)作为模板参数,这是C#中的通用参数无法做到的。在C#中的类型级别启用单元安全性(并且我已经尝试过!)并不可行。简单的事情没关系,但是你不能编码像m * m/s * m = m^3/s这样的东西。 – porges 2013-02-21 03:55:07