是否存在对“获取”或“计算”操作产生副作用的合法情况?

时间:2008-12-10 01:57:42

标签: oop side-effects

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

我已经向框架提交了一个错误,但是这让我想到了正确的设计:在什么条件下,对一个名称仅仅意味着计算/获取操作的操作产生任何副作用是合法的? / p>

对于那些对实际细节感兴趣的人:我有一个关于我的插件不断破坏Eclipse代码折叠的错误的报告,以便折叠条消失,无法“展开”或看到折叠代码。 我将其追溯到ITextViewer上对getVisibleRegion()的调用,该类型代表源代码查看器。现在,ITextViewer的文档确实声明“实施ITextViewerExtension5的观看者可能被迫改变显示的输入文档的分数,以便履行此合同”。然而,实际的实现过程中有点,只是永久禁用投影(折叠),永远不会把它带回来。

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

我会说没有。

答案 2 :(得分:2)

这可能是一种边缘情况,它甚至不能作为副作用,但如果计算结果缓存在对象中,那么这是可以接受的。即便如此,它也不会对来电者产生影响。

答案 3 :(得分:2)

我会说只有非常明显的副作用会发生。这是一个简单的例子:

  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"

现在在我的理论中,MakeMyLifeEasyObject有一些内部计数器(就像数据库表上的主键)。 get有副作用。我也可以想出这样的想法:

  Object thing = list.getNextObjectAndRemoveFromList();

这也是有道理的。

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

第一个可能会更好,因为createNewUniqueObject(),而在第二个不同的名称(在这种情况下pop())会更好。

如果不是我上面给出的一些半人为的例子,我会说应该进行的唯一副作用是创建/更新一些缓存,如果值需要很长时间才能创建或者可能会被使用很多有点需要加快。

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

像你描述的那样?绝对听起来像一个bug。我想不出那种情况会是个好主意。如果这是一个预期的行为而不是一个bug,那么它应该重命名为其他东西(即disableThingAndGetVisibleRegion())。

答案 4 :(得分:0)

obj.getBusyDoingStuff()