对于到目前为止我开发的许多应用程序,总有一些类包含许多其他类。例如,我可能有一个带Pet的Player类。但是,我希望有时能够通过宠物来指代玩家。以下代码将对此有效:
public class Player {
Pet p;
public Player() {
p = new Pet(this);
}
}
public class Pet {
Player owner;
public Pet(Player owner) {
this.owner = owner;
}
}
如果我想通过宠物指代玩家,那么可以肯定的是,我可以使用owner
变量。但是有更好的方法吗?我经常会有包含包含类的类的类,因此我的Player类将拥有一个Pet,其中可能有一个Toy,然后Toy引用了Player。地狱,我什至可能在玩家身上开设其他课程,例如世界城市中的建筑物。因此,宠物玩具可能会提及整个世界。我觉得必须有更好的方法来做到这一点。
答案 0 :(得分:0)
我觉得必须有更好的方法来做到这一点。
嗯,这实际上取决于规模。如果您的对象模型很小,并且您(肯定)可以确定在接下来的几个月或几年中没有重大的改进……那么,这种简单的“双重记账”可能是一个合理的答案。
但是在更现实的情况下:是的,这种方法很快就失效了。
然后通常有助于研究域驱动设计的思想。首先:看看您要建模的内容。当然,我的爱犬认识我,但它不知道“拥有”的概念,也不知道我是他的主人。
因此,第一个解决方案可能是:从Pet类中删除该owner
部分。相反,您可能想要创建某种索引。最简单的形式就是地图。 告诉某些中央注册表,X拥有宠物Y。现在您的代码可以去询问Y是否知道X的所有者。
回到DDD,您在这里谈论聚合。某种程度上属于一起的事物。但是,您不能只访问任何个成员,您始终必须经过一些 root 元素。例如,请参见here。
答案 1 :(得分:0)
如果链接是一对一的关系,那么最好有一个封装对象来聚集您的宠物和您的播放器。或者,如果您的应用不太大,请在父母与孩子之间保持双重链接。
根据您对城市,建筑物和世界的描述,我认为该链接很容易变成一对多,并且如果扩展的话可能会变得棘手。在这种情况下,您可能必须简化与双向地图之类的链接。基本上,它是一个地图,您可以像正常地图一样从键中获取值,也可以从值中获取键。在这种情况下,您可以轻松地将狗及其宠物链接起来。