假设我有一个旋转功能(浮动角度)。当我调用这个函数时,我可能不记得这个函数是以角度还是弧度为单位。出于这个原因,我调用了像RotateDegrees这样的函数(浮点角度)。这要好得多,特别是如果我调用我的变量degAngle或radAngle。这样,您可以立即看到代码是否正确而无需查看其他位置。
但可能有更好的方法!
为什么我不为每个单元制作不同的课程?像
public class Degree
{
public float value;
public Degree (float value)
{
this.value = value;
}
}
和小时,公里,摩尔,光年等相同。
这样就没有任何歧义,我只需为每个函数制作一堆重载,或者为每个类定义转换运算符。
但我从未见过这样的代码。它在实践中没有用吗?另外,我写的代码性能至关重要,是否会有性能损失?
答案 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#支持泛型,所以类似的东西应该是可能的。