2009-10-17 88 views
1

我想给my previous问题提供第二次机会,因为我认为我选择了一个不好的例子。在使用状态的行为后改变对象状态

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

实例伪代码:

class Book 
    method 'addChapter': adds a chapter 

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

现在,当我问的人读一本书,至少在PHP对象将通过引用传递,这本书的对象仍然可以改变。当人已经阅读第6章时,我可以在第3章和第4章之间插入一章。我该如何处理这些情况?

+0

你的意思是像添加一个状态为“不要触摸,而我正在阅读”或“我更新:不读”?? – jldupont 2009-10-17 19:06:59

+0

更像:嗨'人',你说你已经读过'书',你对第4章有什么看法? – koen 2009-10-17 19:09:16

回答

2

根据您的业务需求,上述任何答案都是很好的解决方案。

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

是增加一章你已经运了一本书后,用户是否合法?如果不是的话 - 你应该抛出一个异常(我不知道PHP是否支持异常,但无论如何 - 你应该视之为错误情况)。

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

现在让我们坐在新的一章的增加是合法的。

您想让现有客户知道更改还是仅更新客户?

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

如果这封信 - 你应该让你的书籍对象不可变,那么在现有客户端就不会看到变异的操作,相反他们会创建一个全新的书籍,并传递给新的客户端(人员)。

我可以继续下去,但我建议下次再详细说明您正在尝试解决的具体问题,因为您可以看到,同一问题在不同的域中可能有不同的解决方案。

3

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

+0

观众(也称为发布 - 订阅)模式+1 – orip 2009-10-17 19:09:43

0

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