我的模拟模型包含曲面上的代理。代理人由class Agent
表示,他们的位置由class Point
表示,表面本身由class Surface
表示。每个点实际上只是一对数字。
为了模拟一个特工的动作,我需要知道他在哪个表面上(例如,在圆环上,他永远不会撞到一个地面,但是在圆柱体上,他会。)
我的问题是我是否应该将class Point
作为实例属性添加到Surface
对象的引用中。
如果我这样做,class Point
会变得更复杂,效率会受到影响(而不是处理成对的数字,我会处理数字对加上一个引用)。这尤其令人讨厌,因为在单个程序运行中只有一个class Surface
实例被实例化。
如果我不这样做,我将无法class Agent
move
方法。相反,我必须从一个知道表面和个体代理的外部类来模拟代理的运动。这种方法似乎在逻辑上不太吸引人。
答案 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。
结构类似于:
因此,您可以推断Point是在Surface上,并且不需要单独对其进行建模,除非您可能正在处理不以某种方式涉及到代理的Point,但是您将拥有上下文无论如何,一个表面。它总是“正确,现在我必须在这个表面上放置一些树 - createTree(表面,点)”等。表面上的任何东西都有一个表面和一个点。