gpt4 book ai didi

oop - 阿空加瓜 : Base Units - would equality comparison be better than identity?

转载 作者:行者123 更新时间:2023-12-05 01:19:02 25 4
gpt4 key购买 nike

我在 another question 中学到了BaseUnits 必须是单例。这有很多缺点,包括使客户端代码更难使用(您必须将单例存储在某个地方并提供对它的访问),并使序列化代码变得更难,例如通过燃料。

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

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

最佳答案

我在另一篇文章中写了一些关于它的内容。

单元并不是真正的单例(因为单例是在四本书中定义的),其想法不是为每个单元创建一个类,而是根据您需要的每个单元实例化 BaseUnit 或 DerivedUnit 等。

因此,例如您可以创建:

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

然后写:

1*meter = (100*centimeter)

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

因此,您可以做两件事来实现平等:

  1. 拥有众所周知的对象(使用全局变量或全局根对象来访问它们,就像 Chalten 所做的那样)
  2. 修改 Unit 中的 #=,如果两个单元具有相同的名称,则使它们相等(或者使用 #= 的这个定义创建一个子类)

使用默认#= 实现的主要原因是:

  1. 这是更通用的解决方案
  2. 单位(在现实生活中)是唯一的,因此在模型中是唯一的
  3. 拥有一个“仪表”对象比每次需要时都创建一个更有意义。

主要缺点如您所见,第一次看到它可能难以理解,但同样,您只需要有一种方法来访问对象并解决问题。

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

希望对您有所帮助!如果您还有其他问题,请告诉我!

关于oop - 阿空加瓜 : Base Units - would equality comparison be better than identity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29826095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com