我正在查看 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
但是,这将产生成本:
我们在这里看到的是对优化的致敬。不是过早优化,这是一种广泛使用的低级操作。
这段代码中还有其他不完美的地方:
关于math - 为什么算术+和-的Pharo定义基本上是重复的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223635/