Como modelar uma duração de maneira orientada a objeto?
-
23-09-2019 - |
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.
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.