Accueil du site > PHP > Entrons dans le monde merveilleux du design pattern en php, pattern (...)
Entrons dans le monde merveilleux du design pattern en php, pattern strategy
dimanche 7 mars 2010, par
Lors de ma formation pour devenir informaticien nous avions débuté par la programmation Java. Ce fût pour moi une grande source de satisfaction. Je progressai rapidement, et, pour améliorer mon code je fus amené à m’intéresser de plus près aux design patterns. Ce concept issu de la programmation orienté objet était alors à peine naissant pour le PHP qui a intégré la POO (Programmation orienté objet ) tardivement et de manière progressive.
Pour satisfaire ma soif d’apprendre j’achetais le livre Design Patterns de l’excellente collection ’Tête la première’, que je vous conseil vivement. Et qui me fis comprendre que la programmation pouvait rapidement prendre une nouvelle dimension quand on se pose des questions tels que : mon code est il maintenable, peut il évoluer facilement , quelles sont les bonnes pratiques à avoir ?
Avant d’aller plus loin il est néanmoins indispensable de préciser que pour le java les design patterns sont une nécessité. Par contre en PHP la programmation objet est un choix, certes de plus en plus pertinent mais pas une obligation.
Le Design Pattern Strategy
Comprendre la philosophie les designs patterns peux en fait se résumer en une contrainte que tout bon développeur devrait garder à l’esprit et qui se résume à : Comment ouvrir son code à l’extension et le fermer à la modification.
C’est sur cette recherche que s’appuie les motifs de conception. Alors allons de l’avant et à partir de cette affirmation que pouvons nous en déduire ? Imaginez que vous êtes fabricants de voitures. Et posez vous la question : qu’est ce qui va être modifier dans cette voiture au cours de son existence ? Le moteur, probablement pas, le volant, non plus . Par contre il est fort probable que vous ayez à changer les roues du véhicule. A l’image de notre constructeur qui arnache solidement le moteur, et qui ne laisse que 4 boulons pour tenir notre roue, nous allons construire notre code en donnant de la souplesse aux parties qui risquent de changer au fil du temps.
Puisque nous sommes bien partie dans notre exemple nous allons faire une application qui construit des voitures d’un même modèle mais avec des options différentes. Il serait alors bien dommage de construire autant de chaînes de montages qu’il existe d’options sur votre véhicule. Et bien pour notre programme également nous allons suivre ce même principe .
A ce propos il est temps de rentrer dans le code . Et nous allons installer notre chaine de montage de voitures qui va se présenter comme suit :
public function __construct($couleur ,$roue ){
$build = $this->getMoteur().' <br>'
.$this->getVolant().'<br>'
.$couleur->peindre() . '<br>'
.$roue->type().'<br><br><br>';
echo $build;
}
private function getMoteur(){
return 'Installons notre moteur solide';
}
private function getVolant(){
return 'Un volant bien adapte a notre voiture ';
}
}
Voyons tout ceci d’un peu plus près. Notre ’Objet’ voiture possède un constructeur avec 2 paramètres qui sont $couleur et $roue. A l’intérieur de celui ci nous avons la variable $build chargée de nous décrire, sommairement, le processus d’assemblage de notre véhicule. Les 2 premières étapes de la fabrication sont basics. On appelle les méthodes getMoteur() et getVolant(). Ce qui va nous intéresser le plus vient après et nécessite l’utilisation d’interface en php.
Interface en php : un modèle pour tous
Vous êtres tranquillement installé sur votre ordinateur et vous venez de télécharger une application que vous décidez d’installer et d’utiliser. Une fois les opérations d’installation terminées vous fermez votre navigateur en appuyant sur une croix rouge. Puis vous utilisez cette application et une fois que vous souhaitez la quitter vous appuyez sur une croix rouge de nouveau.
Même si les logiciels sont différents vous savez qu’en appuyant sur cette croix les applications vont se fermées. Ce principe ’normatif’ ou convention est extrêmement pratique car il permet à l’utilisateur de comprendre immédiatement à quoi correspond cette touche. Et c’est extrêmement pratique pour les fabricants de logiciels qui savent, avant le début du programme, ou va se situer le bouton fermer et à quoi il va ressembler.
La construction des interfaces en général et en php en particulier suivent exactement le même principe. Et il va s’appliquer de la manière suivante : Votre code ( ->Vous avec votre souris devant l’ordinateur ) va appeler une méthode nommé de manière identique ( ->appuyer sur une croix rouge ) pour effectuer une action ( ->pour fermer votre application ).
Les interfaces servent de modèle pour que le codeur puissent développer autant d’objets calqués sur celui ci pour que le code qui l’interprète appelle une de ces méthodes sans se soucier de savoir ce qu’il y a l’intérieur.
Et vu qu’un exemple et toujours plus explicite nous allons donc construire nos premières interfaces en php.
public function peindre();
}
class Rouge implements Couleurs{
public function peindre(){
return 'Peignons en rouge';
}
}
Interface Roues{
public function type();
}
class Pluie implements Roues{
public function type(){
return 'Enfin montons des pneus pluies';
}
}
Voyons de plus près notre Interface Couleurs. Et bien elle ne contient qu’une seule méthode peindre() ; Toutes les classes qui vont implémenter ( prendre modèle ) sur Couleurs devront déclarer une méthode peindre() ; Et c’est le cas de notre classe ’Rouge’ qui ’implements’ Couleurs. Ce principe simple s’applique exactement de la même manière avec l’interface Roues et la classe Pluie. Il est temps de voir notre code en action !!!
Actionner le pattern strategy
Il est grand temps de construire notre première voiture. Et pour cela nous disposons d’une magnifique chaîne de montage ainsi que la possibilité de mettre des pneus pluies et de la couleur rouge.
// va nous afficher
Installons notre moteur solide
Un volant bien adapte a notre voiture
Peignons en rouge
Enfin montons des pneus pluies
Au moment de l’appel du constructeur de la classe Voiture nous avons : $couleur->peindre() et $roue->type() ; Et là cela tombe bien car pour fabriquer notre véhicule nous avons écris : $modele_ferrari = new Voiture(new Rouge() , new Pluie()) ; Et ’Rouge’ à bien une méthode peindre() et ’Pluie’ à bien une méthode type() ;
Il est alors grand temps d’appliquer le principe que nous avons vu tout au début de cet article : Comment ouvrir son code à l’extension et le fermer à la modification.. Nous voudrions maintenant produire une voiture de couleur bleu et avec des pneus neiges. Et bien nous n’allons pas toucher au code existant mais nous allons créer 2 classes qui prennent modèles sur nos interfaces. Nous obtenons :
public function peindre(){
return 'Peignons en bleu';
}
}
class Neige implements Roues{
public function type(){
return 'Enfin montons des pneus neiges';
}
}
// nous construisons notre voiture bleu avec des pneus neiges
$modele_renault = new Voiture(new Bleu() , new Neige());
// et nous obtenons
Installons notre moteur solide
Un volant bien adapte a notre voiture
Peignons en bleu
Enfin montons des pneus neiges
Grâce à l’utilisation d’une interface, le code de notre classe Voiture comprendra toujours $couleur->peindre() ; Bien entendu il faut que $couleur soit un objet implémentant l’interface ’Couleurs’.
Conclusion
Voilà notre premier article sur les design patterns en php qui s’achève. Nous avons vu les points suivants : ouvrir son code à l’extension et fermer à la modification, la création d’interface qui vous laisse la possibilité de créer des classes sur un modèle donné, l’utilisation de ces dernières dans d’autres objets.
Grâce à ces différents points nous avons un exemple simple du design pattern strategy en php. Cet exemple et bien entendu triviale et sa vertu est surtout de faire de la pédagogie. Vous trouverez également en téléchargement le fichier php avec tout le code présenté ici.
Cet article est le premier d’une série sur le thème des deisgn patterns. Dans le prochain nous compléterons cet exemple ( du pattern strategy ) en abordant notamment la notion de classe abstraite. Merci beaucoup pour votre lecture en espérant que vous ayez appris quelque chose et que cela vous a donné envie de vous lancer de nouveaux défis.
Documents joints
- strategie.php (Zip – 531 octets)