|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juin 2010 Messages : 5 ![]() |
Bonjour,
J’ai une classe MANIFESTATION qui représente une manifestation culturelle (festival, concert … etc) Chaque instance de ma classe représente donc UNE manifestation. Les caractéristiques de l’ensemble des manifestations (date, lieu, description, … etc) sont stockées dans une DB Comment faire pour supprimer de manière élégante TOUTES les manifestations dont la date est dans le passé. * Méthode 1 : Passer un SQL DELETE sur ma DB en sélectionnant les dates antérieures à la date du jour. C’est très efficace mais cela me semble être du travail de cochon : Aucun objet MANIFESTATION n’est instancié et la logique métier de suppression n’est pas exécutée dans les objets eux-mêmes. (Par ailleurs, si je dois effectuer des traitements particuliers complémentaires pour chaque manifestation supprimée, je ne peux pas le faire avec cette méthode) * Méthode 2 : Instancier un objet pour chaque manifestation présente dans ma DB, parcourir l’ensemble de ces instances ; et pour chacune d’elle, exécuter un méthode qui va supprimer l’objet (… dans la DB) si la date de la manifestation est dans le passé. Cela me semble parfait du point de vue des principes de la POO : Cela encapsule bien la logique et le traitement métier de suppression dans l’objet lui-même. Mais à l’inverse, cela me semble très couteux en ressources : nombre d’instanciations d’objets, nombre de requêtes SQL …). Quelle est la bonne méthode ? Y a-t-il un pattern de conception ? Faut il introduire une classe CONTENEUR_DE_MANIFESTATIONS dans lequel on déporterait une partie de la logique métier de la classe MANIFESTATION, afin de traiter les manifestation en masse ? D’une manière générale, j’ai l’impression que la POO est très efficace et très élégante pour traiter des objets dont le nombre d’instance est peu nombreux ; mais les applications gèrent souvent des milliers d’objet de même type (clients, commandes, produits … etc). Dans ce cas, comment appliquer un traitement métier sur un sous ensemble défini de ces objets de meme type, sans avoir à passer par une instanciation et un parcour de tous les objets ? Merci pour vos lumières, |
|
|
00
|
|
|
#2 | ||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Salut
Comme tu l'as mentionné avec tes deux méthodes, la problématique est que les objets Manifestation ont un comportement particulier lors du delete, alors voici ce que je propose: Citation:
Comme dit précédemment, exécuter 1000x la requête de select pour chaque manifestation est complètement absurde. En revanche, exécuter 1x la requête de sélection qui correspond à tous les tuples matché par la condition (à savoir date < une_date) et construire les objets à la main avec ces tuples est déjà plus faisable. Je te propose de te servir de la classe PDOStatementIterator (disponible ici) et de procéder comme suit: Code :
- le constructeur de la classe Manifestation doit être capable de créer des instances vides qui seront remplies par PDOStatement::fetch à la mode PDO::FETCH_INTO - la classe Manifestation doit soit avoir des propriété publiques qui correspondent aux attributs de la table MySQL soit implémenter __get et __set pour que PDOStatement::fetch puisse remplir l'instance à chaque itération. Voici un exemple d'utilisation: Code :
L'avantage de l'itérateur dans notre cas est qu'on ne consomme que les ressources nécessaires, un seul objet est instancié et on se sert de lui pour traverser une collection. Un autre avantage est de pouvoir coller un iterateur par dessus cet iterateur pour implémenter un comportement particulier (par exemple aller de 0 à 10 avec LimitIterator). Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||||
|
00
|
|
|
#3 | |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Citation:
En revanche si tu risque d'avoir besoin d'agir sur tes objets à supprimer , la solution de Benjamin semble tout à fait adaptée. Perso je suis pas partisan de rajouter une chié de code parce que ça fait joli. Si une solution simple et efficace répond au besoin sans remettre en cause la structure de l'application , je prend |
|
|
00
|
|
|
#4 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com