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?因为当您打开检查器时,您会以某种方式模拟该对象。换句话说,你成为检查对象,你有权修改自己。
当然,如果您修改了内部状态,则由您来保留不变量。对于分数,有两个不变量:
denominator > 0
(numerator gcd: denominator) = 1
总之,检查器会假设您知道自己在做什么,并会让您按照自己的方式修改所有实例变量。但是,在发送消息时,对象的行为方式应使其不变量得以保留。
当然,有些私有方法应该小心处理(即只能由 public 方法发送),但一般的想法是直接操作对象是一件好事并且不会呈现障碍或保障。
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?因为当您打开检查器时,您会以某种方式模拟该对象。换句话说,你成为检查对象,你有权修改自己。
当然,如果您修改了内部状态,则由您来保留不变量。对于分数,有两个不变量:
denominator > 0
(numerator gcd: denominator) = 1
总之,检查器会假设您知道自己在做什么,并会让您按照自己的方式修改所有实例变量。但是,在发送消息时,对象的行为方式应使其不变量得以保留。
当然,有些私有方法应该小心处理(即只能由 public 方法发送),但一般的想法是直接操作对象是一件好事并且不会呈现障碍或保障。