2010-03-01 80 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年亞毫秒的精度。

相關問題