Question

Je traite avec des API différentes qui utilisent Entiers pour modéliser la durée. semblent seulement ils ne peuvent pas se mettre d'accord sur les unités. Parfois, il est secondes et il est parfois millisecondes.

Jusqu'à présent, la meilleure façon d'éviter les erreurs que j'ai pu trouver, est d'utiliser la notation hongroise. DurationInMillis, durationInSeconds etc.

Je me demande s'il n'y a pas mieux, vraiment moyen OO de la durée de la modélisation? Quelque chose qui permettrait au système de type me aider à éviter des erreurs où je traite par erreur une durée en millisecondes comme durée est seconde et vice versa.

Était-ce utile?

La solution

Il suffit de donner à chaque durée d'une catégorie distincte et utiliser millisecondes comme la forme autoritaire utilisée dans les calculs -. À savoir, la fonction de surcharge getMilliSeconds() dans les deux vos classes

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

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

Allthough vous voudrez peut-être une meilleure granularité, de sorte nanosecondes pourrait être une meilleure représentation faisant autorité. Quoi qu'il en soit, l'ajout de classes de granularité inférieure ne sera pas un problème - par exemple, des heures ou des jours.

modifier Vous voudrez peut-être regarder boost :: date_time pour l'inspiration, il est une lecture fascinante.

Autres conseils

Bien sûr, il y a: créer une classe qui représentera la durée et jeter quelques méthodes d'usine pour créer une instance de classe Duration de secondes et millisecondes:

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

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

Cette classe doit fournir unique (de préférence en lecture seule) propriété - par exemple, Milliseconds, qui renverra un certain nombre de millisecondes encapsulées dans un cas particulier

.

De plus, vous pouvez avoir la propriété de Seconds.

Il faut éviter tous les opérateurs de conversion implicite ici (si votre compilateur permet pour eux) car ils ne compliquer les choses ici.

Vous pouvez jeter un oeil à TimeSpan d'inspiration (ou l'utiliser tout à fait, si vous êtes sur .NET).

Dans Cocoa d'Apple, le type pour des durées est NSTimeInterval et est définie comme une double:

typedef double NSTimeInterval;

Il est exprimé en secondes et a une sous milliseconde précision sur 10000 ans.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top