Come modellare una durata in modo orientato agli oggetti?
-
23-09-2019 - |
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.
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.