【问题标题】:modelling points on a surface曲面上的建模点
【发布时间】:2011-01-31 08:44:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你不能在Agent中存储有关表面的信息吗?这对我来说似乎是最自然的方法......
  • 实际上我误读了帖子并认为这就是他的意思。添加到 Point 似乎很奇怪...
  • 是的,添加到代理是完全没问题的。选择真的是在这里保留冗余信息是否可以。
  • 嗯,我认为当你有许多这样的相互关联的类时,这种冗余是不可避免的。但这只是一个参考——它们很便宜。要问的问题是,信息属于哪里?由于信息对于给Agent一个移动方法是必要的,所以它属于Agent

标签: python oop software-design


【解决方案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 中。

结构类似于:

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

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

【讨论】:

  • 是的,这是一个单例——但我不明白在这里制作一个单例的意义。
  • 是的。只需使用 Surface 对象创建代理。 OP不想给Point添加Surface属性,所以我没有给Agent添加Surface属性。这将是更好的方法。我会修改...
  • 感谢您的回答。我有一个相关的问题,但是它太大了,无法放入 cmets,所以在这里:stackoverflow.com/questions/4860686/….
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2016-04-20
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
相关资源
最近更新 更多