在使用状态的行为之后更改了对象状态

时间:2009-10-17 19:03:19

标签: language-agnostic oop concurrency

我想给my previous个问题第二次机会,因为我认为我选择了一个不好的例子。

问题是我应该如何处理一个对象在我用它做某事后仍然可以改变的情况,而新状态与正在做的事情相关。

伪代码示例:

class Book
    method 'addChapter': adds a chapter

class Person
    method 'readBook': read an object of class Book

现在当我要求这个人读一本书时,至少在PHP中,对象将通过引用传递,书籍对象仍然可以改变。我可以在第3章和第4章之间插入一章,而这个人已经在阅读第6章了。我怎样才能处理这种情况?

3 个答案:

答案 0 :(得分:3)

也许通知这个人这本书已经改变了?你可以用事件来做(不确定事件如何在PHP中工作)。另一种方法是实现Observer / Observable模式。

答案 1 :(得分:2)

根据您的业务需求,上述任何答案都有助于获得良好的解决方案。

你问“我应该如何处理情况......”取决于:

在您已将图书发送给用户合法后,是否添加了一章?如果不是 - 你应该抛出一个异常(我不知道PHP是否支持异常,但无论如何 - 你应该把它视为错误情况)。

另一种解决方案是确保公开和对象已经完整并且不希望对其进行更改 - 这可能是一个有效的解决方案,特别是如果您决定启用此类“流式传输”是性能但是你没有真正的证据证明这一部分是性能瓶颈。

现在让我们坐下来添加新的章节是合法的。

您是希望现有客户端知道更改还是只知道新客户端?

如果是前者 - 你应该实现某种通知逻辑(其中一种建议形式是发布者/订阅者模式,但还有其他模式)。

如果信件 - 您应该使您的图书对象不可变,那么在现有客户端中将不会看到变异操作,而是他们将创建一个全新的书籍,将其传递给新客户(人员)。

我可以继续,但我建议下次你详细说明你要解决的确切问题,因为你可以看到 - 同样的问题可以在不同的域中有不同的解决方案。

答案 2 :(得分:0)

在我看来,您正在尝试执行并发任务。您可能需要考虑将活动序列化到您的对象,当然在PHP的情况下。