2013-06-15 5 views
0

J'essaie de créer une hiérarchie de SQL objets de requête. Ma classe de base s'appellera Query. Il aura des méthodes comme Query.setTable("tableName").Quelque chose de similaire aux traits PHP en Java?

Ensuite, je prévois d'avoir un objet SelectiveQuery étendre l'objet de requête. Cet objet aura des méthodes comme SelectiveQuery.where("aColumn","=","123").

Ensuite plan que je d'avoir UpdateQuery, SelectQuery, DeleteQuery et CountQuery étendent toutes SelectiveQuery. Mon dilemme se pose lorsque j'essaie de comprendre comment créer la classe InsertQuery. Je le veux pour étendre la requête mais ne pas étendre SelectiveQuery.

Le kicker est que InsertQuery et UpdateQuery partagent certaines des mêmes méthodes, telles que setValue("aColumn","aValue"). Je préférerais seulement maintenir les méthodes UpdateQuery et InsertQuery ont en commun dans un endroit. Comment puis-je m'attaquer à cela? Si je programmais en PHP. Je pense que j'utiliserais Traits pour le faire.

enter image description here

+0

Cela me rend si triste de penser que les développeurs non-RoR doivent encore faire des choses comme ça ... – OneChillDude

+1

@ bwheeler96 Qu'est-ce que cela a à voir avec la question? – fge

+0

Ceci est une question de conception ici. Vous devriez changer votre diagramme: faites une base 'ReadQuery' et' WriteQuery' héritant 'Query', et ajoutez une API' Criterion' que vous utiliseriez seulement pour les requêtes qui en ont besoin. Pas besoin de traits;) – fge

Répondre

0

Si InsertQuery et UpdateQuery ont un comportement en commun, vous ne pouvez pas simplement créer une classe abstraite qui contient la substance commune et ont InsertQuery et UpdateQuery prolonger? La classe abstraite étendrait SelectiveQuery donc InsertQuery et UpdateQuery hériteraient également de tous les autres comportements.

Cependant ... Peut-être que vous pourriez jeter un coup d'oeil à un cadre ORM comme Hibernate. Vous ne pouvez pas réinventer la roue, etc.

+0

Je ne veux pas que InsertQuery étende SelectiveQuery. Cela n'a aucun sens d'avoir des méthodes comme InsertQuery.where ("aColumn", "=", "123") – David

+0

Ok, qu'en est-il de la création d'une interface qui décrit les méthodes communes aux deux. Insérer et mettre à jour implémenterait cette interface. Vous pouvez ensuite créer un service qui contient des implémentations de ces méthodes et Insérer et mettre à jour peut déléguer au service. – rcgeorge23

+0

@David si les méthodes n'ont pas de sens pour un certain type de requête, faites-les simplement ne rien faire! Et BTW, vous devriez jeter un oeil sur le modèle de constructeur – fge

1

Vous pouvez remplacer l'héritage par mixin, c'est-à-dire introduire une autre classe telle que Columns, InsertQuery et SelectiveQuery qui auront la classe en tant que membre, donc la syntaxe sera insertQuery.columns().setValue("aColumn", "aValue"). Aussi, jetez un oeil ici: querydsl.

+0

peut être comme ceci: ColumnsQuery étend requête, et UpdateQuery, InsertQuery étend ColumnsQuery – jospratik

+0

@jospratik Pas bien sûr, le sélectionner, compter et supprimer l'auront alors, ce qui n'a pas de sens. – kan

Questions connexes