java - 有没有更好的方法来引用包含对象的对象?
问题描述
到目前为止,对于我所做的许多应用程序,总有一些类包含许多其他类。例如,我可能有一个拥有宠物的 Player 类。但是,有时我希望能够通过 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;
}
}
如果我想通过 Pet 引用 Player,那么当然可以使用owner
变量。但是有没有更好的方法来做到这一点?我经常会有包含类等的类,所以我的玩家类将拥有一个宠物,它可能有一个玩具,然后玩具有一个对玩家的引用。见鬼,我什至可能有高于玩家的课程,例如世界城市中的建筑。因此,Pet's Toy 可能涉及整个世界。我觉得必须有更好的方法来做到这一点。
解决方案
我觉得必须有更好的方法来做到这一点。
嗯,这真的取决于规模。当您的对象模型非常小,并且您(非常)确定在接下来的几个月或几年内没有重大改进时......那么这种简单的“双重簿记”可能是一个合理的答案。
但在更现实的情况下:是的,这种方法很快就会失效。
然后,它通常有助于研究领域驱动设计的想法。首先:看看你在建模什么。当然,我的宠物狗认识我,但它不知道“拥有”的概念,它不知道我是它的主人。
因此,第一个解决方案可能是:简单地owner
从 Pet 类中删除该部分。相反,您可能想要创建某种索引。在最简单的形式中,这可能是一张地图。某个中央注册中心被告知X 拥有宠物 Y。现在您的代码可以询问 Y 是否知道 X 的所有者。
回到 DDD,你会谈到聚合。以某种方式属于一起的事物。但是你不能只找到任何一个成员,你总是必须通过一些根元素。例如,请参见此处。
推荐阅读
- sql - 自联接表上的 MSAccess 缓慢更新
- php - 每 30 分钟返回不同的用户名 PHP
- php - Laravel:将模型注入其中时销毁触发从表中选择的方法
- c# - 在我的调度循环中重新分配 DateTime 对象的值时,DateTime 多线程 UDP Sender 具有非常不同的时间结果
- c# - 如何解决 MySqlException: Expected end of data packet 问题?
- python-3.x - Gmail API 读取凭据“utf-8”编解码器无法解码位置 0 的字节 0x80:无效的起始字节
- python - 为什么 append() 不遵循 if 语句的条件?
- python - 在引用不存在的 python enums.Enum 时强制执行“未解析的属性引用”
- debugging - 如何在 WebStorm 中调试 yarn / npm
- python-3.6 - 如何在vscode中为python unittest配置单元测试