Squeak Smalltalk:为什么在检查窗口中修改分子和分母值后才会减少分数?

时间:2017-10-24 08:02:49

标签: smalltalk squeak

a := 12 / 24.

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

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

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

为什么在检查窗口中修改分子和分母值后才会减少分数?

2 个答案:

答案 0 :(得分:3)

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

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

  1. 向他们发送消息
  2. 从检查器修改其实例变量
  3. 方法1是首选,因为它符合范例。那么,为什么我们有方法2?因为当您打开检查器时,您会以某种方式模拟对象。换句话说,您成为受检查的对象,因此您有权自行修改。

    当然,如果您修改内部状态,则由您来保留不变量。在分数的情况下,有两个不变量:

    1. (numerator gcd: denominator) = 1
    2. SELECT c.Email, o.RoleDesc FROM c JOIN o IN c.OrgRoles WHERE c.Email = "jim@test.com" { "id": "23452345234", "Email": "jim@test.com", "OrgRoles": [ { "RoleID": "234234", "RoleDesc": "worker" }, { "RoleID": "345678", "RoleDesc": "Manager" }, { "RoleID": "456433", "RoleDesc": "Admin" } ], "DeviceIDs": [ { "Device": "ABC-12312" }, { "Device": "DEF-76576" } ], "UpdatedDate": "01-12-17", "CreatedDate": "01-11-17", "_rid": "KFokAIrg-QABAAAAAAAAAA==", "_self": "dbs/KFokAA==/colls/KFokAIrg-QA=/docs/KFokAIrg-QABAAAAAAAAAA==/", "_etag": "\"00002d00-0000-0000-0000-59ef0f7f0000\"", "_attachments": "attachments/", "_ts": 1508839295 }
    3. 总而言之,检查员会假设您知道自己在做什么,并允许您按照自己的方式修改所有实例变量。但是,在发送消息时,对象应该以保持其不变量的方式运行。

      当然,有些私人方法应该小心处理(即,只能通过公共方法发送),但一般的想法是直接操纵物体是一件好事,并没有任何障碍或保障。

答案 1 :(得分:2)

我的回答是基于Pharo方言,我相信吱吱声并不是很强烈。 因为你是第一次划分整数。 有来自Integer>> /

的代码段
(Fraction numerator: self denominator: aNumber) reduced

注意调用reduce方法。

如果在Inspector工具中更改分母/分母后调用reduce方法,则分数对象也将减少。