Soirée design pattern et anti pattern en PHP

71749 vues
13 juillet 2012
Joachim
logo-afup

Présentation théorique des design pattern

La soirée a débuté par une présentation théorique des design pattern par Julien Pauli, avec définition de ce qu'est un design pattern :

Un patron de conception (design pattern) est un arrangement caractéristique de modules, reconnu comme bonne pratique en réponse à un problème de conception d'un logiciel. Il décrit une solution standard, utilisable dans la conception de différents logiciels.

Puis des principes SOLID sur lesquels sont basés les design pattern :

  • Single responsability : pas trop de responsabilité pour une seule classe
  • Open/Close Principle : ouvert à l’extension, fermé à la modification
  • Liskov Substitution : un objet peut utiliser le fils de A sans s’en rendre compte (Héritage strict, et type conservé)
  • Dependecy Injection : Si un objet A a besoin d’un objet B , ce dernier doit lui être injecté, il ne doit pas aller le chercher lui-même (donc pas de new Toto à l’intérieur d’une classe)
  • Interface aggregation : A ne doit pas utiliser B directement mais une interface de B

Après quoi Julien a présenté quelques exemples de design pattern comme :

  • le Singleton : restreindre l'instanciation d'une classe à un seul objet. Ce design pattern se révèle être en fait être un anti pattern car le Singleton ne peut être mocké pour les tests.
  • L’Observateur/Sujet : le sujet envoie un signal à des modules qui jouent le rôle d'observateurs sur certains événements. Ce design pattern est  utilisé par exemple pour le principe de plugins dans Joomla.
  • Le médiateur : quand un objet central contrôle un flux de messages
  • Le décorateur : permet d'attacher dynamiquement de nouvelles responsabilités à un objet ce qui permet de résoudre la problématique de l’héritage multiple.
  • L’itérateur : qui redéfinit la manière dont PHP parcourt un objet. Ce design pattern est par exemple utilisé par le composant Zend_Paginator de Zend Framework

(Anti pattern : fausse bonne idée, quand une solution génère plus de problème qu’elle n’en résout.)

 

Les design pattern en pratique

Voilà pour la théorie, Hugo Hamon a ensuite enchaîné par des exemples concrets d’utilisation des ces design pattern.

Hugo a commencé par présenter l’utilisation du design Pattern Observateur dans le composant Symfony Event Dispatcher, en détaillant la mise en place des écouteurs et du Sujet dans le cas concret de modification d’un article.

Il a ensuite détaillé l’utilisation du design pattern Injection de dépendances, en commençant par montrer en quoi la non-utilisation de ce pattern pouvait devenir gênante en prenant un cas simple d’envoi  de mail. Le code présenté était fonctionnel, mais pas évolutif, et il n’incluait pas de possibilité de modification de paramètres selon un environnement différent.

La mise en place d’un code respectant l’injection de dépendances impliquait un découplage avec les interfaces et une  construction un peu plus complexe, mais qui permettait des évolutions et des utilisations différentes selon l’environnement.

Hugo a ensuite rapidement évoqué l’utilisation de Pimple pour simplifier cette utilisation de l’injection de dépendances.

Pour cette deuxième partie je vous renvoie vivement à ses slides accessible sur https://speakerdeck.com/u/hhamon/p/design-patterns-avec-php-53-symfony-et-pimple

 

Retour d'expériences sur le design pattern Façade

La conférence s’est terminée sur un retour d’expériences de Theodo par Fabrice Bernard avec l’utilisation du design pattern Façade dans le cadre de reprise d’un site existant.

Le design pattern Façade permet en fait de simplifier une interface complexe. L’équipe de Theodo a donc utilisé ce design pattern pour  faire communiquer un ancien modèle comportant une partie modèle fortement couplée avec leurs nouveaux modules. Ils ont en fait procédé en deux couches :

Il ont d’abord mis une première façade composée de trois modèles communiquant entre eux (User, Match, Bar)  qui communiquait avec le modèle existant, puis ils ont mis une deuxième façade, composée de modules plus fins (un module par fonctionnalité), qui communique avec cette première façade. Cette conception a permis de conserver l’existant et ses fonctionalités tout en ajoutant de nouvelles fonctions sur un modèle plus propre.

 

La soirée s’est ensuite terminée par un apéro-saucisson-fromage offert par Theodo, où se sont tenus de nombreux échanges, et je l’espère d’où sont nées plusieurs idées de conférences pour le PHP Tour de Nantes (un appel aux conférenciers est en cours, je le rappelle !).

Un grand merci à Adrien pour m’avoir indiqué dans quelle direction aller face à un problème de reporting, à Stéphane, que j’ai été ravie de recroiser, et avec qui discuter est toujours aussi intéressant ! Ainsi qu’à toutes les autres personnes avec qui j’ai pu échanger au cours de cette soirée.

Si cette soirée vous a plu, pensez à adhérer à l’AFUP.

Merci aux conférenciers pour leur participation, à Theodo pour son sponsoring et à Eyrolles pour la salle.

L’antenne locale parisienne organisera un apéro PHP pour Septembre, d’ici là bonnes vacances à tous!

Modifier la config Apache pour un site sur PLESK
Calcul dates à partir du numéro de semaine en PHP
Un nouveau routeur pour Joomla!
Du code et des hommes. Stratégies de suivi de projet
3 nouvelles extensions Joomla! de Pulsar dans la JED
Code et calendrier de l'avent, un crossover sympa
Pulsar sort son jeu gratuit en ligne
Pulsar developpe la passerelle Joomla LUCENE SOLR
PHP multi-versions sur le même Apache
Debugger en PHP
design-pattern et anti-pattern en PHP
Réseau social d'entreprise: Yammer ou SharePoint?
SQL ignore error SQLSTATE avec sql-mode
Le forum PHP c'est dans 2 semaines !
Astuces PHP lazy load sous joomla seblod warp
Utiliser NOW() de SQL avec ZF
The requested URL was not found on this server.
Créer un QR Code en PHP
Plugin merge css/js pour Joomla
Autocomplétion avec Eclipse PDT
Ajout d’un suffixe aux tables des modèles
Hover sur Slideshow avec jmpress.js
ZF : Cannot refresh row as parent is missing
Mettre son placeholder en couleur noire #000
PHP Tour de Lille
RDV AFUP sur les bases de données relationnelles
Création de l'antenne parisienne de l'AFUP
Mise en place d'une API REST en PHP
Choisir son outil de gestion de projet web
Mon nouveau jeu de stratégie en ligne: Xsword
Journée du conseil scientifique de l'AFNIC
Connexion à Office 365 en PowerShell
CssJsCompress: page blanche, problème d'encodage
Le forum PHP 2012....c'est du passé ! RDV l'année prochaine
Conversion d'un fichier CSV utf8
encoder en latin1
Soirée CMS open-source en PHP
OWF: Open World Forum
forum php 2014 : le retour de Drupal annoncé... vraiment ???
Eclipse: Failed to create Java Virtual Machine
Maximum execution time ...
bug fireEvent dans core.js sous IE9
I love jQuery.ValidationEngine