Точки моделирования на поверхности
Моя имитационная модель содержит агентов на поверхности. Агенты представлены class Agent
, их местоположение по class Point
и сама поверхность class Surface
, Каждая точка - это просто пара чисел.
Чтобы смоделировать движение агента, мне нужно знать, на какой поверхности он находится (например, на торе он никогда не достигнет края земли, но на цилиндре он это сделает).
Мой вопрос, должен ли я добавить к class Point
в качестве атрибута экземпляра ссылка на Surface
объект.
Если я сделаю, class Point
становится более сложным, и эффективность страдает (вместо того, чтобы иметь дело с парами чисел, я буду иметь дело с парами чисел плюс ссылка). Это особенно раздражает, так как есть только один случай class Surface
когда-либо создавался в одной программе.
Если я не сделаю, я не смог бы дать class Agent
move
метод. Вместо этого мне придется смоделировать движение агентов из внешнего класса, который знает как поверхностных, так и отдельных агентов. Этот подход кажется логически менее привлекательным.
1 ответ
Я не уверен, почему добавление дополнительного атрибута является проблемой эффективности - это не повлияет на скорость и увеличит размер объекта только на 10 байт или около того. Поэтому, если вы не имеете дело с миллионами агентов (миссис Анндерссссонн), я бы не беспокоился об этом.
В качестве альтернативы вы можете иметь единственную поверхность, которая создается в модуле как локальная и доступна через метод модуля (немного чище, чем глобальный). Так что-то вроде:
import TheSurface
class Agent:
...
def Move(self,x,y):
surface = TheSurface.getSurface()
surface.canIMoveTo(x,y)
....
TheSurface.py будет иметь некоторый метод инициализации, который создает поверхность, который должен быть вызван при запуске программы. @DesignPattern people: это шаблон синглтона?
Создание агента с поверхностью и сохранение его в качестве атрибута - лучший способ. Я не понимаю, почему вы добавили бы это в пункт хотя.
Структура примерно такая:
- Агент на поверхности
- Агент в точке
Следовательно, вы можете сделать вывод, что точка находится на поверхности, и нет необходимости моделировать ее отдельно, если, возможно, вы не имеете дело с точками, которые каким-то образом не связаны с агентами, но тогда у вас будет контекст поверхности тем не мение. Всегда будет "Хорошо, теперь я должен поместить несколько деревьев на эту поверхность - createTree (поверхность, точка)" и т. Д. Все, что на поверхности, имеет поверхность и точку.