Oop 是否存在副作用的情况;获得;或;计算;手术合法吗?

Oop 是否存在副作用的情况;获得;或;计算;手术合法吗?,oop,side-effects,Oop,Side Effects,我刚刚完成了一个六小时的UI效果调试,我发现我最喜欢的框架实现了一个名为“getVisibleRegion”的接口函数,禁用了一些UI功能(显然忘记了恢复它) 我对框架提出了一个bug,但这让我想到了正确的设计:在什么情况下,对一个名称仅意味着计算/获取操作的操作产生任何副作用是合法的 对于那些对实际细节感兴趣的人:我有一个关于一个bug的报告,我的插件不断破坏Eclipse的代码折叠,因此折叠条消失了,无法“展开”或看到折叠的代码。 我将其追溯到一个ITextViewer上对getVisibl

我刚刚完成了一个六小时的UI效果调试,我发现我最喜欢的框架实现了一个名为“getVisibleRegion”的接口函数,禁用了一些UI功能(显然忘记了恢复它)

我对框架提出了一个bug,但这让我想到了正确的设计:在什么情况下,对一个名称仅意味着计算/获取操作的操作产生任何副作用是合法的

对于那些对实际细节感兴趣的人:我有一个关于一个bug的报告,我的插件不断破坏Eclipse的代码折叠,因此折叠条消失了,无法“展开”或看到折叠的代码。
我将其追溯到一个ITextViewer上对getVisibleRegion()的调用,其类型表示源代码查看器。现在,ITextViewer的文档确实声明“实现ITextViewerExtension5的查看器可能会被迫更改显示的输入文档的部分,以履行此合同”。然而,实际的实现有点过于宽松,只是永久性地禁用了投影(折叠),再也无法恢复

我会说没有。

这可能是一种边缘情况,甚至不符合副作用的条件,但如果计算结果缓存在对象中,那么这是可以接受的。即使如此,它也不会对调用方造成影响。

我能想到的最大原因是缓存结果。

只有当副作用非常明显时,我才会说。下面是一个简单的例子:

  MakeMyLifeEasyObject mmleo = new MakeMyLifeEasyObject(x, y, z, default, 12, something);

  Object uniqueObjectOne = mmleo.getNewUniqueObject();
  Object uniqueObjectTwo = mmleo.getNewUniqueObject();

  System.out.println(uniqueObjectOne.getId() == uniqueObjectTwo.getId()); // Prints "false"
现在在我的理论中,makeMyLiFeEasy对象有一些内部计数器(比如DB表上的主键)。get有一个副作用。我也能想出这样的想法:

  Object thing = list.getNextObjectAndRemoveFromList();
这也有道理

现在需要注意的是,在这两种情况下,最好重命名该方法

第一个名称可能比createNewUniqueObject()更好,而第二个名称(在本例中为pop())更好

当它不是我上面给出的一些半人为的例子时,我会说,如果值需要很长时间才能创建或可能会被大量使用,并且需要加速,那么应该进行的唯一副作用就是创建/更新一些缓存

例如,一个对象包含一组字符串。您有一个方法getThingToPrint(),它需要将一组数据连接在一起。你可以在调用时创建一个缓存,这将是一个副作用。当您更新事物所基于的其中一个字符串时,集合将使缓存无效(或更新它)


像你描述的那样?听起来确实像个虫子。我想不出在什么情况下这样做是个好主意。如果这是一个预期的行为,而不是一个bug,那么应该将其重命名为其他行为(即disableThingAndGetVisibleRegion())。

是的,我承认我也这样做,尽管我通常会小心地记录它,并确保它是访问值的唯一途径。或者get()的副作用首先可能是从数据库中读取值。这实际上不是副作用,因为它不会改变任何东西的状态。除非你说的是从数据库中读取,然后缓存到对象中。。。