Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/08/2007, 14h45   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 41
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 41
Points : 14
Points : 14
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 :
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 :
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
Rei Itchido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 16h09   #2
alex_pi
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :-)
  Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 13h44   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2005
Messages : 41
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 41
Points : 14
Points : 14
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
Rei Itchido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 02h25   #4
ndp
Membre confirmé
 
Avatar de ndp
 
Inscription : mars 2003
Messages : 227
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 227
Points : 228
Points : 228
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
ndp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h53.


 
 
 
 
Partenaires

Hébergement Web