IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Design Patterns Discussion :

[DAO] Compréhension du pattern


Sujet :

Design Patterns

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut [DAO] Compréhension du pattern
    Bonjour,
    J'essaye de mettre en pratique le design pattern DAO, mais je rencontre quelques difficultés.
    Je travaille sur un site censé (entre autres) géolocaliser des véhicules munis de boîtiers GPS. Une BDD récupère les données que ces boîtiers envoient, mettons que cette partie récupération fonctionne.

    Je vous décris rapidement une partie simplifiée de ma base :
    Releve(r_id_releve, #id_vehicule, date_releve)
    ReleveGps(#g_id_releve, latitude, longitude)
    Vehicule(id_vehicule, #id_boitier, immatriculation)

    Sur ma carte, je veux afficher un ensemble de points, concernant un véhicule, aux bonnes positions, indiquant l'heure de passage et l'immatriculation du véhicule, d'un point de vue SQL, je ferai un truc du genre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT `date_releve`, `latitude`, `longitude`, `immatriculation`
    FROM `releve`
    JOIN `releve_gps` ON `r_id_releve`=`g_id_releve`
    NATURAL JOIN `vehicule`

    J'ai créé mes objets suivant le DP DAO (ou ce que j'en ai compris), avec les méthodes CRUD, j'ai donc :
    * ReleveDAO
    * ReleveGpsDAO
    * VehiculeDAO
    Déjà, je ne me trompe pas sur ce point ?

    Moi ce que je veux, c'est donc un objet Position, du genre :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Position {
    	private $date_releve;
    	private $latitude;
    	private $longitude;
    	private $immatriculation;
     
    	...
     
    }

    Comment et où est-ce que je construis cet objet ?
    Est-ce que je construit un VehiculeDAO, puis avec son id un ReleveDAO, puis avec son id un ReleveGpsDAO, je récupère les données des trois et je les met dans Position ? Ce qui me paraît perdre l'avantage du SQL et notamment des jointures.
    Est-ce qu'il faut un objet PositionDAO, dont la création se ferait avec le code SQL que j'a décrit plus haut ?
    Si c'est cette dernière solution, alors qu'est-ce qui devient mon objet métier ?

    J'espère que ce n'est pas trop embrouillé et je vous remercie d'avance.

    PS 1: J'ai suivi, entre autres, le cours sur Le design pattern DAO de dvp.
    PS 2: Je code en php, mais vous pouvez me répondre dans un autre langage si vous voulez.

    [Edit] Orthographe

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    C'est ma première contribution à cette partie des forums, alors je peux dire des c*******.

    Déjà merci, je m'aperçois que j'utilise un DP depuis longtemps et sans le savoir.

    Enfin pour te répondre, je dirai que tes positions (fournies par ta requête) sont en quelques sortes une vue de tes données donc pour moi si tu veux suivre le DP DAO, il faut créer un PositionDAO, une classe Position comme tu le proposes.

    Concernant ceci :
    Est-ce que je construit un VehiculeDAO, puis avec son id un ReleveDAO, puis avec son id un ReleveGpsDAO, je récupère les données des trois et je les met dans Position ? Ce qui me paraît perdre l'avantage du SQL et notamment des jointures.
    Cela ne me semble pas du tout la bonne solution pour la raison que tu donnes et pour les perfs.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Tu peux avoir tous les DAO que tu veux, ça dépend beaucoup de la manière dont fonctionne ton appli

    Si tu veux créer des objets Position ça a du sens de créer un PositionDAO pour tirer parti d'une jointure. Des DAO plus "élémentaires" (ReleveDAO, ReleveGpsDAO, VehiculeDAO) servent toujours pour créer ces entités, les modifier, ou les afficher dans une autre vue. On peut très bien imaginer une grille qui récapitule les véhicules, un écran qui fait des stats sur les relevés...

    edit: ouh pas vu que le message datait de mai !!

  4. #4
    Membre averti

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 379
    Points
    379
    Par défaut
    Ah bien j'ai une question et ce topic semble le meilleur endroit pour continuer. Je ne voulais en démarrer un nouveau qui aurait sensiblement porter le même titre !

    J'explique ce que j'ai fait jusqu'à présent. J'ai créer une bibliothèque de classe dans laquel j'ai créer plusieurs data source. Une DataSourceFactory permet de sélectionner la source de données que l'on veut (jusqu'à présent, nous avons Access 2002/2003 - moteur Jet 4.0, Access 2007 - moteur ACE, MySQL version 4 et 5, SQL Server 2000, 2005 et 2008).

    Ma première question concerne la classe DataAccess que je vais créer, disons "UsagerDataAccess". Cette classe va utiliser la DataSource du client pour enregistrer, vous l'aurez devinez, un "Usager". Je me demandais si UsagerDataAccess devait avoir les requête SQL coder à l'intérieur ? Si c'est le cas, je vois mal comment je pourrais créer un XMLDataSource (ou encore NoSQLDataSource) et lui envoyer une requête SQL. Sa demanderais que je code beaucoup de matériel dans chacune de mes DataAccess. J'ai commencé à faire une ébauche qui utiliserais les DataSources via les Méta, mais je ne sais pas par ou commencé.

    Ma deuxième question doit être intimement lié à celle de huit_six. J'ai disons des Usager ayant aucun ou plusieurs Droit. Mon object Usager possède ainsi une liste (ou un array) de Droit. Est-ce la responsabilité à UsagerDataAccess de créer les Droit ou est-ce que Usager doit utiliser un quelconque DroitDataAccess ? Dans ma tête, il n'y a aucun problème à ce que DroitDataAccess puisse exister même si UsagerDataAccess est en mesure de créer des Droit, mais je parle au niveau conceptuel est-ce recommender de donnée la même responsabilité à deux classes distinct. La raison pour laquel je suis en faveur de cette technique c'est de réduire au minimum le nombre de requête à la base de données.
    ______________
    Never underestimated the browser
    Ne jamais sous-estimé le navigateur
    Vic Gundotra, Google IO 2009

Discussions similaires

  1. [EJB3 Entity] Utilisation du pattern DAO ?
    Par damien77 dans le forum Java EE
    Réponses: 3
    Dernier message: 14/02/2009, 19h01
  2. integrer le pattern DAO
    Par questionneuse dans le forum JSF
    Réponses: 7
    Dernier message: 01/02/2008, 16h56
  3. [RegEx] Pb de compréhension de pattern
    Par seb_perl dans le forum Langage
    Réponses: 3
    Dernier message: 13/09/2006, 09h11
  4. [Plugin][Hibernate] Patterns DAO avec hybernate
    Par BarbapapaDK dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/03/2006, 09h53
  5. [VBA] ADO & DAO --> Compréhension Recordset ... Probl
    Par snoopy69 dans le forum VBA Access
    Réponses: 4
    Dernier message: 14/10/2005, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo