代码之家  ›  专栏  ›  技术社区  ›  NounVerber

为不同的单元上课?

  •  1
  • NounVerber  · 技术社区  · 13 年前

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

    但也许还有更好的方法!

    为什么我不为每个单元做一个不同的课呢?喜欢

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

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

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

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   cbp    13 年前

    如果你的程序经常使用这个特定的单元,这绝对是个好主意。

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

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

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

        2
  •  1
  •   C. M.    13 年前

    我对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#支持泛型,所以类似的东西应该是可能的。