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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top