Squeak Smalltalk:为什么在 inspect window 中修改分子和分母值后,分数不会减少?

Squeak Smalltalk: Why reduction of a fraction does not happen after numerator and denominator values are modified in the inspect window?

a := 12 / 24.

a 是分配了小数 12 / 24 的变量。 1 / 2 是打印时的答案。现在打开检查弹出窗口 window,我更改分子和分母的值并猜测答案与之前相同,1 / 2。真正发生的是输出保持 12 / 24,这对我来说有点奇怪。

我录制了一个视频来帮助理解这个问题。

https://www.youtube.com/watch?v=LNj24f2wP0M

为什么在inspect中修改了分子和分母值后分数没有减少window ??

我的回答是基于Pharo的方言,我相信Squeak没有强弱之分。 因为你第一次除整数。 Integer>>/

中有片段
(Fraction numerator: self denominator: aNumber) reduced

注意调用reduce方法

如果在 Inspector 工具中更改 denominator/nominator 后调用 reduce 方法,分数对象也会被减少。

您描述的行为是正确的,并且是预期的行为。

作为开发人员,您可以通过两种方式修改对象:

  1. 正在向他们发送消息
  2. 从检查员修改他们的实例变量

首选方法1,因为它符合范式。那么,为什么我们有方法 2?因为当您打开检查器时,您会以某种方式模拟该对象。换句话说,你成为检查对象,你有权修改自己。

当然,如果您修改了内部状态,则由您来保留不变量。对于分数,有两个不变量:

  1. denominator > 0
  2. (numerator gcd: denominator) = 1

总之,检查器会假设您知道自己在做什么,并会让您按照自己的方式修改所有实例变量。但是,在发送消息时,对象的行为方式应使其不变量得以保留。

当然,有些私有方法应该小心处理(即只能由 public 方法发送),但一般的想法是直接操作对象是一件好事并且不会呈现障碍或保障。