Cómo modelar una duración de una manera orientada a objetos?
-
23-09-2019 - |
Pregunta
Estoy tratando con diferentes APIs que utilizan enteros a la duración del modelo. Sólo parece que no pueden ponerse de acuerdo sobre las unidades. A veces es cuestión de segundos ya veces es milisegundos.
Hasta ahora, la mejor manera de errores Evita que he sido capaz de encontrar, es el uso de la notación húngara:. DurationInMillis, durationInSeconds y así sucesivamente
Esto me hace preguntarme si no hay una manera mejor de verdad, OO duración de modelar? Algo que permitiría que el sistema de tipos de ayuda a evitar errores en el que por error tratar una duración en milisegundos de duración como es segundo y viceversa.
Solución
Just dar a cada duración una por separado milisegundos de clase y su uso como la forma autorizada utilizada en los cálculos -. Es decir, función de sobrecarga getMilliSeconds()
en ambos de sus clases
class Duration
{
...
virtual const unsigned long long getMilliSeconds() const;
...
}
class MilliSeconds : public Duration
{
...
};
class Seconds : public Duration
{
...
};
Acabase usted podría querer una mejor granularidad, por lo nanosegundos podría ser una mejor representación autorizada. De todos modos, la adición de clases de granularidad inferior no será un problema - por ejemplo, horas o días.
editar Es posible que desee mirar a impulso :: fecha_hora en busca de inspiración, es una lectura fascinante.
Otros consejos
Claro que es: crear una clase que representará la duración y lanzar en un par de métodos de fábrica para crear una instancia de la clase Duration
de segundos y milisegundos:
class Duration
{
public static Duration FromSeconds(int seconds)
{
// ...
}
public static Duration FromMilliseconds(int milliseconds)
{
// ...
}
}
Esta clase debería proporcionar individual (de sólo lectura preferiblemente) Propiedad -. Por ejemplo, Milliseconds
, que devolverá un número de milisegundos encapsulados en un caso particular
Además, puede tener la propiedad Seconds
.
Me gustaría evitar cualquier operador de conversión implícita aquí (si su compilador permite para ellos) ya que serán únicamente las cuestiones complicar aquí.
Se puede echar un vistazo a TimeSpan
para la inspiración (o utilizarlo en conjunto, si estás en .NET).
El cacao de En Apple, el tipo de duraciones es NSTimeInterval
y se define como un doble:
typedef double NSTimeInterval;
Se expresa en segundos y tiene una precisión sub mili-segundos más de 10.000 años.