1

整数を使用して期間をモデル化するさまざまなAPIを扱っています。彼らだけがユニットに同意できないようです。秒の場合もあれば、ミリ秒の場合もあります。

これまでのところ、私が見つけたエラーを回避する最善の方法は、ハンガリアン記法(durationInMillis、durationInSecondsなど)を使用することです。

モデリング期間のより良い、本当にOOの方法がないかどうか疑問に思いますか?型システムが、ミリ秒単位の期間を秒単位として誤って処理するエラーを回避するのに役立つ何か。その逆も同様です。

4

3 に答える 3

2

確かにあります:期間を表すクラスを作成し、Duration秒とミリ秒からクラスのインスタンスを作成するためにいくつかのファクトリメソッドを投入します:

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

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

このクラスは、単一の(できれば読み取り専用の)プロパティを提供する必要がMillisecondsあります。たとえば、特定のインスタンスにカプセル化されたミリ秒数を返します。

さらに、あなたはSeconds財産を持つことができます。

ここでの暗黙の変換演算子(コンパイラで許可されている場合)は、ここでの問題を複雑にするだけなので、避けたいと思います。

インスピレーションを調べることができますTimeSpan(または、.NETを使用している場合は、それをすべて使用します)。

于 2010-03-01T12:26:59.597 に答える
2

各期間に個別のクラスを指定し、計算で使用される信頼できる形式としてミリ秒を使用します。つまり、getMilliSeconds()両方のクラスで関数をオーバーロードします。

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

より良い粒度が必要な場合もあるので、ナノ秒はより信頼できる表現である可能性があります。とにかく、粒度の低いクラスを追加しても問題はありません。たとえば、数時間または数日です。

編集:あなたはインスピレーションを得るためにboost ::date_timeを見たいかもしれません、それは魅力的な読書です。

于 2010-03-01T12:32:51.997 に答える
0

AppleのCocoaでは、期間のタイプはNSTimeIntervaldoubleとして定義されています。

typedef double NSTimeInterval;

これは秒単位で表され、10000年にわたって1ミリ秒未満の精度があります。

于 2010-03-01T12:41:03.273 に答える