DESIGN PATTERNS - CREATEURS

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 9 janv. 2011 à 02:39
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 - 10 janv. 2011 à 15:44
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52693-design-patterns-createurs

Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
10 janv. 2011 à 15:44
Question de point vue, la tienne fait : return $retourClasse->newInstanceArgs($arguments); ce que je voulai absolument eviter parce que ca t'oblige a implementer tes classe sous un format unique alors qu'avec la mienne c'est generique
bj33 Messages postés 145 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 1 mai 2012
10 janv. 2011 à 12:55
salut

Je n'ai visionné que la factory et franchement je ne suis pas du tout convaincu et ne changerais pas celle que j'utilise. ex :

final class Fabrique {
private static $_instance = null;
private $_namespace;

protected function __construct() {}

/**
* retourne une instance de la classe en tenant compte du namespace
* si présent.
*
* @param $namespace
* @return object
*/
public static function getInstance($namespace = null) {
if (is_null(self::$_instance)) {
self::$_instance = new self;
}
self::$_instance->_namespace = $namespace;
return self::$_instance;
}

public function __call($methodes,$arguments) {
$classe = ucfirst(strtolower($this->_namespace.$methodes));
if (class_exists($classe,false)) {
$retourClasse = new ReflectionClass($classe);
if ($retourClasse->isInstantiable() && $retourClasse->hasMethod('__construct')) {
return $retourClasse->newInstanceArgs($arguments);
} else {
throw new Format_Generique('La classe '.$classe.' n\'est pas instanciable');
}
} else {
throw new Format_Generique('La classe '.$classe.' est introuvable');
}
}
}

si çà peut t'inspirer davantage;)
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
10 janv. 2011 à 09:48
Merci pour vos commentaires ;)

Pour la facory method j'avoue que c'est plutot lourd mais en fait j'ai eu quelque problemes avec call_user_function et j'ai trouve ca plus generique car par exemple on peu vouloir une classe avec un constructeur vide et un initialisateur et je sais plus exactement pourquoi mais ca m'a pose probleme a l'epoque j'aurais du noter exactement le soucis que j'avais eu, a la base je voulai eviter l'eval.
Pour l'exception et l'utilisation de $class et $function c'est que je trouve ca moins lourd a lire que getTrace() on sait direction de quelle classe et a quel appel l'exception a ete levee mais la c'est juste un choix esthetique en fait getTrace est plus verbose c'est sur ^^
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
10 janv. 2011 à 04:45
Un peu complexe.

L'algo d'instanciation de la Factory est trop lourd : utilisation de eval(), func_get_args(). Dans ce cas, l'utilisation de la réflexion est tout à fait adaptée.

Pourquoi utiliser $class et $function dans l'exception alors que l'erreur est identifiable par l'exception qui l'a créé ? Si tu veux pousser la localisation de l'erreur tu peux t'aider d'Exception::getTrace().

Il n'y a pas d'erreurs mais des problèmes de conception et "d'optimisation".
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 janv. 2011 à 02:39
Salut,

Désolé, je n'ai jeté un oeil que rapidement, mais... bon ben je pense qu'on peut te faire confiance sur la qualité de la source.
En plus, de ce que j'ai vu, ça m'a l'air très propre. Et je doute qu'il y ait des erreurs grossières :)
Ca fait du bien de voir des sources pure POO, ça change ^^
Rejoignez-nous