Полиморфная ассоциация Rails с различным поведением - PullRequest
0 голосов
/ 18 января 2012

Я хочу создать полиморфную ассоциацию очереди.Я имею в виду две разные очереди, одна о создании зданий, одна о создании юнитов.

Хотя очередь имеет много одинаковых свойств, таких как добавление или удаление элементов, есть и некоторые различия.

Например, у здания есть уровень, а у единицы - нет.У полиморфного класса QueuedItem обычно есть несколько методов, например, метод remove.Однако метод удаления отличается в зависимости от того, является ли объект зданием или юнитом, и требует другой обработки.

Более того, столбец уровня совершенно незначителен для армейского предмета в очереди.

Итак, мой вопрос, исходя из этих потребностей, как лучше всего это спроектировать?Если я просто выберу 3 модели (пункт из очереди всегда принадлежит городу):

Building
Unit
QueuedItem -> queued_id, queued_type, city_id

Или мне нужно добавить больше промежуточных моделей?Что ты думаешь?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Судя по вашему описанию, вам действительно нужны классы для самих очередей, а не только для элементов в очереди.Таким образом, методы и операции, связанные с очередью, переходят в класс очереди, а вещи, относящиеся только к зданиям или объектам, входят в эти классы.

Класс очереди будет включать только методы добавления, удаления и, возможно, переупорядочение его элементов, которые вряд ли потребуют разных реализаций для разных типов объектов.Лучше, чтобы у этих методов не было никаких побочных эффектов, кроме добавления или удаления из очереди - если вам нужно, чтобы что-то произошло после удаления объекта, например, это может сделать вызывающая сторона Queue # remove.Если вам нужно, чтобы сами очереди вели себя по-разному в зависимости от того, содержат ли они здания или объекты, вам понадобятся BuildingQueue и UnitQueue, которые могут наследовать свои общие методы от базового класса Queue или включенного модуля Queue.

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

0 голосов
/ 18 января 2012

Вы можете создать module с логикой для добавления / удаления из очереди и включить его в оба класса. Если вы планируете использовать его во многих классах, вы также можете переместить его в плагин и добавить помощники в модели, которые должны быть реализованы в виде очередей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...