在表面上建模点

时间:2011-01-31 08:44:40

标签: python oop software-design

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

为了模拟一个特工的动作,我需要知道他在哪个表面上(例如,在圆环上,他永远不会撞到一个地面,但是在圆柱体上,他会。)

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

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

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

1 个答案:

答案 0 :(得分:1)

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

您也可以使用单个Surface在模块中创建为本地,并通过模块方法访问(比全局更清晰)。如下所示:

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

TheSurface.py会有一些创建表面的初始化方法,需要在程序启动时调用。 @DesignPattern人:这是一个'单身'模式吗?

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

结构类似于:

  • 代理位于Surface
  • 代理人在点

因此,您可以推断Point是在Surface上,并且不需要单独对其进行建模,除非您可能正在处理不以某种方式涉及到代理的Point,但是您将拥有上下文无论如何,一个表面。它总是“正确,现在我必须在这个表面上放置一些树 - createTree(表面,点)”等。表面上的任何东西都有一个表面和一个点。