如何以面向对象的方式建模持续时间?

时间:2010-03-01 12:25:03

标签: oop hungarian-notation

我正在处理使用Integers建模持续时间的不同API。只有他们似乎无法就单位达成一致。有时它是秒,有时它是毫秒。

到目前为止,避免我能找到的错误的最佳方法是使用匈牙利表示法:durationInMillis,durationInSeconds等。

这让我想知道是否有更好的,真正的OO建模持续时间方式?一些允许类型系统帮助我避免错误的地方,我错误地将持续时间以毫秒为单位处理,持续时间为秒,反之亦然。

3 个答案:

答案 0 :(得分:2)

当然有:创建一个表示持续时间的类,并抛出几个工厂方法,从秒和毫秒创建Duration类的实例:

class Duration
{
    public static Duration FromSeconds(int seconds)
    {
        // ...
    }

    public static Duration FromMilliseconds(int milliseconds)
    {
        // ...
    }        
}

此类应提供单个(最好是只读)属性 - 例如Milliseconds,它将返回封装在特定实例中的毫秒数。

此外,您可以拥有Seconds属性。

我在这里避免使用任何隐式转换运算符(如果你的编译器允许它们),因为它们只会使问题复杂化。

您可以查看TimeSpan获取灵感(或者完全使用它,如果您使用的是.NET)。

答案 1 :(得分:2)

只需给每个持续时间一个单独的类,并使用毫秒作为计算中使用的权威形式 - 即两个类中的重载函数getMilliSeconds()

class Duration
{
...
    virtual const unsigned long long getMilliSeconds() const;
...
}

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

尽管您可能想要更好的粒度,因此纳秒可能是更好的权威表示。无论如何,添加较低粒度的类将不是问题 - 例如,数小时或数天。

编辑:您可能希望看一下boost::date_time的灵感,这是令人着迷的阅读。

答案 2 :(得分:0)

在Apple的Cocoa中,持续时间的类型为NSTimeInterval,并定义为双倍:

typedef double NSTimeInterval;

以秒表示,并且在10000年内具有亚毫秒的精度。