gpt4 book ai didi

math - 为什么算术+和-的Pharo定义基本上是重复的代码?

转载 作者:行者123 更新时间:2023-12-04 19:53:11 24 4
gpt4 key购买 nike

我正在查看 Pharo 的内部结构,并注意到算术 + 和 - 的定义看起来非常相似:

+ aNumber
"Refer to the comment in Number + "
aNumber isInteger ifTrue:
[self negative == aNumber negative
ifTrue: [^ (self digitAdd: aNumber) normalize]
ifFalse: [^ self digitSubtract: aNumber]].
aNumber isFraction ifTrue:
[^Fraction numerator: self * aNumber denominator + aNumber numerator denominator: aNumber denominator].
^ aNumber adaptToInteger: self andSend: #+


- aNumber
"Refer to the comment in Number - "
aNumber isInteger ifTrue:
[self negative == aNumber negative
ifTrue: [^ self digitSubtract: aNumber]
ifFalse: [^ (self digitAdd: aNumber) normalize]].
aNumber isFraction ifTrue:
[^Fraction numerator: self * aNumber denominator - aNumber numerator denominator: aNumber denominator].
^ aNumber adaptToInteger: self andSend: #-

在我看来,这完全违背了面向对象的设计方式,而且通常很糟糕。为什么没有人找到更好的解决方案?

最佳答案

我能想到的最简单的事情是:

- aNumber
^self + aNumber negated

但是,这将产生成本:
  • 创建另一个中间大整数或分数
  • 再发送两条消息来执行 - 操作

  • 我们在这里看到的是对优化的致敬。不是过早优化,这是一种广泛使用的低级操作。

    这段代码中还有其他不完美的地方:
  • isInteger 和 isFraction 的用法也可以用某种双重调度代替
  • digitAdd: 和 digitSubtract: 方法适用于以符号形式存储的整数 - 幅度而不是 2-补码,这是一个不完全明显的实现细节,值得评论 - 或者最好更名为 digitAddMagnitude: digitSubtractMagnitude:
  • 关于math - 为什么算术+和-的Pharo定义基本上是重复的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223635/

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