Domanda

ho a che fare con diverse API che utilizzano numeri interi per modellare la durata. Solo che non riesco a concordare le unità. A volte è secondi e qualche volta è millisecondi.

Finora il modo migliore per evitare gli errori che sono stato in grado di trovare, è quello di utilizzare la notazione ungherese:. DurationInMillis, durationInSeconds e così via

E mi domando se non c'è un migliore, vero modo OO della durata di modellazione? Qualcosa che avrebbe permesso il sistema di tipi per aiutarmi a evitare errori in cui ho erroneamente trattare una durata in millisecondi come durata è secondi e viceversa.

È stato utile?

Soluzione

Basta dare ad ogni durata una classe separata e utilizzare millisecondi come la forma autorevole utilizzato nei calcoli -. Vale a dire, funzione di sovraccarico getMilliSeconds() in entrambe le classi

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

Il solo fatto che si potrebbe desiderare di meglio granularità, in modo da Nanosecondi potrebbe essere una migliore rappresentazione autorevole. Comunque, aggiungendo classi di granularità inferiore non sarà un problema - per esempio, ore o giorni.

modifica Si potrebbe desiderare di guardare boost :: date_time per l'ispirazione, è una lettura affascinante.

Altri suggerimenti

che ci sia: creare una classe che rappresenterà la durata e gettare in un paio di metodi factory per creare un'istanza della classe Duration dai secondi e millisecondi:

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

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

Questa classe dovrebbe fornire singole (di sola lettura preferibilmente) immobili - per esempio, Milliseconds, che restituirà un numero di millisecondi incapsulati in un caso particolare

.

Inoltre, è possibile avere la proprietà Seconds.

Eviterei eventuali operatori di conversione implicita qui (se il compilatore permette per loro) dal momento che verranno complicare le cose qui.

Si può dare un'occhiata a TimeSpan per l'ispirazione (o utilizzare del tutto, se siete su .NET).

In Cocoa di Apple, il tipo per durate è NSTimeInterval ed è definito come un doppio:

typedef double NSTimeInterval;

Si è espresso in secondi e ha una sub milli-secondi precisione oltre 10000 anni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top