存储基本单位的最佳做法是什么?
让我们说我想要一英里单位。所以,我实现了Number>>#miles
,但实现是什么?
问题是:(2 * (BaseUnit named: 'mile')) ~= (2 * (BaseUnit named: 'mile'))
,所以英里基本单位似乎必须是单身。
所以我有类似的东西:
Number>>#miles
^ self * Mile uniqueInstance
我是在正确的轨道上,还是你能想到更好的方式?
答案 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的方法。