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

PHP & Base de données Discussion :

[Conception] Classe dans autre classe


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut [Conception] Classe dans autre classe
    Bonjour à tous,

    Pas très inspiré pour le titre

    Je voulais avoir un conseil.
    Prenons un exemple simple : la classe user et la classe groupe. Un user appartient à un groupe.

    Vaut-il mieux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    class Groupe {
        var groupe_id;
        var groupe_nom;
     
        [...]
     
        function get_groupe_nom() {
            return($this->groupe_nom);
        }
    }
     
    class User {
        var groupe_id;
     
        [...]
     
        function get_instance_groupe() {
            $instance_groupe = new Groupe($this->groupe_id);
    	return($instance_groupe);
        }
    }
     
    $instance_user = new User(1);
    $instance_groupe = $instance_user->get_instance_groupe();
    $nom_groupe = $instance_groupe->get_groupe_nom();
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class Groupe {
        var groupe_id;
        var groupe_nom;
     
        [...]
     
        function get_nom() {
            return($this->groupe_nom);
        }
    }
     
    class User {
        var groupe_id;
     
        [...]
     
        function get_groupe_nom() {
            $instance_groupe = new Groupe($this->groupe_id);
    	return($instance_groupe->get_groupe_nom());
        }
    }
     
    $instance_user = new User(1);
    $nom_groupe = $instance_user->get_groupe_nom();
    Quelle est la méthode la plus pratique (et pourquoi? )

    Merci d'avance pour vos conseils.




    EDIT : message pour un modo qui passerait... Je pense que ce topic a plus sa place dans "Conception" que dans "Langages en général", si quelqu'un peut le deplacer merci

  2. #2
    alex_pi
    Invité(e)
    Par défaut
    Bah... c'est pas pareil :-)

    Si quelqu'un (comprendre un autre objet) ayant accès à un user devrait avoir le droit d'acceder à son groupe, alors la première solution est la plus logique.

    En revanche, s'il ne doit avoir accès qu'au nom du groupe, il faut utiliser la seconde methode (c'est une sorte d'encapsulation).

    A priori, il n'y a pas de réponse miracle, puisque ça dépend completement de ton appli.

    En revanche, ça me semble assez bizare de recréer un objet "groupe" à chaque fois que du veut accéder au nom associé à un identifiant. Enfin si tu es sûr de ne le faire qu'une fois, pourquoi pas, mais sinon, tu devrais peut être après quelque chose de plus "malin", comme une classe avec une table de hashage a qui du passe un identifiant, qui regarde dans la table si l'objet existe déjà, le retourne le cas échéant, ou le crée et l'insère dans la table sinon. Ou en plus simple (mais moins général), garder le groupe dans l'objet utilisateur (quite à ne le créer qu'à la première consultation)

    Et dans tous les cas, si la prog orientée objet, n'oublie pas de regarder du coté des designs patterns.

    Have fun :-)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut
    Toujours dans le même ordre d'idée...

    Je suis dans un contexte PHP / MySQL.

    J'ai ma classe GROUPE et ma classe USER (qui sont aussi des tables de ma BD)
    Un user appartient toujours à un groupe.

    Je veux afficher dans une page tous les users d'un groupe donné.

    Dans ma classe GROUPE j'ai une méthode liste_user() qui me renvoie un tableau qui contient tous ses users.
    Ce que je faisais jusqu'ici c'était de mettre dans ce tableau des instances d'USER. Ainsi dans ma page je parcours le tableau et j'affiche le nom des users avec $user->get_nom(). Tout cela me parraissait logique et conforme à l'esprit POO (mais peut-être que je me trompe).

    Mais je me pose maintenant la question de l'optimisation et des performances.

    En effet, dans ma méthode liste_user(), en mettant des instances de USER dans le tableau, je fais autant de requête MySQL (requête qui me permet de renseigner les attributs de USER lors de l'instanciation) qu'il y a d'users.
    En prennant un cas extreme avec un groupe contenant 1000 users, je fais donc 1000 requêtes

    Je me demande donc si il n'est pas préférable de faire une seul requête dans liste_user() (SELECT nom FROM user WHERE groupe_id=x), de boucler dessus et de faire un tableau de la forme $tableau['nom'] = la valeur. Derrière je parcours le tableau et j'affiche le nom des users avec $tableau['nom']. Je gagne ainsi énormement en performance.

    Mais en faisant cela je perds de la souplesse car si je décide d'afficher en plus le prenom de l'user je dois changer ma requête alors qu'avec la 1ere solution j'y accedais directement avec $user->get_prenom()

    Comment gérez-vous ce genre de situation?
    Merci de vos conseils

  4. #4
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    Citation Envoyé par Rei Itchido Voir le message
    ...
    Ce que je faisais jusqu'ici c'était de mettre dans ce tableau des instances d'USER. Ainsi dans ma page je parcours le tableau et j'affiche le nom des users avec $user->get_nom(). Tout cela me parraissait logique et conforme à l'esprit POO (mais peut-être que je me trompe)....
    Perso, quand je peux mettre en place un design comme ca, je trouve ca plutot cool. Mais comme pour tout, la solution a tout les problemes possible n'existe pas. Il faut s'adapter, et bien sur qu'il y a des cas ou tout charger en memoire serait catastrophique.

    Citation Envoyé par Rei Itchido Voir le message
    ...
    Mais je me pose maintenant la question de l'optimisation et des performances.
    bien vu. Je suis d'accord avec ceux qui pensent qu'il ne faut pas faire d'optimisation trop tot, sans profiling. ceci dit optimisation <> mauvais choix en terme de performance.

    Citation Envoyé par Rei Itchido Voir le message
    En effet, dans ma méthode liste_user(), en mettant des instances de USER dans le tableau, je fais autant de requête MySQL (requête qui me permet de renseigner les attributs de USER lors de l'instanciation) qu'il y a d'users.
    En prennant un cas extreme avec un groupe contenant 1000 users, je fais donc 1000 requêtes
    heuresement que non. Le language SQL est quand extrement riche pour te ramener ton resultat en une seule requete. Dans un cas extreme, tu pourrais meme imaginer une seule requete derriere chaque utilisation de ton systeme. Mais ca, est-ceq ue c'est souhaitable?


    Citation Envoyé par Rei Itchido Voir le message
    Je me demande donc si il n'est pas préférable de faire une seul requête dans liste_user() (SELECT nom FROM user WHERE groupe_id=x), de boucler dessus et de faire un tableau de la forme $tableau['nom'] = la valeur. Derrière je parcours le tableau et j'affiche le nom des users avec $tableau['nom']. Je gagne ainsi énormement en performance.

    Mais en faisant cela je perds de la souplesse car si je décide d'afficher en plus le prenom de l'user je dois changer ma requête alors qu'avec la 1ere solution j'y accedais directement avec $user->get_prenom()

    Comment gérez-vous ce genre de situation?
    Merci de vos conseils
    Il n'y a pas de recette miracle (one size fit all solution), et en plus il y a tellement d'aspect contradictoires (genre reutilisation/performance).
    Je pense qu'il ne faut pas faire d'erreur "grossiere" comme les 1000 requetes, mais apres tu mets deja en balance des aspects contradictoire qu'il va falloir trancher. S'il n'y a pas enormement d'utilisateur, tu peux essayer de charger en memoire le groupe + tous ses utilisateurs

Discussions similaires

  1. appelle d'une méthode d'une autre classe dans ma classe
    Par EpiTouille dans le forum Débuter
    Réponses: 5
    Dernier message: 08/08/2013, 08h30
  2. Representer un type d'une autre classe dans le diagramme de classe.
    Par Hello_World dans le forum Diagrammes de Classes
    Réponses: 5
    Dernier message: 07/05/2009, 23h58
  3. [Joomla!] appel de fonction d'une autre classe dans un autre fichier
    Par lkryss dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/07/2007, 16h55
  4. [Conception] Classe dans une classe
    Par Fluxy dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/07/2007, 17h02
  5. Utilisation de forms et classes dans autre répertoire
    Par xfr3dx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/03/2007, 12h22

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