Pergunta

Estou lidando com diferentes APIs que usam números inteiros para modelar a duração. Só eles não conseguem concordar com as unidades. Às vezes são segundos e às vezes são milissegundos.

Até agora, a melhor maneira de evitar erros que pude encontrar é usar a notação húngara: DurationInmillis, DurationInseconds e assim por diante.

Isso me faz pensar se não há uma maneira melhor e verdadeiramente OO de modelar a duração? Algo que permitiria que o sistema de tipos me ajudasse a evitar erros, onde eu trato erroneamente uma duração em milissegundos como duração é segundos e vice -versa.

Foi útil?

Solução

Basta dar a cada duração uma classe separada e usar milissegundos como a forma autorizada usada em cálculos - ou seja, função de sobrecarga getMilliSeconds() nas duas aulas.

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

De qualquer forma, você pode querer melhor granularidade, para que os nanossegundos possam ser uma representação melhor autorizada. De qualquer forma, adicionar classes de granularidade inferior não será um problema - por exemplo, horas ou dias.

editar: Você pode querer olhar para Boost :: date_time Para inspiração, é uma leitura fascinante.

Outras dicas

Claro que existe: Crie uma classe que representará a duração e lançará alguns métodos de fábrica para criar uma instância de Duration classe de segundos e milissegundos:

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

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

Esta classe deve fornecer uma propriedade única (de preferência somente leitura)-por exemplo, Milliseconds, que retornará vários milissegundos encapsulados em uma instância específica.

Além disso, você pode ter Seconds propriedade.

Eu evitaria operadores de conversão implícitos aqui (se o seu compilador permitir), pois eles apenas complicarão os assuntos aqui.

Você pode dar uma olhada em TimeSpan Para inspiração (ou use -o completamente, se você estiver no .NET).

No cacau da Apple, o tipo de durações é NSTimeInterval e é definido como um duplo:

typedef double NSTimeInterval;

É expresso em segundos e possui uma precisão sub-moção de segundo durante 10000 anos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top