1

假设我有一个函数 Rotate (float angle)。当我调用这个函数时,我可能不记得这个函数是以度数还是弧度为单位的角度。出于这个原因,我将这些函数称为 RotateDegrees(浮动角度)。这要好得多,特别是如果我将变量称为 degAngle 或 radAngle。这样您就可以立即查看代码是否正确,而无需查看其他地方。

但可能还有更好的方法!

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

public class Degree
{
    public float value;

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

小时、公里、摩尔、光年等也是如此。

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

但我从未见过这样的代码。在实践中不是很有用吗?另外,我正在编写的代码对性能至关重要,会有任何性能损失吗?

4

2 回答 2

1

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

不过,您可能希望将其设为结构而不是类。

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

例如,请参阅 .NET 框架中的Unit 结构,该结构用于在处理与 Web 相关的大小时区分像素、百分比和点。

于 2013-02-21T03:16:09.543 回答
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# 支持泛型,所以类似的东西应该是可能的。

于 2013-02-21T03:22:56.070 回答