Как смоделировать длительность объектно-ориентированным способом? - PullRequest
1 голос
/ 01 марта 2010

Я имею дело с различными API, которые используют целые числа для моделирования продолжительности. Только они не могут договориться о единицах. Иногда это секунды, а иногда миллисекунды.

На данный момент лучший способ избежать ошибок, которые мне удалось найти, - это использовать венгерские обозначения: durationInMillis, durationInSeconds и т. Д.

Это заставляет меня задуматься, не существует ли лучшего, действительно ОО-способа моделирования продолжительности? Что-то, что позволило бы системе типов помочь мне избежать ошибок, когда я ошибочно трактую длительность в миллисекундах как длительность в секундах и наоборот.

Ответы [ 3 ]

2 голосов
/ 01 марта 2010

Просто присвойте каждой продолжительности отдельный класс и используйте миллисекунды в качестве официальной формы, используемой в вычислениях, то есть функцию перегрузки getMilliSeconds() в обоих ваших классах.

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

Несмотря на то, что вам может потребоваться более высокая степень детализации, Наносекунды могут быть лучшим авторитетным представлением. В любом случае, добавление классов с более низкой степенью детализации не будет проблемой - например, часы или дни.

edit: Возможно, вы захотите взглянуть на boost :: date_time для вдохновения, это захватывающее чтение.

2 голосов
/ 01 марта 2010

Конечно, есть: создайте класс, который будет представлять продолжительность, и добавьте пару фабричных методов для создания экземпляра класса Duration из секунд и миллисекунд:

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

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

Этот класс должен предоставлять единственное (предпочтительно только для чтения) свойство - например, Milliseconds, которое будет возвращать количество миллисекунд, инкапсулированных в конкретном экземпляре.

Кроме того, вы можете иметь свойство Seconds.

Я бы избежал любых неявных операторов преобразования здесь (если ваш компилятор допускает их), поскольку они только усложнят ситуацию здесь.

Вы можете взглянуть на TimeSpan для вдохновения (или использовать его вообще, если вы находитесь на .NET).

0 голосов
/ 01 марта 2010

В Apple's Cocoa тип для длительностей равен NSTimeInterval и определяется как double:

typedef double NSTimeInterval;

Он выражается в секундах и с точностью до миллисекунды в течение 10000 лет.

...