如何以面向对象的方式对持续时间进行建模?
-
23-09-2019 - |
题
我正在处理使用整数来建模持续时间的不同 API。只是他们似乎无法就单位达成一致。有时是秒,有时是毫秒。
到目前为止,我能找到的避免错误的最佳方法是使用匈牙利表示法:持续时间以毫秒、持续时间以秒等。
这让我想知道是否有更好的、真正的面向对象的建模持续时间方法?类型系统可以帮助我避免错误,即我错误地将以毫秒为单位的持续时间视为以秒为单位的持续时间,反之亦然。
解决方案
只要给每持续时间的单独的类和使用毫秒作为计算中使用的权威形式 - 即,在这两种你的类的过载功能getMilliSeconds()
class Duration
{
...
virtual const unsigned long long getMilliSeconds() const;
...
}
class MilliSeconds : public Duration
{
...
};
class Seconds : public Duration
{
...
};
Allthough你可能想要更好的粒度,所以纳秒可能是一个更好的权威代表。总之,较低的颗粒度的增加的类将不会是一个问题 - 例如,几小时或几天。
编辑:您可能想要看的升压:: DATE_TIME 获得灵感,有趣的是阅读。
其他提示
当然有:创建一类将代表持续时间和扔在几个工厂方法从秒和毫秒创建Duration
类的一个实例:
class Duration
{
public static Duration FromSeconds(int seconds)
{
// ...
}
public static Duration FromMilliseconds(int milliseconds)
{
// ...
}
}
此类应该提供单个(优选只读)属性 - 例如,Milliseconds
,这将返回一个数封装在一个特定的实例毫秒
此外,可以有Seconds
属性。
我会避免任何隐式转换操作符这里(如果你的编译器允许他们),因为他们将在这里只是使问题复杂化。
您可以看看 TimeSpan
灵感(或完全使用它,如果你在.NET)。
在 Apple 的 Cocoa 中,持续时间的类型是 NSTimeInterval
并被定义为双精度:
typedef double NSTimeInterval;
它以秒为单位,具有亚毫秒级的精度,可保存超过 10000 年。
不隶属于 StackOverflow