Je suis en train dessayer de développer une petite application me permettant de savoir combien de jour il reste avant un événement donné. Par exemple, à laffichage lon pourra voir la chose suivante :
10 jours avant les vacances de Noël
21 jours avant le nouvel an
En ce qui concerne le développement, jessaie de le réaliser en PHP orienté objet. Jai commencé la modélisation du programme en UML (cf http://skink.org/class.gif(...)) et je bloque sur 2 choses :
1. Où mettre la méthode listeEvenement() qui me renvoie la liste de tous les événements existants ? Dans la classe Evenement, dans une classe à part ?
2. Comment gérer la relation entre les objets et la base de données ? Pour récupérer les informations dun objet enregistrer dans la base de données ?
Merci
# Re: Orienté objet et base de données
Posté par Roger Rabbit . Évalué à 1.
bref à toi de trouver comment tu peux modeliser pour exprimer tous les cas dont tu auras besoin.
Sinon ton modele actuel est redondant, tu stocke des données qui peuvent être retrouvée par le calcul [ genre le nom du jour c'est calculable ]. D'autre part tu stocke les jours selon [jour,mois,année] en entier , ca n'est pas bien car 1) tu gaches de l'espace 2) tu peux socker le jour 21390491/2394091/234029 ce qui n'est pas un jour valide.... il existe des types spécifiques pour représenter une date, renseigne toi dans la doc de ton sgbd.
Sinon pour repondre, je mettrais listeEvenement() en dehors de la classe Evenement, mais ca c'est chacun ses gouts.
2. a. tu récuperes les données via une une requete, ensuite tu mappes le résultats vers ton objet
b. en general on utilise sql pour recuperer les données dans un sgbd. Il existe des outils pour réaliser ce mappage automatiquement, mais bon c'est assez compliqué vu ton niveau sans vouloir te déprimer ;)
bon code !
[^] # Re: Orienté objet et base de données
Posté par Fabien (site web personnel) . Évalué à 1.
C'est en fait surtout le mapping qui me pose problème...
[^] # Re: Orienté objet et base de données
Posté par Fabien (site web personnel) . Évalué à 1.
x/10/12/2003 : pour une date "fixe"
x/10/xx/xxxx : pour tous les 10 de chaque mois
x/10/12/xxxx : pour tous les 10 decembre
vendredi/13/xx/xxxx : pour les vendredi 13 ;)
# Re: Orienté objet et base de données
Posté par Lawrence P. Waterhouse (site web personnel) . Évalué à 1.
L'idée (basiquement), c'est de faire la (les) requête(s) SQL dans ta classe "FabriqueEvenement". Aucune requête, ni même référence (quelle qu'elle soit (nom de colonne, de table...)) à la base ne doit se trouver dans la classe "Evenement".
Ensuite, il faut parcourir le résultat de ta requête pour convertir chaque ligne résultat en un objet "Evenement". Les objets ainsi créés sont mis dans un tableau puis retournés par "listeEvenement".
Voilà, c'est déjà une première approche objet, sachant qu'on peut toujours améliorer. Cette "solution" a le mérite d'être simple à implémenter et faire évoluer.
[^] # Re: Orienté objet et base de données
Posté par Fabien (site web personnel) . Évalué à 1.
Je comptais faire une methode du genre create() pour créer dans la BdD un enregistrement avec les attributs de l'objet. Et plsu ou moins pareil pour les méhtodes update() et delete().
[^] # Re: Orienté objet et base de données
Posté par Lawrence P. Waterhouse (site web personnel) . Évalué à 1.
- create(Evenement evt) -> evt est initialisé avec les champs obligatoires (not null) de la table.
- update(Evenement evt) -> evt est initialisé avec les nouvelles valeurs
- delete(Evenement evt) et/ou delete(int idEvt)
Pour les update et delete, il faut identifier ton enregistrement par une clé primaire (j'en ai pas vu sur ton schéma). Le plus simple est d'utiliser un INTEGER (comme dans le deuxième delete) qui serait auto-incrémenté automatiquement (pas de prise de tête dans le create, tu pourras laisser ce champ à null). C'est simple en mysql, SQLite je connais pas.
Théoriquement les méthodes de la fabrique sont "static" mais je crois pas que ça soit possible en php 4. Ca n'est pas bloquant, il suffira d'instancier la classe "fabrique" à chaque utilisation.
[^] # Re: Orienté objet et base de données
Posté par Fabien (site web personnel) . Évalué à 1.
[^] # Re: Orienté objet et base de données
Posté par Gabriel . Évalué à 1.
Voilà j'aurais fait tout exactement comme Ema dit.
Parfait! A mon humble avis
Avec une petite finasserie si tu veut c'est que de plus en plus souvent je fais deux classes.
une Fabrique que tu appelles pour faire les Create Read Update et Delete . J'ai lu un jour que cela s'appelle le Design Pattern CRUD (create, read (ou retrieve, update, delete) et le Retrieve, c'est le ListeEvenement dont tu parles.
Et la fabrique appelle une FabriqueSQL qui elle fera le mappage dans la base de données.
Avantage, tu centralises le mappage des données dans une seule base. Et tu pourras faire évoluer ton modèle en implémentant du cache dans la Fabrique.
Ainsi, tu appelle Fabrique : l'objet demandé est en cache? oui, le renvoyer; non: requête sql.
Autre avantage : après pour changer d'une base sql à une base xml ou à des fichiers plats ou à ce que tu veux tu le changes pas l'implémentation de Fabrique Mais que de FabriqueSql (grâce à des Interface)
Si quelqu'un trouve que je dis que des conneries, qu'il dise ce qu'il en pense (parce que c'est ma manière de bosser, mais je vous cache pas qu'il faut beaucoup taper de code)
voili voilou...
# Re: Orienté objet et base de données
Posté par jcs (site web personnel) . Évalué à 1.
Pour moi, la classe Evenement est immutable (désolé j'ai jamais trouvé d'équivalent français correct). Donc on ajoute une classe Calendrier qui est une liste d'Evenements avec les accesseurs qui vont bien (ajouter, supprimer, evenementSuivant, tousLesEvenementsAvant...). On peu aussi avoir une classe FabriqueEvenement (design pattern Factory) comme préconisé dans les commentaires ci-dessus pour créer les instances d'Evenement.
Pour répondre à tes questions :
1. je mets la méthode listeEvenement() dans la classe Calendrier (là je crois que c'est évident)
2. la communication avec la base de données se fait dans la classe Calendrier puisque les instance d'Evenement sont immutables, elles sont ajoutées à la BD quand on les ajoute au Calendrier, et enlevé quand on les retire.
Reste à trouver un moyen intelligent de stocker les Evenements dans la BD pour pouvoir les récupérer sans tous les télécharger dans un cache (pour les dates c'est trivial, mais pour les Evenements récurrents du type 3e samedi du mois ou le lundi de chaque semaine, c'est plus difficile)
[^] # Re: Orienté objet et base de données
Posté par Fabien (site web personnel) . Évalué à 1.
En tout cas ça me fait penser à une chose : il va falloir que je m'achete un bon bouquin sur les design patterns
[^] # Re: Orienté objet et base de données
Posté par Gabriel . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.