阿空加瓜:基本单位 - 平等比较会比身份更好吗?

时间:2015-04-23 14:13:25

标签: oop smalltalk pharo

我在another question中了解到BaseUnit必须是单身。这有许多缺点,包括使客户端代码更难以使用(您必须将单例存储在某处并提供对它的访问),并使序列化代码变得更加困难,例如:通过燃料。

这种约束有什么好处? (我假设它是这样的,如果用户加载两个Aconcagua客户端,例如BaseUnit subclass: #Pound不同,那么用户就是安全的)

在实践中,是否值得,或者将BaseUnit视为值对象会更好吗?特别是考虑到the paper本身使用像1 dollar这样的表达式,这已经排除了具有相同名称的单位。

1 个答案:

答案 0 :(得分:4)

我在另一篇文章中写过一些关于它的文章。

单位不是真正的单身人士(因为Singleton是在四本书中定义的),其想法不是为每个单元创建一个类,而是为每个单位实例化BaseUnit或DerivedUnit等。

所以,例如你可以创建:

meter := BaseUnit named: 'meter'.
centimeter := ProportionalDerivedUnit basedUnit: meter convertionFactor: 1/100 
              named: 'centimeter'.

然后写:

1*meter = (100*centimeter)

将返回true。 正如我在另一个问题中发布的那样,将相等性定义为默认值,因此使用了身份。

所以,你可以做两件事来使平等有效:

  1. 拥有众所周知的对象(使用全局变量或全局根对象以Chalten的身份访问它们)
  2. 修改单位中的#=,如果名称相同,则使两个单位相等(或者创建一个具有#=定义的子类)
  3. 使用默认#=实现的主要原因是:

    1. 这是更通用的解决方案
    2. 单位(在现实生活中)是独一无二的,因此在模型中具有独特性是有意义的
    3. 有一个“米”对象而不是每次需要时创建一个对象是有意义的。
    4. 主要缺点就像你看到的那样,你第一次看到它可能会有一些问题需要理解,但同样,你只需要有办法访问对象并解决问题。

      关于Fuel,可以解决问题,保存定义所有单元的根对象(如Chalten中的TimeUnit)或实现选项2): - )

      希望这有帮助!如果您有更多问题,请与我们联系!