为不同的单位制作课程?

时间:2013-02-21 03:08:59

标签: c# coding-style conventions

假设我有一个旋转功能(浮动角度)。当我调用这个函数时,我可能不记得这个函数是以角度还是弧度为单位。出于这个原因,我调用了像RotateDegrees这样的函数(浮点角度)。这要好得多,特别是如果我调用我的变量degAngle或radAngle。这样,您可以立即看到代码是否正确而无需查看其他位置。

但可能有更好的方法!

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

public class Degree
{
    public float value;

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

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

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

但我从未见过这样的代码。它在实践中没有用吗?另外,我写的代码性能至关重要,是否会有性能损失?

2 个答案:

答案 0 :(得分:1)

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

你可能想把它变成一个结构而不是一个类。

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

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

答案 1 :(得分:1)

我不确定C#但是有一篇非常着名的文章,关于使用C ++模板在编译时强制执行单元。我找不到这篇文章,但是要点是任何单位都可以表示为基本测量能力的产物。例如,速度=(长度)^ 1 *(时间)^ - 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#支持泛型,所以类似的东西应该是可能的。