1

我的模拟模型包含表面上的代理。代理由 表示class Agent,它们的位置由表示class Point,表面本身由表示class Surface。每个点实际上只是一对数字。

为了模拟一个代理的运动,我需要知道他在哪个表面上(例如,在圆环上,他永远不会碰到陆地的末端,但在圆柱体上,他会。)

我的问题是我是否应该将对象class Point的引用作为实例属性添加到Surface

如果我这样做,class Point会变得更加复杂,并且效率会受到影响(而不是处理成对的数字,我将处理成对的数字加上一个参考)。class Surface这尤其令人讨厌,因为在单个程序运行中只有一个实例曾经实例化。

如果我不这样做,我将无法提供class Agent方法move。相反,我必须从一个知道表面代理和单个代理的外部类对代理的运动进行建模。这种方法在逻辑上似乎不太吸引人。

4

1 回答 1

1

我不确定为什么添加一个额外的属性是一个效率问题——它不会影响速度,它只会将对象的大小增加 10 个字节左右。因此,除非您与数百万特工(Mssterrr Annnderssssonnn)打交道,否则我不会担心。

您也可以有一个单一的 Surface,它在模块中作为本地创建并通过模块方法访问(比全局更简洁)。所以像:

 import TheSurface
 class Agent:
  ...
   def Move(self,x,y):
     surface = TheSurface.getSurface()
     surface.canIMoveTo(x,y)
     ....

TheSurface.py 将具有某种创建表面的初始化方法,需要在程序启动时调用。@DesignPattern 人:这是“单例”模式吗?

使用 Surface 创建代理并将其存储为属性是一种更好的方法。不过,我不明白您为什么要将其添加到 Point 中。

结构类似于:

  • 代理在表面上
  • 代理在某个点

因此,您可以推断该点位于表面上,并且无需单独对其进行建模,除非您可能正在处理与代理无关的点,但是您将拥有表面的上下文反正。它总是“对的,现在我必须在这个表面上放一些树 - createTree(surface,point)”等。表面上的任何东西都有一个表面和一个点。

于 2011-01-31T08:53:34.243 回答