2010-01-22 6 views
3

Cela peut être quelque chose de très trivial, mais je suis un novice avec certains modèles orientés objet.Utilisation d'un DAO dans un autre DAO - bonne ou mauvaise pratique?

En termes simples, est-ce une mauvaise pratique d'utiliser des méthodes d'un DAO dans un autre DAO? J'essaie de créer une entité au sein d'un DAO et trouve très difficile de créer cette entité en utilisant juste ce DAO. Alors, est-ce correct d'utiliser d'autres méthodes DAO dans l'autre DAO?

Exemple:

public function readAllUsers() { 
    $sql = "SELECT * FROM user"; 
    return $this->execute($sql); 
} 

public function execute($sql) { 
$result = mysql_query($sql, $this->getDBConnection()) 
       or die(mysql_error()); 
    $user = array(); 
    if(mysql_num_rows($result) > 0) { 
     for($i = 0; $i < mysql_num_rows($result); $i++) { 
      $row = mysql_fetch_assoc($result); 
      $user[$i]->setUsername(row["userName"]); 
      ...set user info... 
      $user[$i]->setAddresses($addressDAO->readAddressByUserId($userId)); 
     } 
    } 
    return $user; 
} 

NOTE: Il y a un bon peu d'attributs comme celui-ci dans l'entité utilisatrice qui ont un à plusieurs avec l'entité elle-même (adresses, e-mails, numéros de téléphone , etc.). La requête qui serait nécessaire (avec toutes les tables de liaison utilisées) serait extrêmement complexe.

Merci,

Steve

+2

Pouvez-vous donner un exemple? – Elijah

+0

Exemple fourni. –

Répondre

2

Non, je ne le ferais pas du tout comme ça.

Semble que vous voulez modéliser une relation un-à-plusieurs, donc vous espérez utiliser le DAO interne pour obtenir les nombreux objets et ensuite les mapper dans l'un.

Résistez à cette tentation.

Votre code vous dit pourquoi:

  1. La boucle externe ramène des objets N avec un à plusieurs.
  2. La boucle interne interroge une fois pour chacun des N objets et ramène ses dépendances.

Noob classique Erreur d'interrogation N + 1. La latence du réseau va vous tuer pour un grand N.

La bonne chose à faire est de faire une requête qui ramène toutes vos données à la fois et les mapper dans le (s) objet (s) en question. Peut-être un outil ORM comme Hibernate serait un bon ajustement. Si vous avez beaucoup de relations 1: m, je serais prêt à parier que Hibernate ferait aussi bien, ou mieux, que vous.

+0

Pouvez-vous expliquer un peu pourquoi c'est une mauvaise chose à faire? –

+0

@duffymo: Je pense que c'est une déclaration assez audacieuse (jeu de mots). Je suppose que tu ne veux pas utiliser ça pour toutes les occasions, n'est-ce pas? Je veux dire, dans certaines occasions (avec de grands ensembles de données un-à-plusieurs) le chargement paresseux pourrait être plus approprié, non? –

+0

Le chargement paresseux est une bonne raison d'utiliser un outil ORM qui le supporte correctement. Je ne voudrais pas que quelqu'un d'écrire une telle chose à partir de zéro. Et quand je dis "toutes vos données", je ne parle pas de millions de lignes qui entraînent une erreur de mémoire insuffisante. Vous devez être intelligent sur ce que vous allez chercher. Les requêtes Google renvoient des millions de résultats, mais ils vous les retournent 25 à la fois. Quelqu'un qui écrit un DAO devrait être tout aussi judicieux sur ce qu'ils apportent de la persistance et dans la mémoire. – duffymo