2010-04-19 2 views
1

Я думаю, хороший образец, который будет полезен для всех областей измеряемых единиц (т. Е. Длина, время) и придумал следующий пример использования и начальные классы, и, конечно, вопросы!количество расчетных единиц дизайн шаблона

1) Помогает ли сложный шаблон или усложняет его?
2) Должны ли методы преобразования в ComposityNode быть отдельным классом преобразователя?

Все комментарии оценены. Приветствия,
Berryl

Пример Использование:

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 

Возможное решение

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); 

ответ

0

Я не вижу никакой пользы для использования составного шаблона здесь. Из википедии:

Композит позволяет группе объектов обрабатываться так же, как один экземпляр объекта.

Вам не нужны группы объектов конвертера, список преобразователей будет достаточным.

Что касается метода конвертации - я бы сказал, что преобразование - это то, почему класс существует, вероятно, для его хорошего места.

+0

есть немного, хотя, я думаю. Составные единицы имперской длины и совокупность единиц длины метрики могли быть как узлами в композите с длиной. Нет? Вы видите лучшую картину для этого? – Berryl

+0

Composite не был правильным шаблоном, и я все-таки закончил класс конвертера. Cheers – Berryl

1

Martin Fowler имеет очень продуманную модель для измерений и преобразований и т. Д. В аналитических шаблонах. Стоит пересмотреть. Я считаю, что он рекомендовал объект Conversion Ratio, который будет обрабатывать преобразование с одного устройства на другое.

+0

Да, Фаулер - это мужчина, не так ли? Не могли бы вы покончить с реализацией C# своего класса отношения и как его можно было бы использовать? – Berryl

1

F # имеет концепцию встроенных единиц измерения, возможно, вам следует изучить способ их реализации.

+0

Интересно, почему C# на самом деле. Я не знаком с f #, но, возможно, хорошим предлогом, чтобы изучить его. – Berryl

Смежные вопросы