nic*_*sor 5 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: #+
Run Code Online (Sandbox Code Playgroud)
和
- 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: #-
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,这完全违背了设计事物的OO方式,而且通常很糟糕.为什么没有人找到更好的解决方案?
我能想到的最简单的事情是:
- aNumber
^self + aNumber negated
Run Code Online (Sandbox Code Playgroud)
然而,这会产生成本:
我们在这里看到的是对优化的致敬。不要过早优化,这是广泛使用的低级操作。
这段代码还有一些不完美的地方: