2012-01-18 6 views
0

Je souhaite créer une association de file d'attente polymorphe. J'ai deux files d'attente différentes à l'esprit, l'une concerne la création de bâtiments, l'autre concerne la création d'unités.Rails Association polymorphe avec un comportement différent

Bien que la file d'attente ait de nombreuses propriétés identiques, comme l'ajout ou la suppression d'éléments, il existe également des différences.

Par exemple, un bâtiment a un niveau, contrairement à une unité. La classe polymorphe QueuedItem a normalement certaines méthodes, comme la supprimer. Cependant, une méthode de suppression est différente, selon que l'objet est un bâtiment ou une unité et nécessite une manipulation différente.

En outre, la colonne de niveau est totalement insignifiante pour un élément de l'armée en file d'attente. Donc, ma question est, en fonction de ces besoins, quelle est la meilleure façon de concevoir cela? Devrais-je aller de l'avant avec 3 modèles (un élément mis en attente appartient toujours à une ville):

Building 
Unit 
QueuedItem -> queued_id, queued_type, city_id 

Ou je aurais besoin d'ajouter des modèles plus intermédiaires? Qu'est-ce que tu penses ?

Répondre

1

De votre description, il semble que vous ayez réellement besoin de classes pour les files d'attente elles-mêmes, pas seulement pour les éléments en file d'attente. Ainsi, les méthodes et les opérations liées à la file d'attente sont placées dans la classe de file d'attente, et tout ce qui est lié uniquement aux bâtiments ou aux unités entre dans ces classes. Une classe de file d'attente n'inclut que des méthodes d'ajout, de suppression et de peut-être réorganisation de ses éléments, qui sont tous susceptibles de nécessiter différentes implémentations pour différents types d'objet. Il est préférable que ces méthodes n'aient pas d'effets secondaires autres que l'ajout ou la suppression de la file d'attente - si vous avez besoin de quelque chose d'autre après la suppression d'un objet, par exemple, cela peut être fait par l'appelant. Si vous avez besoin que les files d'attente se comportent différemment selon qu'elles contiennent des bâtiments ou des unités, vous aurez besoin d'une BuildQueue et d'une UnitQueue, qui hériteront de leurs méthodes communes d'une classe File d'attente de base ou d'un module Queue inclus.

D'autres choses spécifiques aux bâtiments et aux unités (comme si elles ont un niveau, ou quelles sont leurs caractéristiques spécifiques) iraient dans les classes de bâtiments et d'unités proprement dites. Ils n'ont pas besoin de savoir quoi que ce soit sur le comportement d'une file d'attente.

+0

Oui, c'est ce que je pensais aujourd'hui, je pense que c'est probablement la meilleure voie à suivre. Mais pensez-vous qu'une file d'attente devrait être une classe concrète? Je pense que faire quelque chose comme un module mixin est probablement mieux, êtes-vous d'accord avec ça? Ensuite, le modèle concret BuildingQueue hériterait simplement. J'aime plutôt ça. – Spyros

+0

Une classe de base ou un module combinable fonctionnerait parfaitement dans ce cas. Allez avec l'approche que vous aimez le plus :). – Bira

0

Vous pouvez créer un module avec la logique pour ajouter/supprimer de la file d'attente et l'inclure dans les deux classes. Si vous prévoyez de l'utiliser dans un grand nombre de classes, vous pouvez également le déplacer vers un plugin et ajouter les aides aux modèles qui doivent être implémentés en tant que files d'attente.

Questions connexes