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

Langage PHP Discussion :

POO: Bonne pratique pour construire une classe


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2017
    Messages : 23
    Points : 23
    Points
    23
    Par défaut POO: Bonne pratique pour construire une classe
    Bonjour,

    Supposons que j'ai une table dans mon SGBD qui s'appelle location et qui comprend les champs id, code_postal, ville, environnement_id, type_id, proprietaire_id.
    Comme le nom des attributs l'indique, environnement_id, type_id, proprietaire_id sont des clés étrangères vers les tables du même nom.
    Environnement indique si la location est à la campagne, à la montagne, à la plage ou en ville
    Type indique si la location est une maison, un appart, ou un autre type de location...
    Proprietaire indique enfin l'identifiant du proprietaire.

    Si je veux construire une classe Location, je mettrais ça par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Location {
     
        private $id;
        private $code_postal;
        private $ville;
        private $environnement;
        private $type;
        private $proprietaire;
     
    }
    Cela dit, .... quand je construis un objet de type Location, est-ce que je suis supposé faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $environnement1 = new Environnement("campagne");
    $type1 = new Type("maison");
    $proprio1 = new Proprietaire("Robert", "Dupont", "France");
    $location1= new Location(75000, "Paris", $environnement1, $type1, $proprio1);
    ou est ce que je devrais plutôt faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $location2 = new Location(75000, "Paris", 2, 1, 33);
    c'est à dire mettre les ids et non les instances des objets

    Vous me direz peut-être que les 2 sont possibles, tout dépendant de ce que je veux faire. Moi ce que je veux c'est connaître les bonnes pratiques. Qu'est ce que l'on attend typiquement comme données dans l'attribut $proprietaire de ma classe Location. Est-ce qu'on attend plutôt un simple identifiant à la manière des clés étrangères des SGBDs ou alors est ce que l'attribut est plutôt supposé contenir une instance de Proprietaire?

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    de mon côté je cherche surtout à avoir un code clair et compréhensible si je retourne sur le code quelques mois plus tard

    si par exemple j'utilisais $location2 = new Location(75000, "Paris", 2, 1, 33); je perdrais du temps à comprendre ce que signifie ces chiffres
    donc j'utiliserai plutôt une de ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $location1= new Location(75000, "Paris", $environnement1->id, $type1->id, $proprio1->id); // pour passer les identifiants
     $location1= new Location(75000, "Paris", $environnement1, $type1, $proprio1); // pour passer les objets complets
    et au final la 2e ligne est plus courte donc plus facile à lire et je finirai surement par choisir la 2e écriture

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2017
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    OK! Je te remercie pour ton avis Mathieu.
    Du coup je me permets de prolonger la discussion sur un problème plus concret...

    Si j'ai ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    // On admet que $db est une instance de PDO
     
    $q = $db->prepare('SELECT id, code_postal, ville FROM location WHERE ville <> :ville');
    $q->execute([':ville' => $ville]);
     
    $q->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Location');
     
    $locations = $q->fetchAll();
    ... ca devrait me récupérer correctement toutes les locations d'une même ville dans la variable $locations et le tout sous forme de collection d'instances de la classe Location
    (sous réserve que ma classe Location soit construite ainsi: )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Location {
     
        private $id;
        private $code_postal;
        private $ville;
    }
    Mais si j'ajoute maintenant une instance de Proprietaire dans mes objets location, je suppose que je modifie la classe Location ainsi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Location {
     
        private $id;
        private $code_postal;
        private $ville;
        private $proprio;
    }
    ... je rajoute une classe Proprietaire ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Proprietaire{
     
        private $id;
        private $prenom;
        private $nom;
        private $nationalite;
    }
    ... mais pour adapter mon code initial, je suis bien embêté...

    Je peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $q = $db->prepare('SELECT id, code_postal, ville FROM location WHERE ville <> :ville');
    $q->execute([':ville' => $ville]);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $q = $db->prepare('SELECT l.id, l.code_postal, l.ville, p.id, p.prenom, p.nom, p.nationalite FROM location AS l INNER JOIN proprietaire AS p ON l.proprietaire_id = p.id WHERE l.ville <> :ville');
    $q->execute([':ville' => $ville]);
    mais je ne sais pas ensuite comment modifier cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Location');
    pour pouvoir faire à nouveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $locations = $q->fetchAll();
    ... et pouvoir ainsi récupérer une collection de locations incluant chacune l'objet proprio concerné

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Vous allez un peu trop vite puisque vous cherchez déjà à optimiser le code.
    Mais la codage d'une fonctionnalité est une 1re étape et en théorie l'optimisation vient comme une 2e étape une fois que la fonctionnalité est bien en place.

    En fonction de l'utilisation de la classe, l'optimisation peut se faire de différentes façons :
    • l'objet Location charge les objets associés (Propriétaire, Environnement,...) dans le constructeur
    • ou alors ces objets sont chargés seulement sur demande
    • ou encore une version intermédiaire serait de charger l'identifiant de Propriétaire dans le constructeur et de charger l'objet Propriétaire en entier sur demande


    tout cela est de la théorie puisque avec de l'expérience vous saurez déjà comment sera utilisée votre classe et donc en pratique, vous coderez déjà un début d'optimisation naturellement

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2017
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    C'est possible que je veuille mettre la charrue avant les boeufs
    Disons que tant qu'à faire j'essayais d'adopter tout de suite les bonnes pratiques, le bon raisonnement plutôt que de partir tout seul dans une direction sans me soucier si c'est ce qui se fait en général.

    J'ai trouvé une solution à mon problème. C'est peut-être pas la meilleure mais elle me permet en tout cas de faire ce que je voulais, c'est à dire écrire le prénom du propriétaire en écrivant $location->getProprietaire()->getPrenom();

    Je commence comme j'avais dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $q = $db->prepare('SELECT l.id, l.code_postal, l.ville, p.id AS proprio_id, p.prenom AS proprio_prenom, p.nom AS proprio_nom, p.nationalite AS proprio_nationalite FROM location AS l INNER JOIN proprietaire AS p ON l.proprietaire_id = p.id WHERE l.ville <> :ville');
    $q->execute([':ville' => $ville]);
    Ensuite j'utilise la constante FETCH_OBJ au lieu de FETCH_CLASS (ce qui me crée un objet de type "stdClass") et je retourne les résultats toujours par le biais du fetchAll cette fois dans une variable $resultat et non $locations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req->setFetchMode(PDO::FETCH_OBJ);
    $resultat = $req->fetchAll();
    Après, je boucle sur chaque ligne de cette variable $resultat pour récupérer à chaque fois mes données et construire tout d'abord mon objet Proprietaire puis mon objet Location contenant cet objet Proprietaire et le mettre enfin à chaque fois dans l'array $locations que je pourrai lire tranquillement ensuite comme je le souhaite dans ma vue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $locations = array();
    foreach ($resultat as $donnee)
    {
    	$proprietaire = new Proprietaire($donnee->proprio_id, $donnee->proprio_prenom, $donnee->proprio_nom, $donnee->proprio_nationalite);
    	$location = new Location($donnee->id, $donnee->code_postal, $donnee->ville, $proprietaire);
    	array_push($locations, $location);
    }		   
    return $locations;

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/05/2016, 17h25
  2. Réponses: 2
    Dernier message: 16/08/2013, 13h14
  3. Bonnes pratiques pour développer une IHM en JAVA
    Par jeromeSERRE dans le forum Interfaces Graphiques en Java
    Réponses: 13
    Dernier message: 20/11/2010, 19h17
  4. Réponses: 1
    Dernier message: 30/04/2008, 19h35

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