2010-03-01 108 views
1

我正在处理使用整数来模拟持续时间的不同API。只有他们似乎无法达成一致。有时候是几秒钟,有时却是毫秒。如何以面向对象的方式建模持续时间?

到目前为止,以避免错误,我已经能够找到的最好的办法,就是用匈牙利命名法:durationInMillis,durationInSeconds等。

这让我不知道是否有未建模持续时间的更好,真正的面向对象的方法?有些东西可以让类型系统帮我避免错误,因为我错误地将持续时间以毫秒为单位,持续时间是秒,反之亦然。

回答

2

只要给每持续时间的单独的类和使用毫秒作为计算中使用的权威形式 - 即,在这两种你的类的过载功能getMilliSeconds()

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

class MilliSeconds : public Duration 
{ 
... 
}; 

class Seconds : public Duration 
{ 
... 
}; 

Allthough你可能想要更好的粒度,所以纳秒可能是一个更好的权威代表。无论如何,添加较低粒度的类将不会成为问题 - 例如几小时或几天。

编辑:你可能想看看boost::date_time的灵感,这是迷人的阅读。

2

肯定有:创建一类将代表持续时间和扔在几个工厂方法来创建从秒和毫秒Duration类的实例:

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

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

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

此外,还可以有Seconds财产。

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

你可以看看TimeSpan的灵感(或者干脆使用它,如果你在.NET)。

+1

+1这被称为** Value Object **模式。 – 2010-03-01 12:31:53

+0

我对它进行了搜索,但找不到与您的值匹配的值对象模式的定义。你有资源吗? – KaptajnKold 2010-03-01 15:37:15

0

在苹果的可可,对于持续时间类型是NSTimeInterval,并定义为双:

typedef double NSTimeInterval; 

它以秒表示,有超过10000年亚毫秒的精度。

相关问题