Как смоделировать длительность объектно-ориентированным способом?

StackOverflow https://stackoverflow.com/questions/2355698

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Пока что лучший способ избежать ошибок, которые мне удалось найти, - это использовать венгерскую нотацию:Длительность в миллисекундах, длительность в секундах и так далее.

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

Это было полезно?

Решение

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

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

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

Редактировать: Возможно, вы захотите взглянуть на повышение::date_time для вдохновения это увлекательное чтение.

Другие советы

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

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

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

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

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

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

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

В Apple Cocoa для определения продолжительности используется следующий тип NSTimeInterval и определяется как двойной:

typedef double NSTimeInterval;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top