Oop 组织相互关联的对象

Oop 组织相互关联的对象,oop,language-agnostic,simulation,Oop,Language Agnostic,Simulation,这是一个一般性的问题,我不知道它是属于编程还是堆栈溢出 我在写一个小模拟。没有深入研究它的细节,就要考虑到许多身份。它们对应于对象,因为我使用的是OOP语言 有人居住在这个世界上 有地图 一张地图有许多地段,这些地段都是具有某些特征的土地 有部落(男人属于部落) 有一个名为Position的泛型类来定位元素 有机器人控制着移动男人的部落 有一个世界代表模拟的世界 等等 如果将模拟世界作为一个数据库,对象将是包含大量引用的表,但在内存中,我必须使用不同的策略。比如说,一个部落有一系列的男人作为

这是一个一般性的问题,我不知道它是属于编程还是堆栈溢出

我在写一个小模拟。没有深入研究它的细节,就要考虑到许多身份。它们对应于对象,因为我使用的是OOP语言

  • 人居住在这个世界上
  • 地图
  • 一张地图有许多地段,这些地段都是具有某些特征的土地
  • 有部落(男人属于部落)
  • 有一个名为Position的泛型类来定位元素
  • 机器人控制着移动男人的部落
  • 有一个世界代表模拟的世界
等等

如果将模拟世界作为一个数据库,对象将是包含大量引用的表,但在内存中,我必须使用不同的策略。比如说,一个部落有一系列的男人作为财产,世界上有一系列机器人,部落,地图。地图有一个字典,它的键是位置,值是很多。一个人的位置就是他所站的位置

我建立这种联系的方式非常随意。例如,我可以在世界上有一个男人阵列,或者每个地块有一个男人阵列(男人站在一块土地上),或者每个机器人有一个男人阵列(男人由机器人控制)

这样做,我还必须传递很多对象。例如,机器人必须掌握地图和对手的信息,才能决定如何移动其对手

如前所述,在数据库中,我将有一个Guys表连接到Lots表(指示其位置)、Tribe表(指示其属于哪个部落),因此也很容易查询“所有处于位置的Guys[1,5]”。“123部落的所有人”。“所有站在b34地块上的机器人B控制的人不属于456部落”等等

我曾经使用过API,要获得最简单的信息,您必须创建CustomerContextCollection的实例,并将其传递给CustomerQueryFactory,以便将CustomerPlaceQuery返回给。。。当人们批评OOP并引用冗长的抽象,很快就会让人觉得可笑时,这就是我的意思。我希望避免这些事情,并且必须依赖于深层抽象和(反模式)抽象上下文

问题是:管理以多种方式深度链接的实体和实体集合的首选、干净的方式是什么

我想说的是,对于您的核心问题没有“正确”的答案——这是管理以多种方式链接的实体集合的最佳方法。它实际上取决于应用程序的类型(模拟)-以下是一些想法:

执行时间重要吗?

如果是这种情况,那么真的没有办法分析模拟器将以何种方式迭代(查询)池中的对象:勾画出基本的模拟循环,并检查迭代什么类型的模型实体需要什么类型的事件(我假设您正在开发离散事件模拟?)。然后,您应该以优化最频繁/最耗时的事件的方式组织数据结构(而不是“任意设置连接”)。此外,您可能希望使用特殊的数据结构(例如)组织具有需要经常查询的属性的实体(例如,位置数据)。对于一些典型的问题,例如碰撞检测,也有很多方法可以有效地解决它们(因此,请寻找合适的库/框架,例如For)

您希望它有多灵活?

如果您真的想让它变得超级灵活,并且真的不想决定模型实体的层次结构,为什么不直接使用一个?正如您已经说过的,数据库很容易适用于您的问题(并且您可以很容易地保存模型状态,这可能也很有用)

多干净才算足够干净?


如果您想绝对确保模拟器的其余部分不受您在模型表示方面所做的设计选择的影响,将其隐藏在接口后面(例如,
ModelWorld
),该接口定义了模拟器可能调用的所有查询类型的方法(这与第二点正交,可能有助于第一点,即找出您的模拟器显示的访问模式)。这允许您轻松地更改实现,而不会影响模拟器代码的任何其他部分。

这取决于您对“干净”的定义在我的例子中,我将clean定义为:我可以以一种明显、高效的方式实现所需的行为

构建OOP软件不是一个数据建模练习。我建议退一步。这些对象中的每一个实际上都做什么?您将实现什么方法

只是因为“男人们有很多”这并不意味着lot对象需要一个Guy集合;它只需要一个,如果对一个lot进行的操作影响到其中的所有Guy。即使如此,它也不一定需要Guy集合-它需要一种方法来获取lot中的Guy。这可能是一个内部存储的集合,但也可能是一个调用ba的简单方法进入世界寻找符合标准的人。这种查找的实现应该对任何人都是透明的

从你问题的要旨来看,你似乎是从“我如何生成报告”的角度来思考这个问题。退后一步,想想你首先要实施的行为

我发现另一件非常有价值的事情是区分实体和值。实体是身份重要的对象——你可能有两个家伙,都叫“克里斯”,但他们