Journal Orienté objet et base de données

Posté par  (site web personnel) .
Étiquettes : aucune
0
9
déc.
2003
Je suis en train d’essayer de développer une petite application me permettant de savoir combien de jour il reste avant un événement donné. Par exemple, à l’affichage l’on 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, j’essaie de le réaliser en PHP orienté objet. J’ai 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 d’un objet enregistrer dans la base de données ?

Merci
  • # Re: Orienté objet et base de données

    Posté par  . Évalué à 1.

    1. En général une date "nommée" c'est ou bien un jour fixe ( jour 123 ), ou bien un jour du type "le premier samedi de tel mois" ou bien autre chose. tu as des jours nommées qui se repetent chaque année a numéro de jour fixe ou pas, tu as des jours nommées qui n'arrivent pas tous les ans mais tous les x ans....

    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  (site web personnel) . Évalué à 1.

    Tu devrais créer une classe "FabriqueEvenement". Cette classe répondra à tes deux questions puisque d'une part c'est elle qui contiendra la méthode "listeEvenement" et d'autre part elle effectura le lien (mapping) entre ta base et ton objet.

    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  (site web personnel) . Évalué à 1.

      Mais comment faire dans ce cas pour que l'objet Evenement met à jour la base de données ?

      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  (site web personnel) . Évalué à 1.

        Dans ta classe "fabrique" tu crées des méthodes :
        - 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  (site web personnel) . Évalué à 1.

          c'est pas vraiment un problème, étant donnée que je compte utilisé PHP5.
        • [^] # Re: Orienté objet et base de données

          Posté par  . Évalué à 1.

          salut,
          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  (site web personnel) . Évalué à 1.

    Voilà ma solution (en 5 minutes hein, c'est juste une piste ;o) ). J'utilise plutôt Java, donc je ne sais pas dans quelle mesure ma solution est facilement implémentable en PHP objet.

    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)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.