2010-04-19 6 views
1

Je pense à travers un joli modèle pour être utile à travers des domaines d'unités mesurables (par exemple, longueur, temps) et est venu avec le cas d'utilisation et les classes initiales suivantes, et bien sûr, des questions!quantité d'unités mesurables modèle de conception

1) Un motif composite aide-t-il ou complique-t-il?
2) Les méthodes Convert dans ComposityNode doivent-elles être une classe de convertisseur distincte?

Tous les commentaires ont été appréciés. Vive,
Berryl

Exemple de cas d'utilisation:

var inch = new ConvertableUnit("inch", 1) 
var foot = new ConvertableUnit("foot", 12) 
var imperialUnits = new CompositeConvertableUnit("imperial units", .024) 
imperialUnits.AddChild(inch) 
imperialUnits.AddChild(foot) 

var meter = new ConvertableUnit("meter", 1) 
var millimeter = new ConvertableUnit("millimeter ", .001) 
var imperialUnits = new CompositeConvertableUnit("metric units", 1) 
imperialUnits.AddChild(meter) 
imperialUnits.AddChild(millimeter) 

var oneInch = new Quantity(1, inch); 
var oneFoot = new Quantity(1, foot); 
oneFoot.ToBase() // "12 inches" 

var oneMeter = new Quantity(1, meter); 
oneInch.ToBase() // .024 meters 

Solution possible

ConvertableUnit : Node 
    double Rate 
    string Name 

Quantity 
    ConvertableUnit Unit 
    double Amount 

CompositeConvertableUnit : Node 
    ISet<ConvertableUnit> _children 
    ConvertableUnit BaseUnit {get{ return _children.Where(c=>c.Rate == 1).First() } } 
    Quantity ConvertTo(Quantity from, Quantity to) 
    Quantity ToBase(Quantity from); 

Répondre

0

Je ne vois pas vraiment un avantage d'utiliser le motif composite ici. De wikipedia:

Composite permet de traiter un groupe d'objets de la même manière qu'une seule instance d'un objet.

Vous n'avez pas besoin de groupes d'objets de convertisseur, une liste de convertisseurs serait suffisante. Comme pour la méthode Convert - je dirais que la conversion est la raison pour laquelle la classe existe, probablement une bonne place pour cela.

+0

il y en a un peu, je pense. Un composite d'unités de longueur impériale et un composite d'unités de longueur métrique pourraient tous deux être des nœuds dans un composite de longueur. Non? Voyez-vous un meilleur modèle pour cela? – Berryl

+0

Composite n'était pas le bon modèle, et je me suis retrouvé avec une classe de convertisseur après tout. Salut – Berryl

1

Martin Fowler a un modèle très bien pensé pour les mesures et les conversions et tels dans les modèles d'analyse. À revoir. Je crois qu'il a recommandé un objet de taux de conversion qui gérerait la conversion d'une unité à l'autre.

+0

Oui, Fowler est l'homme, n'est-ce pas? Pourriez-vous gratter une implémentation C# de sa classe de ratio et comment elle pourrait être utilisée? – Berryl

1

F # a un concept d'unités de mesure intégrées, peut-être vous devriez regarder dans la façon dont ils l'ont implémenté.

+0

Je me demande pourquoi C# ne le fait pas. Je ne suis pas familier avec f # mais peut-être une bonne excuse pour l'examiner. – Berryl

Questions connexes