我正在思考一个很好的模式,在可衡量单位的领域(即长度,时间)上有用,并提出了以下用例和初始课程,当然还有问题!
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);
答案 0 :(得分:1)
Martin Fowler有一个经过深思熟虑的测量和转换模型,例如Analysis Patterns。值得回顾。我相信他推荐了一个转换率对象来处理从一个单元到另一个单元的转换。
答案 1 :(得分:1)
F#内置了一个度量单位的概念,也许您应该研究它们实现它的方式。
答案 2 :(得分:0)
我认为在这里使用复合模式并没有任何好处。来自维基百科:
Composite允许以与单个对象实例相同的方式处理一组对象。
您不需要转换器对象组,转换器列表就足够了。
至于转换方法 - 我会说转换是为什么类存在,可能是一个好地方。