[php] Si les Singletons sont mauvais alors pourquoi un Service Container est-il bon?


Answers

Le motif de localisation de service est un anti-pattern. Cela ne résout pas le problème de l'exposition des dépendances (vous ne pouvez pas dire à partir de la définition d'une classe quelles sont ses dépendances parce qu'elles ne sont pas injectées, elles sont arrachées du localisateur de service).

Donc, votre question est: pourquoi les localisateurs de services sont-ils bons? Ma réponse est: ils ne le sont pas.

Évitez, évitez, évitez.

Question

Nous savons tous à quel point les Singletons sont mauvais parce qu'ils cachent des dépendances et pour d' autres raisons .

Mais dans un cadre, il pourrait y avoir de nombreux objets qui n'ont besoin d'être instanciés qu'une seule fois et appelés de partout (logger, db etc).

Pour résoudre ce problème, on m'a dit d'utiliser un "Gestionnaire d'Objets" (ou Service Container comme symfony) qui stocke en interne toutes les références aux Services (logger etc).

Mais pourquoi un fournisseur de services n'est-il pas aussi mauvais qu'un simple Singleton?

Le fournisseur de service cache aussi les dépendances et il vient juste d'envelopper la création de la première instance. Donc, j'ai vraiment du mal à comprendre pourquoi nous devrions utiliser un fournisseur de services au lieu de singletons.

PS. Je sais que pour ne pas cacher les dépendances, je devrais utiliser DI (comme indiqué par Misko)

Ajouter

J'ajouterais: ces jours-ci les singletons ne sont pas si mauvais, le créateur de PHPUnit l'a expliqué ici:

DI + Singleton résout le problème:

<?php
class Client {

    public function doSomething(Singleton $singleton = NULL){

        if ($singleton === NULL) {
            $singleton = Singleton::getInstance();
        }

        // ...
    }
}
?>

c'est assez intelligent même si cela ne résout pas tous les problèmes.

A part DI et Service Container, existe-t-il une bonne solution acceptable pour accéder à ces objets auxiliaires?




Parce que vous pouvez facilement remplacer des objets dans Service Container par
1) héritage (la classe Object Manager peut être héritée et les méthodes peuvent être remplacées)
2) modification de la configuration (dans le cas de Symfony)

Et, Singletons sont mauvais non seulement en raison du couplage élevé, mais parce qu'ils sont _ Single _tons. C'est une mauvaise architecture pour presque toutes sortes d'objets.

Avec DI 'pure' (dans les constructeurs) vous paierez un très gros prix - tous les objets devraient être créés avant d'être passés dans le constructeur. Cela signifie plus de mémoire utilisée et moins de performances. Aussi, pas toujours l'objet peut être simplement créé et passé dans le constructeur - une chaîne de dépendances peut être créée ... Mes anglais ne sont pas assez bons pour en discuter complètement, lisez-le dans la documentation de Symfony.




Related