2011-01-31 2 views
1

Моя симуляционная модель содержит средства на поверхности. Агент представлен class Agent, их местоположения - class Point, а сама поверхность - class Surface. Каждая точка - это всего лишь пара чисел.моделирующие точки на поверхности

Для моделирования движения является агентом, я должен знать, какую поверхность он на (например, на торе, он никогда бы не попал конец земельного, но на цилиндре, он будет.)

Мой вопрос, является ли Я должен добавить к class Point в качестве атрибута экземпляра ссылку на объект Surface.

Если да, то class Point усложняется, и эффективность страдает (вместо того, чтобы иметь дело с парами чисел, я буду иметь дело с парами цифр плюс ссылка). Это особенно раздражает, так как только один экземпляр class Surface когда-либо создавался в одном прогоне программы.

Если вы этого не сделали, я не смог бы дать class Agent a move. Вместо этого мне пришлось бы моделировать движение агентов из внешнего класса, который знает как поверхностные, так и индивидуальные агенты. Этот подход кажется логически менее привлекательным.

+0

Не можете ли вы хранить информацию о поверхности в «Агент»? Это похоже на самый естественный подход ко мне ... – senderle

+0

На самом деле я неправильно читал сообщение и думал, что он имел в виду. Добавление в точку кажется странным ... – Spacedman

+0

Да, да, добавление в Агенту прекрасно. Выбор действительно заключается в том, поддерживает ли здесь избыточную информацию. – max

ответ

1

Я не уверен, почему добавление дополнительного атрибута является проблемой эффективности - оно не повлияет на скорость, и оно увеличит размер объекта на 10 байт или около того. Поэтому, если вы не имеете дело с миллионами агентов (Missterrr Annnderssssonnn), я бы не стал беспокоиться об этом.

В качестве альтернативы вы можете иметь одну поверхность, созданную в модуле как локальную и доступную через модульный метод (бит более чистый, чем глобальный). Так что-то вроде:

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

TheSurface.py будет иметь какой-то метод инициализации, который создал поверхность, что нужно было бы назвать в начале программы. Люди @DesignPattern: это шаблон «singleton»?

Создание агента с поверхностью и сохранение его как атрибута - лучший способ. Я не понимаю, почему вы добавили его в точку.

Структура что-то вроде:

  • Агент находится на поверхности
  • Агент находится в точке

Отсюда можно сделать вывод, что точка находится на поверхности, и нет необходимости моделировать это отдельно, если, возможно, вы не имеете дело с Точками, которые каким-то образом не связаны с агентами, но тогда у вас будет контекст поверхности в любом случае. Всегда будет «Правильно, теперь я должен положить несколько деревьев на эту поверхность - createTree (поверхность, точка)» и т. Д. Все, что на поверхности имеет поверхность и точку.

+0

Да, это синглтон, но я не вижу смысла делать синглтон здесь. – senderle

+0

Правда. Просто создайте агента с объектом Surface. OP не хотел добавлять атрибут Surface к Point, поэтому я не добавил атрибут Surface для Agent. Это было бы лучше. Я напишу ... – Spacedman

+0

Спасибо за ответ. У меня есть связанный с этим вопрос, но он слишком велик, чтобы добавлять комментарии, поэтому он находится здесь: http://stackoverflow.com/questions/4860686/where-in-class-hierarchy-should-instance-methods-be-written. – max

Смежные вопросы