Comment veux-tu formaliser une telle chose ? Je sais, une organisation à but non lucratif qui gère les designs patterns...
Je suis d'accord avec toi sur le fait qu'un design pattern est une solution, le problème est qu'une solution n'est jamais parfaite.
<?php
# Je veux une fonction qui me retourne le carré du paramètre.
square(5);
# Une solution pourrait être
function square($input) {
return 25;
}
Bien entendu, la solution n'est pas parfaite. C'est comme tout design pattern, il répond à une attente, pas à toutes les attentes. Le pattern singleton semble convenir aux premiers abords, mais quand on avance, on réalise qu'il a un/des problème(s) majeur(s).
Cela dit, je suis d'accord avec toi au sujet du principe qui dit qu'une classe doit gérer une seule chose, mais ce n'est pas un design pattern, il s'agit seulement d'une bonne pratique de programmation, ça n'a rien à voir avec l'existance du singleton.
Ce n'est pas un design pattern, c'est un principe de base de la POO. [SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design). Ça à donc à voir avec n'importe quelle code qui comporte x >= 1 classe(s).
Je pense que Hexa peut oublier l'injection de dépendance pour l'instant... c'est mieux qu'il sente le besoin de l'utiliser qu'on lui dise de l'utiliser.
Il faut arrêter de voir un DIC comme quelque chose de complexe, les termes utilisées sont les seuls choses de complexes. La forme la plus basique de pattern :
class Container
{
public function router()
{
return new Router($_GET['uri']);
}
}
Pour avoir une non-factory :
class Container
{
protected $router;
public function router()
{
return $this->router ? $this->router : new Router($_GET['uri']);
}
}
Personnellement, j'utilise un modèle un poil plus complexe, qui supporte les regexs (code). Il a une API très simple :
use Utils\Extensions\Arr;
use Utils\Extensions\Is;
require('vendor/autoload.php');
$c = new Storage\Container(new Arr, new Is);
$c->set('foo', function () {
echo 'building';
return 'bar';
});
$c->get('foo');
$c->get('foo');
# A affiché 'building' une fois.
$c->set('foo', function () {
echo 'building';
return 'bar';
}, true);
$c->get('foo');
$c->get('foo');
# A affiché 'building' deux fois.
$c->set(['fo(.)', 'Arg$1'], function ($name, $matches) {
return [$name, $matches];
});
$c->get('foA'); // => ['ArgA', ['A']]
$c->exists('fob') //=> true
Je ne conseille pas à Hexa d'utiliser cette implémentation du pattern (il le peut bien entendu si il le souhaite), je suis d'accord avec toi, il doit tracer son chemin.
En gros, ma remarque voulait juste dire, que je pense, que les singletons ne devraient être sur le chemin de personne, surtout pas les débutants (no offense Hexa, bro).