我在another question中了解到BaseUnit必须是单身。这有许多缺点,包括使客户端代码更难以使用(您必须将单例存储在某处并提供对它的访问),并使序列化代码变得更加困难,例如:通过燃料。
这种约束有什么好处? (我假设它是这样的,如果用户加载两个Aconcagua客户端,例如BaseUnit subclass: #Pound
不同,那么用户就是安全的)
在实践中,是否值得,或者将BaseUnit视为值对象会更好吗?特别是考虑到the paper本身使用像1 dollar
这样的表达式,这已经排除了具有相同名称的单位。
答案 0 :(得分:4)
我在另一篇文章中写过一些关于它的文章。
单位不是真正的单身人士(因为Singleton是在四本书中定义的),其想法不是为每个单元创建一个类,而是为每个单位实例化BaseUnit或DerivedUnit等。
所以,例如你可以创建:
meter := BaseUnit named: 'meter'.
centimeter := ProportionalDerivedUnit basedUnit: meter convertionFactor: 1/100
named: 'centimeter'.
然后写:
1*meter = (100*centimeter)
将返回true。 正如我在另一个问题中发布的那样,将相等性定义为默认值,因此使用了身份。
所以,你可以做两件事来使平等有效:
使用默认#=实现的主要原因是:
主要缺点就像你看到的那样,你第一次看到它可能会有一些问题需要理解,但同样,你只需要有办法访问对象并解决问题。
关于Fuel,可以解决问题,保存定义所有单元的根对象(如Chalten中的TimeUnit)或实现选项2): - )
希望这有帮助!如果您有更多问题,请与我们联系!