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 :

Organisation des méthodes de classe en POO


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Organisation des méthodes de classe en POO
    Bonjour,

    J'ai une question basique pour bien organiser mes méthodes de classe, mais j'ai un doute et j'aurai besoin de vos avis.

    Je prends un exemple simplifié : j'ai un catalogue de produits et chacun à une famille, quand j'affiche le catalogue des produits avec une famille donnée, j'ai besoin d'une requète du style "SELECT * FROM produit WHERE id_famille = 5".

    Est-ce que je dois placer une méthode "getProducts(id_famille)" dans le manager de ma classe "Famille" ou une méthode "getListByIdFamily(id_famille)" dans le manager de ma classe "Produit" ?

    Je pencherai pour la 2ème solution, parce que ça concerne plus les produits que la famille en elle-même.

    Merci d'avance pour vos réponses

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    Bonjour,
    Je répondrais aussi la seconde solution.

    Je trouve que ce tuto ne vas pas assez loin.
    Il n'y a aucune notion d'héritage

    il devrait avoir a minima
    une classe abstraite Model, et donc l'étendre avec Famille et Produit.
    une classe abstraite DbManager, et donc l'étendre avec FamilleManager et ProduitManager

    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
    abstract class Model { }
    class Personnage extends Model { }
     
     
    abstract class DbManager
    {
      private $_db; // Instance de PDO
      protected $_tableName;
     
      public function __construct($db)
      {
        $this->setDb($db);
      }
     
      public function save(Model $model)
      {
    	if ($model->getId()<1)
    		return $this->insert($model);
    	else
    	    return $this->update($model);
      }
     
      protected function setDb(PDO $db)
      {
        $this->_db = $db;
      }
     
      abstract protected function insert(Model $model);
      abstract protected function update(Model $model);
      abstract public function delete(Model $model);
     
    }
     
    class PersonnagesManager extends DbManager
    {
    	protected $_tableName='personnages';
     
        protected function insert(Model $perso)
    	{
    		if (!($perso instanceof Personnage)) throw new Exception('Type incompatible'); 
    		$q = $this->_db->prepare('INSERT INTO '.$this->_tableName.' SET nom = :nom');
    		$q->bindValue(':nom', $perso->nom());
    		$q->execute();
        }
     
    	protected function update(Model $perso)
    	{
    		if (!($perso instanceof Personnage)) throw new Exception('Type incompatible'); 
    		$q = $this->_db->prepare('UPDATE '.$this->_tableName.' SET forcePerso = :forcePerso WHERE id = :id');
    		$q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT);
    		$q->bindValue(':id', $perso->getId(), PDO::PARAM_INT);
    		$q->execute();
    	}
     
    	public function delete(Model $model) {}
    }
    $moi= ( !== ) ? : ;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse, le lien vers le tutoriel a été supprimé par Bovino, sans doute parce qu'il faisait référence à un site de développement concurrent.

    D'autres avis ?

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    Bon je vais répondre un peux plus a ta question :

    ProduitManager ne devrait connaitre(retourner) comme class que Produit
    FamilleManager que Famille

    Se sont 2 entités SQL différentes.
    Sinon tu te retrouves avec un couplage (très) fort :
    le jour ou tu changes quelque chose dans Produit, ça ne devrais pas casser FamilleManager


    sinon il y a cette approche : Activerecord
    http://julien-pauli.developpez.com/tutoriels/php/pdo/
    $moi= ( !== ) ? : ;

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par papajoker Voir le message
    ProduitManager ne devrait connaitre(retourner) comme class que Produit
    FamilleManager que Famille
    C'est le cas dans la 2ème solution, par exemple : la méthode "get(id_produit)" du manager de ma classe "Produit" me retourne bien un objet "Produit", tandis que que la méthode "getListByIdFamily(id_famille)" me retourne un tableau d'objets "Produit" (en prenant exemple sur la méthode "getList()" du tutoriel).

    Ca me semble effectivement plus cohérent que la 1ère solution, où le manager de ma classe "Famille" devrait me retourner un tableau d'objets "Produit"...

    Citation Envoyé par papajoker Voir le message
    le jour ou tu changes quelque chose dans Produit, ça ne devrais pas casser FamilleManager
    Ca confirme encore la 2ème solution qui ne cassera pas le manager de ma classe "Famille".

    Merci pour tes réponses et tes propositions d'évolution avec des héritages.
    Je mets le sujet en résolu, si quelqu'un a un avis différent, merci de continuer le sujet.

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

Discussions similaires

  1. Gestion de droits sur des méthodes de classe
    Par Braillane dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 06/10/2008, 16h31
  2. comment ajouter des méthodes à une classe lors Runtime?
    Par revever dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/03/2008, 13h53
  3. Utilisation des méthodes de classe dans une autre classe
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 4
    Dernier message: 28/07/2007, 15h10
  4. Réponses: 4
    Dernier message: 04/06/2006, 16h53
  5. Réponses: 1
    Dernier message: 09/03/2006, 18h15

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