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

标签 math smalltalk pharo

我正在查看 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/

    相关文章:

    math - 链式哈希表查找的预期最坏情况时间复杂度?

    smalltalk - 如何改变变形位置

    smalltalk - 我如何在 Smalltalk Pharo 中睡几秒钟,并且能够打断它?

    smalltalk - Pharo 的 Pen 类在哪里?

    algorithm - 笛卡尔幂 - 通过递归

    algorithm - 楼层求和算法

    closures - 动态创建 BlockClosures?

    git - Git 上的 Pharo 项目

    graphics - 在 AthensTutorial Canvas 来自哪里?

    java - 求整数的倒数