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 :

Implémentation SOLID d'un gestionnaire de BDD


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut Implémentation SOLID d'un gestionnaire de BDD
    Bonjour,

    En essayant de faire mon code plus SOLID (comme ils disent), il apparaît clairement que les singleton que j'avais l'habitude d'utiliser pour gérer une instance unique de ma PDO sont une vilaine chose.

    Soit, j'ai bien compris quels étaient les faiblesses de ce design pattern.

    Maintenant, je me demande comment implémenter ça proprement en respectant les principes SOLID. J'ai trouvé beaucoups d'articles sur les singleton pour gérer ta BDD, c'est STUPID, mais beaucoup moins (pas du tout) d'exemples concrets sur la bonne façon de faire.

    Pourrait-on m'expliquer ?

    En vous remerciant.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ce qui est mauvais, c'est le design (anti)pattern Singleton (je n'expliquerai pas ici pourquoi, Google donne déjà des milliers de pages d'explications), c'est-à-dire un objet non instanciable, accessible par une méthode statique et de portée globale.

    Tu peux très bien créer une instance de ta classe à chaque fois que nécessaire, et la passer explicitement à tout le monde (au besoin par un conteneur ou une factory, ce qui te permet de garantir que ton objet est toujours créé selon les conditions que tu fixes). La nature même des requêtes HTTP fait que ton objet disparaît de toutes façons à la fin du script, donc le singleton perd déjà tout son intérêt.

    Si tu désires vraiment une instance unique, tu peux le faire aussi. C'est par exemple ce que fait Pimple v2 par défaut.

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    Tu peux très bien créer une instance de ta classe à chaque fois que nécessaire, et la passer explicitement à tout le monde (au besoin par un conteneur ou une factory, ce qui te permet de garantir que ton objet est toujours créé selon les conditions que tu fixes).
    Bhé c'est justement ce qui me pose problème... En dehors d'un singleton, une instance = une connexion. Outre le problème de performance, le nombre maximum de connexions à la BDD est très souvent limité et instancier un PDO à chaque que j'en est besoin n'est pas envisageable !

    Si je veux éviter ça, je suis obligé d'instancier ma PDO en début de script et de la passer à qui en a besoin, mais ça va être horrible le nombre de fois où il va falloir la mettre dans les paramètres de mes méthodes/constructeurs !?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Regarde l'exemple de pimple (ou plus simplement utilise pimple) pour voir comment préserver une instance unique tout en évitant le piège du Singleton et donc garder la même connexion. Dans une de mes applis simples, j'avais utilisé Pimple (c'était la v1) comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $config = new Pimple();
     
    //database connection
    $config['db_name'] = 'db_name';
    $config['db_user'] = 'db_user';
    $config['db_password'] = 'password';
    $config['db_server'] = 'localhost';
     
    $config['db'] = $config->share(function($p) {
                $database = new Tsilefy\Quiz\Database($p['db_user'], $p['db_password'], $p['db_server'], $p['db_name']);
                return $database->getConnection();
            });
    Cela garantit que la même instance est retournée par $config['db'] à chaque fois. De cette manière, tu as une seule variable globale, $config (le conteneur).

    Et effectivement, le principe d'inversion des dépendances (et son corollaire le principe d'Hollywood: "ne nous appelez pas, c'est nous qui vous appelerons") dicte que l'on doit passer les dépendances d'une classe explicitement, et il y a mille raisons à cela (la littérature est aussi abondante à ce sujet): code facile à lire, possibilité de modifier le comportement tout en ne changeant pas le code en passant une abstraction(Open/Closed principle), tests unitaires plus faciles et plus fiables, dépendance explicite, etc...

    Et ce n'est vraiment pas aussi pénible que ça. Tout bon IDE complètera automatiquement les arguments de tout nouvel objet que tu crée.

Discussions similaires

  1. [CDD/CDI] Developpeur / gestionnaire BDD Lyon
    Par Zenerox dans le forum Demandes
    Réponses: 0
    Dernier message: 10/08/2011, 12h36
  2. Choix d'un gestionnaire de BDD
    Par PlapPlop dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/03/2011, 09h50
  3. Réponses: 7
    Dernier message: 13/11/2007, 12h30
  4. Réponses: 1
    Dernier message: 26/06/2006, 11h33
  5. [Outils] Un gestionnaire de versions pour BDD ?
    Par davcha dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 24/03/2006, 19h32

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