我正在处理使用整数来模拟持续时间的不同 API。只有他们似乎无法就单位达成一致。有时是几秒钟,有时是几毫秒。
到目前为止,我能找到的避免错误的最佳方法是使用匈牙利符号:durationInMillis、durationInSeconds 等。
这让我想知道是否没有更好的、真正的 OO 建模持续时间的方式?允许类型系统帮助我避免错误的东西,我错误地将持续时间(以毫秒为单位)视为持续时间是秒,反之亦然。
我正在处理使用整数来模拟持续时间的不同 API。只有他们似乎无法就单位达成一致。有时是几秒钟,有时是几毫秒。
到目前为止,我能找到的避免错误的最佳方法是使用匈牙利符号:durationInMillis、durationInSeconds 等。
这让我想知道是否没有更好的、真正的 OO 建模持续时间的方式?允许类型系统帮助我避免错误的东西,我错误地将持续时间(以毫秒为单位)视为持续时间是秒,反之亦然。
当然有:创建一个代表持续时间的类,并抛出几个工厂方法来Duration
从秒和毫秒创建一个类的实例:
class Duration
{
public static Duration FromSeconds(int seconds)
{
// ...
}
public static Duration FromMilliseconds(int milliseconds)
{
// ...
}
}
此类应提供单个(最好是只读的)属性——例如,Milliseconds
它将返回封装在特定实例中的毫秒数。
此外,您可以拥有Seconds
财产。
我会在这里避免任何隐式转换运算符(如果您的编译器允许它们),因为它们只会使这里的问题复杂化。
您可以查看TimeSpan
灵感(或完全使用它,如果您使用的是 .NET)。
只需给每个持续时间一个单独的类,并使用毫秒作为计算中使用的权威形式——即,getMilliSeconds()
两个类中的重载函数。
class Duration
{
...
virtual const unsigned long long getMilliSeconds() const;
...
}
class MilliSeconds : public Duration
{
...
};
class Seconds : public Duration
{
...
};
尽管您可能想要更好的粒度,但纳秒可能是更好的权威表示。无论如何,添加较低粒度的类不会成为问题——例如,几小时或几天。
编辑:您可能想查看boost::date_time以获得灵感,这是令人着迷的阅读。
在 Apple 的 Cocoa 中,持续时间的类型是NSTimeInterval
并且被定义为双精度:
typedef double NSTimeInterval;
它以秒为单位,在 10000 年中具有亚毫秒精度。