8
votes

Quel modèle dois-je utiliser pour exprimer une énorme hiérarchique?

J'essaie d'expérimenter une API pour la publication des valeurs à un moment donné (tuples de valeur et heure). Ces échantillons seront utilisés par un visualiseur de données (par exemple un graphique).

Je souhaite associer la valeur avec une quantité et une unité, par exemple de longueur en mètres. De cette façon, mon "spectateur" peut l'accabler de manière appropriée.

Je recherche une sorte d'énum hiérarchique, comme ceci: xxx

mais cela n'existe pas dans c #.

Je ne suis pas sûr du meilleur modèle pour exprimer cela et je suis arrivé avec ce qui suit. Y a-t-il une façon reconnue ou meilleure de faire cela? xxx


1 commentaires

Probablement pas ce que vous recherchez, mais considérons f # et Unités de mesure .


5 Réponses :


1
votes

Votre approche suggérée me semble raisonnable et j'utilise quelque chose de similaire dans un projet de mien. Cependant, je garde la partie valeur réelle de l'objet, et j'utilise struct au lieu de la classe , car ils sont naturellement des types de valeur. L'héritage n'est pas nécessaire ici (et non possible avec des structures, de toute façon), donc j'utilise une interface pour créer un contrat et agir comme une contrainte en cas de besoin (je l'ai appelé iunitofmeasure ).

Je fais ne recommande pas de créer une enum avec toutes les unités des différents types de mesure combinées; C'est l'enfer de valider l'appareil pour s'assurer que quelqu'un n'a pas réfédié une unité de masse lorsqu'il travaillait avec la longueur. xxx

utilisation: xxx

Si vous ne vous souciez pas de garder la valeur et que vous voulez simplement garder les valeurs énumées / statiques dans un endroit central: xxx

utilisation: var unité = unitéOfMeasure.mass.kilogramme;


1 commentaires

Je ne peux pas utiliser la dernière idée de votre message, merci pour l'idée d'interface. +1



1
votes

Ce n'est pas possible. Enums sont des types primitifs et ne peuvent pas hériter d'autres énums, car l'héritage est une propriété d'objets.


0 commentaires

0
votes

Vous ne pouvez pas introduire l'héritage avec Enums. Enums ne sont qu'un mécanisme de commodité pour vous permettre d'utiliser des identifiants textuels significatifs dans votre code. Du code que vous avez, je vous suggère d'utiliser un énumé comme; xxx

ou divisé à l'endroit où il est approprié, de sorte que la masse et la longueur sont définies séparément par exemple.

L'héritage est simplement quelque chose que vous avez introduit dans votre réflexion sur ce problème, mais ce n'est pas nécessaire pour votre solution. Lorsque vous souhaitez gérer la messe, vous ne regardez que les drapeaux / Enums appropriés à la masse.


0 commentaires

3
votes

Je pense qu'il est préférable de créer une classe unité code> pour l'unité de mesure et une classe Quantité code> Classe associée à une unité de mesure avec un montant. Regardez le modèle de quantité pour l'idée. Puisque vous souhaitez également enregistrer le "type" de l'unité de mesure, vous pouvez créer une classe UnitTypeType code> qui enregistre que des informations: xxx pré>

(vous devez les faire des types de valeur appropriés en remplacement égale code> et gethascode code>) p>

la classe code> la classe code> peut être étendu pour prévoir par exemple conversions, unités composées, formatage et analyse. P>

Ensuite, vous pouvez définir les cas communs à l'intérieur des classes: p> xxx pré>

ou définissez vos "hiérarchies" avec Classes statiques: p>

var eniacWeight = 27.Tons();


1 commentaires

Merci pour le lien avec le modèle de Fowler, très intéressant.



1
votes

L'énum hiérarchique n'est pas possible, comme indiqué ci-dessus. Si vous utilisez exclusivement métrique, vous pouvez utiliser des préfixes standard si cela aide.

enum MeasurementUnits
{
    Gram,
    Metre,
    Litre,
    Hectare
    // etc
}

enum MeasurementPrefix
{
    Milli,
    Natural,
    Kilo,
    Mega
    // etc
}


1 commentaires

C'est une bonne idée, j'aime ça. +1