我想在逻辑部分“数据”、“命令”和“引擎”中打破我的应用程序模型。应用程序之外的每个人都应该获得对数据的只读访问权和对命令的访问权。使用这些命令,他们可以操作数据。
其中,我在包中构建了我的应用程序:
myapp.model.data
myapp.model.commands
myapp.model.engines
引擎和命令都需要对数据进行写访问。因此,我必须以公共接口的形式公开写访问权限。这导致了外部客户端也对我的数据有写访问权限的问题,这是不允许的。这样做的问题是,命令使用事件调用引擎来检查数据的一致性。客户端将在不调用引擎的情况下操作数据,从而破坏数据的一致性。
这个问题有没有常见的做法。请不要建议我必须等到 Java 8,因为我现在想编写我的应用程序。将所有类都放在一个包中也是没有选择的,因为我会失去对应用程序的概述。
编辑
我阅读了一些关于树和图的不变性的网站。我看到了一个名为 zipper 的好主意:http: //scienceblogs.com/goodmath/2010/01/13/zippers-making-functional-upda/。不幸的是,这似乎不适用于我的情况。
回想一下,我有一个复杂的对象图结构,它将随着时间的推移进行操作。目标是限制客户端仅使用我的命令来操作数据。因此,在我的情况下,我没有看到不变性的优势。
为此,我为数据类提供了两个公共接口,一个是只读的,一个是可写的。每当客户端使用只读实例调用命令时,我只需将其强制转换为可写实例。这种方法解决了我的问题,但有两个很大的缺点。首先,我假设每个只读实例同时是一个可写实例——这可能会导致一些丑陋的错误。其次,客户端可以做同样的事情并具有写访问权限。但我不能说这是他们自己的错。
有人有更好的主意吗?