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] Jusqu'à quel niveau d'instanciation aller ?


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut [POO] Jusqu'à quel niveau d'instanciation aller ?
    Je me demandais jusqu'à quel niveau on pouvait aller dans les différentes instanciations, surtout d'un point de vue de performance.

    Exemple (pour un site de football) :
    Je veux lister la liste des matchs d'une équipe sur un championnat :

    1. Instanciation de la classe 'equipe'
    2. Fonction dans la classe 'equipe' qui fait une requête SQL pour avoir la liste des journée
    3. Instanciation de la classe 'journee' pour chacune d'entre elles
    4. Pour chaque journée, instanciation de la classe 'Stade', 'Arbitre', etc.
    5. Dans les instances de 'Stade', 'Arbitre', ... il faut faire des requêtes SQL pour récupérer les infos (nomStade, nomArbitre, ...)
    Etc. etc.

    Donc, pour rester dans la philosophie objet, je devrais instancier tout ce beau petit monde pour obtenir ma liste de matchs.

    Alors que je pourrais toute aussi bien lancer une grosse requête SQL qui récupère automatiquement toutes ces informations sans devoir instancier quoi que ce soit, mais là je me retrouve avec une maintenance plus difficile et du code moins propre.

    J'espère que vous saisissez bien mon problème...

  2. #2
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    les notions de polymorphisme et de surcharge te disent quelque chose ? si non abandonnes la POO pour ton projet...

    Pour reprendre ton exemple un objet équipe a un staff comme attribut, puis peut étendre d'une classe journée qui a des références de date et de lieu, ses attributs sont l'arbitre et le stade, si tu changes de journée, il suffit de modifier les références de la classe parente et non de re-créer un autre objet...

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    J'avoue que je ne suis pas certain de bien saisir ton exemple. Tu me proposes de faire une classe 'equipe' qui hérite de la classe 'journée' ?

    Je comprends ton idée de changer la référence à la classe parente, mais je devrai quand même instancier cette classe parente qui elle devra instancier les classes 'stade' et 'arbitre' pour avoir leurs informations. (Si tu vois que j'ai mal compris ton idée, n'hésite pas à faire un petit shéma rapide qui vaut souvent bien plus que des mots).

  4. #4
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    Citation Envoyé par MiJack
    J'avoue que je ne suis pas certain de bien saisir ton exemple. Tu me proposes de faire une classe 'equipe' qui hérite de la classe 'journée' ?
    J'ai cru comprendre la même chose ...
    Pourrais-tu préciser ta pensée ska_root ?
    a+

  5. #5
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    oui pardon mauvais exemple, et pardon aussi pour le temps de réponse

    bon je vais essayer de me rattraper, en fait je voulais plus parler de surcharge que d'héritage...

    comme un exemple vaut mieux qu'un long discours :
    page test.php
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <select name="journee">
    <option value="10/11/2005" />10/11/2005</option>
    <option value="11/11/2005" />11/11/2005</option>
    <option value="12/11/2005" />12/11/2005</option>
    <option value="13/11/2005" />13/11/2005</option>
    </select>
    <input type="submit" name="sub" value="ok" />
    </form>
    <?php
    require_once "class.foot.php";
    $journee = (!isset($_POST['journee']))?(''):($_POST['journee']);
    $err = '';
     
    // simulation requete base de donnees
    switch($journee) {
       case '10/11/2005': $matchs_array = array(2,0); break;
       case '11/11/2005': $matchs_array = array(1);   break;
       case '12/11/2005': $matchs_array = array(3);   break;
       case '13/11/2005': $matchs_array = array();    break;
    }
     
    if(!empty($journee)) {
     
       // instance
       try {$match = new Match();}
       catch(Exception $e) {$err=$e->getMessage();}
     
       echo "<h1>Pour la journée du $journee</h1>";
     
       foreach ($matchs_array As $matchs_joues) {
     
          try {
     
             // surcharge du constructeur
             $match->__construct($matchs_joues);
     
             $nom_equipe1   = $match->getEquipe1();
             $nom_equipe2   = $match->getEquipe2();
             $nomArbitre    = $match->arbitre->getNom();
             $prenomArbitre = $match->arbitre->getPrenom();
             $nomStade      = $match->stade->getNom();
             $placesStade   = $match->stade->getPlaces();   
     
          }catch(Exception $e) {$err=$e->getMessage();}
     
     
          if(!empty($err)) echo "<div style=\"border:1px solid #000;\">$err</div>\n";
     
    echo <<<EOF
       
       <h2><u>Match : $nom_equipe1/$nom_equipe2</u></h2>
       <h3><u>Arbitre :</u></h3>
       <ul>
       <li>nom : $nomArbitre</li>
       <li>prenom : $prenomArbitre</li>
       </ul>
       
       <h3><u>Stade</u></h3>
       <ul>
       <li>nom stade : $nomStade</li>
       <li>nombre de place : $placesStade</li>
       </ul>
    EOF;
       }
    }
     
    // verification
    echo "<hr />contenu de \$match : <pre>";
    var_dump($match);
    echo "</pre>";
    ?>
    page class.foot.php
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    <?php
     
    class Match {
     
       // champs de classe
       public $arbitre;
       public $stade;
       private $id;
     
       // constructeur
       public function __construct($id=null) {
     
          if(isset($id)) {
     
             $this->id=$id;
     
             // simulation requete base de donnees
             $id_arbitre = $this->selectArbitre();
             $id_stade   = $this->selectStade();
     
             // sous-classes
             $this->arbitre = new Arbitre($id_arbitre);
             $this->stade   = new Stade($id_stade);
     
          }
     
       }
     
       private function selectArbitre() {
          switch($this->id) {
             case 0:$ida = 2;break;
             case 1:$ida = 1;break;
             case 2:$ida = 0;break;
             case 3:$ida = 2;break;
          }
          return $ida;
       }
     
       private function selectStade() {
          switch($this->id) {
             case 0: $ids=2;break;
             case 1: $ids=2;break;
             case 2: $ids=1;break;
             case 3: $ids=0;break;
          }
          return $ids;
       }
     
       public function getEquipe1() {
          switch($this->id) {
             case 0: $eq = "France";    break;
             case 1: $eq = "Portugal";  break;
             case 2: $eq = "Allemagne"; break;
             case 3: $eq = "Turquie";   break;
          }
          return $eq;
       }
     
       public function getEquipe2() {
          switch($this->id) {
             case 0: $eq = "Portugal";  break;
             case 1: $eq = "Allemagne"; break;
             case 2: $eq = "Turquie";   break;
             case 3: $eq = "France";    break;
          }
          return $eq;
       }
     
    }
     
     
     
    class Arbitre {
     
       // champs de classe
       private $nom;
       private $prenom;
     
       // pour la simulation
       private $arNom    = array("DUPONT", "LAGARDE", "BERTRAND");
       private $arPrenom = array("Jean", "Michel", "Bernard");
     
       // constructeur
       public function __construct($id) {
          // simulation requete base de donnees
          $this->nom = $this->arNom[$id];
          $this->prenom = $this->arPrenom[$id];
       }
     
       // getters
       public function getNom() {return $this->nom;}
       public function getPrenom() {return $this->prenom;}
     
    }
     
     
     
    class Stade {
     
       // champs de classe
       private $nom;
       private $nb_places;
     
       // pour la simulation
       private $arNb_places = array("10000","20000","30000");
       private $arNom = array("Chaban Delmas", "Geoffroy Guichard", "Saint Denis");
     
       // constructeur
       public function __construct($id) {
          // simulation requete base de donnees
          $this->nom = $this->arNom[$id];
          $this->nb_places = $this->arNb_places[$id];
      }  
     
       // getters
       public function getNom() {return $this->nom;}
       public function getPlaces() {return $this->nb_places;}
     
    }
    ?>
    Donc en terme de ressource, on utilise le même objet que l'on surcharge, il n'existe pas un objet par journée dans le championnat.
    [edit] Pour t'en convaincre j'ai ajouté var_dump en bas du script [/edit]
    heuuu, désolé pour les exemples, j'y connais rien au foot

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 243
    Points
    243
    Par défaut
    Ton exemple est en PHP5, mais je vais essayer de le suivre de mon mieux Merci.

  7. #7
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Citation Envoyé par ska_root
    page test.php
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <select name="journee">
    <option value="10/11/2005" />10/11/2005</option>
    <option value="11/11/2005" />11/11/2005</option>
    <option value="12/11/2005" />12/11/2005</option>
    <option value="13/11/2005" />13/11/2005</option>
    </select>
    <input type="submit" name="sub" value="ok" />
    </form>
    <?php
    require_once "class.foot.php";
    $journee = (!isset($_POST['journee']))?(''):($_POST['journee']);
     
    // simulation requete base de donnees
    switch($journee) {
       case '10/11/2005': $matchs_array = array(2,0); break;
       case '11/11/2005': $matchs_array = array(1);   break;
       case '12/11/2005': $matchs_array = array(3);   break;
       case '13/11/2005': $matchs_array = array();    break;
    }
     
    if(!empty($journee)) {
     
       // instance
       $match = new Match();
     
       echo "<h1>Pour la journée du $journee</h1>";
     
       foreach ($matchs_array As $matchs_joues) {
     
             // surcharge du constructeur
             $match->Match($matchs_joues);
     
             $nom_equipe1   = $match->getEquipe1();
             $nom_equipe2   = $match->getEquipe2();
             $nomArbitre    = $match->arbitre->getNom();
             $prenomArbitre = $match->arbitre->getPrenom();
             $nomStade      = $match->stade->getNom();
             $placesStade   = $match->stade->getPlaces(); 
     
    echo <<<EOF
       
       <h2><u>Match : $nom_equipe1/$nom_equipe2</u></h2>
       <h3><u>Arbitre :</u></h3>
       <ul>
       <li>nom : $nomArbitre</li>
       <li>prenom : $prenomArbitre</li>
       </ul>
       
       <h3><u>Stade</u></h3>
       <ul>
       <li>nom stade : $nomStade</li>
       <li>nombre de place : $placesStade</li>
       </ul>
    EOF;
       }
    }
     
    // verification
    echo "<hr />contenu de \$match : <pre>";
    var_dump($match);
    echo "</pre>";
    ?>
    page class.foot.php
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    <?php
     
    class Match {
     
       // champs de classe
       var $arbitre;
       var $stade;
       var $id;
     
       // constructeur
       function Match($id=null) {
     
          if(isset($id)) {
     
             $this->id=$id;
     
             // simulation requete base de donnees
             $id_arbitre = $this->selectArbitre();
             $id_stade   = $this->selectStade();
     
             // sous-classes
             $this->arbitre = new Arbitre($id_arbitre);
             $this->stade   = new Stade($id_stade);
     
          }
     
       }
     
       function selectArbitre() {
          switch($this->id) {
             case 0:$ida = 2;break;
             case 1:$ida = 1;break;
             case 2:$ida = 0;break;
             case 3:$ida = 2;break;
          }
          return $ida;
       }
     
       function selectStade() {
          switch($this->id) {
             case 0: $ids=2;break;
             case 1: $ids=2;break;
             case 2: $ids=1;break;
             case 3: $ids=0;break;
          }
          return $ids;
       }
     
       function getEquipe1() {
          switch($this->id) {
             case 0: $eq = "France";    break;
             case 1: $eq = "Portugal";  break;
             case 2: $eq = "Allemagne"; break;
             case 3: $eq = "Turquie";   break;
          }
          return $eq;
       }
     
       function getEquipe2() {
          switch($this->id) {
             case 0: $eq = "Portugal";  break;
             case 1: $eq = "Allemagne"; break;
             case 2: $eq = "Turquie";   break;
             case 3: $eq = "France";    break;
          }
          return $eq;
       }
     
    }
     
     
     
    class Arbitre {
     
       // champs de classe
       var $nom;
       var $prenom;
     
       // pour la simulation
       var $arNom    = array("DUPONT", "LAGARDE", "BERTRAND");
       var $arPrenom = array("Jean", "Michel", "Bernard");
     
       // constructeur
       function Arbitre($id) {
          // simulation requete base de donnees
          $this->nom = $this->arNom[$id];
          $this->prenom = $this->arPrenom[$id];
       }
     
       // getters
       function getNom() {return $this->nom;}
       function getPrenom() {return $this->prenom;}
     
    }
     
     
     
    class Stade {
     
       // champs de classe
       var $nom;
       var $nb_places;
     
       // pour la simulation
       var $arNb_places = array("10000","20000","30000");
       var $arNom = array("Chaban Delmas", "Geoffroy Guichard", "Saint Denis");
     
       // constructeur
       function Stade($id) {
          // simulation requete base de donnees
          $this->nom = $this->arNom[$id];
          $this->nb_places = $this->arNb_places[$id];
      }  
     
       // getters
       function getNom() {return $this->nom;}
       function getPlaces() {return $this->nb_places;}
     
    }
    ?>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSD] autoriser un namespace à n'importe quel niveau
    Par djamonphil dans le forum Valider
    Réponses: 2
    Dernier message: 30/10/2006, 16h20
  2. [Stage] Quel niveau avoir avant de commencer un stage
    Par ghita269 dans le forum Stages
    Réponses: 10
    Dernier message: 22/11/2005, 08h23
  3. Réponses: 27
    Dernier message: 24/09/2005, 17h04
  4. Quel niveau réel avec uv du Cnam en cour ?
    Par nebule dans le forum Etudes
    Réponses: 6
    Dernier message: 10/04/2005, 17h11
  5. Cas d'utilisation, quel niveau de détails
    Par Celelibi dans le forum Cas d'utilisation
    Réponses: 5
    Dernier message: 20/02/2005, 20h16

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