可测量单位数量设计模式

时间:2010-04-19 19:15:20

标签: c# design-patterns

我正在思考一个很好的模式,在可衡量单位的领域(即长度,时间)上有用,并提出了以下用例和初始课程,当然还有问题!

1)复合图案是否有帮助或复杂化?
2)ComposityNode中的Convert方法是否应该是一个单独的转换器类?

所有评论都表示赞赏。干杯,
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);

3 个答案:

答案 0 :(得分:1)

Martin Fowler有一个经过深思熟虑的测量和转换模型,例如Analysis Patterns。值得回顾。我相信他推荐了一个转换率对象来处理从一个单元到另一个单元的转换。

答案 1 :(得分:1)

F#内置了一个度量单位的概念,也许您应该研究它们实现它的方式。

答案 2 :(得分:0)

我认为在这里使用复合模式并没有任何好处。来自维基百科:

  

Composite允许以与单个对象实例相同的方式处理一组对象。

您不需要转换器对象组,转换器列表就足够了。

至于转换方法 - 我会说转换是为什么类存在,可能是一个好地方。