Aconcagua测量库 - 存储BaseUnit

时间:2014-05-19 17:48:40

标签: smalltalk

存储基本单位的最佳做法是什么?

让我们说我想要一英里单位。所以,我实现了Number>>#miles,但实现是什么?

问题是:(2 * (BaseUnit named: 'mile')) ~= (2 * (BaseUnit named: 'mile')),所以英里基本单位似乎必须是单身。

所以我有类似的东西:

Number>>#miles
    ^ self * Mile uniqueInstance

我是在正确的轨道上,还是你能想到更好的方式?

2 个答案:

答案 0 :(得分:2)

单位不是真正的单身,但是他们使用原始的#=来查看两个单位是否相同而且#=的默认实现用#==验证身份,但是如果需要可以覆盖它。 我这样做的原因是因为我认为这是最通用的实现。使用它们的最简单方法是将单位存储在全局变量中,因此您可以定义:

Smalltalk at:#Mile put :( BaseUnit命名为:' mile'等等)。

然后你可以做2 * Mile女巫很有意义,因为......就像说"英里的知识是全球性的#34;

另一种方法是Chalten如何做到这一点。那就是拥有一个知道每个单元的类,你可以使用" TimeUnits day"

之类的消息来访问它们。

这个想法是为了避免每个单元创建一个没有任何意义的类...... 另一种可能性是1)修改单元上的#=并使用uni的名称来验证两个单元是否相等2)Subclass BaseUnit并执行1): - )

如果您遇到Fuel问题,那是因为您没有保存知道每个单元的根对象,但是一旦这样做,问题就应该解决了。

埃尔南。

答案 1 :(得分:1)

是的,英里基本单位必须是单身,您可以查看使用Aconcagua的Chalten框架,特别是TimeUnitsGlobal类。 对于Number方法部分,在Chalten中它以这种方式完成:

Number>>#daysMeasure
    ^TimeUnits day with: self

虽然我对它在那里的工作方式有疑问,因为在那之后我无法找到使用Fuel的方法。