<!--:fr-->[poo php] le pattern factory #1<!--:-->

[poo php] le pattern factory #1

Ce billet fait parti de la série sur la poo en php.

La dernière fois nous avions écrit notre première classe dans le cadre de notre apprentissage de la poo avec php. Un des problèmes que nous avions évoqué était qu’en php5 nous ne pouvions avoir qu’un constructeur (méthode __construct() ). C’est la raison « pratique » pour laquelle nous allons utiliser le pattern factory.

Cependant il y a d’autres raisons, que je classifie de « philosophiques », au fait que nous utilisions les factories.

Mais tout d’abord « c’est quoi un(e) factory?? »


Le principe des factories

Techniquement c’est une classe qui ne contient que des méthodes statiques. Ces méthodes statiques retournent des objets. Par exemple, la classe UtilisateurFactory.class.php ne contiendra que des méthodes statiques qui retourneront des instances de Utilisateur.class.php. Les méthodes que nous pourrions retrouver sont :

  • static function creerUtilisateur($login,$password,$mail);
  • static function loginUtilisateur($login,$password);

Chaque méthode retournera un objet utilisateur. Ca c’était pour le coté technique. Regardons du coté « philosophique ».

Si il y a quelque chose sur lequel je porte de l’attention, c’est la clarté et la maintenabilité du code…autrement dit la « beauté » du code!

Et c’est la que les factories jouent doublement leur rôle. D’une part on sépare complètement la manière de créer un objet et l’objet en lui même. D’un côté les méthodes du factory servent juste à créer des objets (ce qui va correspondre en SQL à des INSERT/SELECT). De l’autre les méthodes de l’objet agissent DIRECTEMENT sur l’objet et correspondront à des UDPATE/DELETE en SQL.

Pour reprendre l’exemple de l’utilisateur : le factory se charge de créer l’utilisateur (INSERT) ou de le loggé (SELECT) et un utilisateur peux changer son mail (UPDATE) ou supprimer son compte (DELETE).

Ensuite, si on veut se rapprocher du model MVC, les factories simplifie enormement la lecture du code (et donc son écriture!) puisque au moment de la création seule la méthode correspondant à l’action à réaliser est appelée. Pas besoin de créer un objet, puis de « setter » les variables et ensuite d’appeler une méthode save, etc etc. Notre méthode creerUtilisateur se charge de tout.

Il y aurait encore beaucoup d’avantages à énumérer mais vous avez les principaux à mon sens :) C’est un peu déroutant au début et on est tout le temps en train de se demander « alors ca ca va dans la factorie? dans laquelle? comment je l’appelle? » mais après quelques heures on voit déjà les bénéfices :)

Dernier petit conseil, donnez des noms qui ont du sens à vos méthodes et variables. Ne pas hésiter par exemple à appeler une méthode : getBouteillesFromCasierByMillesimeAndAppellation($millesime,$appellation); votre IDE se chargera de l’écrire à votre place les fois suivante :) Et personnelement je joue beaucoup sur les pluriels pour savoir si ma méthodes va me retourner un objet seul ou un tableau d’objets…

Pour mieux comprendre le sujet je vous propose de suivre ce screencast qui reprend les exemples précédents. Pour votre confort, activez la HD et le mode plein écran.

[poo php] découverte du pattern factory from Antoine Guiral on Vimeo.

Did you enjoy this post?

If so, would you please consider sharing it with the world

User Responses

14 Responses and Counting...

  1. Julien Dupuis

    mai 07, 2009

    pas mal tous ces screencasts ;) je trouve juste dommage une chose : pour être full php5, pourquoi ne pas utiliser la classe mysqli pour la base de données ? voilà pour la petite remarque. @ Bientôt !

  2. Antoine

    mai 07, 2009

    Salut, merci ;)

    Pour mysqli ca va venir :) c’est une des raisons pour lesquelles je met de coté toute la partie base de donnée dans les tutos ;)

    Stay tuned :) et à un de ces 4 sur la route lol

  3. ceb

    mai 07, 2009

    Salut, sympa c’est screenCast !
    Ca ma permis d’apprendre un peu le but de la POO pour mon projet de fin d’année .
    Merci vivement le prochain =)

  4. Antoine

    mai 07, 2009

    Merci,
    malheureusement ma machine est en panne et je ne pourrais poster le prochain que sous quelques jours…mais plsu ca va aller et plus on abordera des points précis :)
    stay tuned :)

  5. [...] [poo php] le pattern factory #1 [...]

  6. nina

    mai 07, 2009

    super, ca

  7. jpc

    mai 07, 2009

    Joli boulot. Très clair avec ça.
    J’ai une question.
    Est-ce qu’on est gagnant à utiliser la factory sur des objets pour obtenir une liste de data?
    Par exemple:
    J’ai un objet Truc avec une factory GetTruc(). Dans cette fonction, je veux récupérer l’ensemble des trucs (select *). Est-ce que ça me retourne un objet par Truc ou un gigantesque objet contenant tous les Trucs?
    Chaipassichuiclère :-)

    Merci

  8. Antoine

    mai 07, 2009

    Salut jpc,
    oui bien sur tu peux :) par exemple :

    getUtilisateurs() (remarques le pluriel :) ) : au moment de ton fetch tu remplis un tableau avec tes objets utilisateur (chaque lignes du select correspond à un objet). Puis tu retournes ton tableau :)

    Merci pour le compliment :)

  9. Thierry B.

    mai 07, 2009

    Hello,

    Très bon screencast qui montre bien l’intérêt du pattern Factory.

    2 – 3 petites remarques si on veut être pointilleux (ça ne concerne pas directement le pattern Factory) :

    - le mot clé static n’est pas vraiment à mettre dans le même sac que public/private/protected, le 1er pouvant se combiner avec l’un des seconds ;-)
    - tu peux peux accéder au nom de la méthode courante en utilisant la métaconstante __METHOD__ (de même pour le nom de la classe __CLASS__)

    Je recherche actuellement un bon ouvrage (de préférence en français, sinon anglais) sur les Design Patterns, en connais-tu ? J’ai acheté récemment PHP5 Best Practices de Gullaume Ponçon, mais je trouve la partie concernant les patterns peu intuitive et très légère…

  10. Antoine

    mai 07, 2009

    merci pour tes deux remarques judicieuse :)

    En ce qui concerne les livres, je n’en connais pas…quelques court chapitre dans le certification study guide de zend…
    A bientot :)

  11. flaxe

    mai 07, 2009

    J’ai vu venir le coup du md5 du md5, j’ai un peu jubilé j’avoue ^^ (au passage je préfère sha1 qui me semble un peu plus ’secure’).

    Merci pour ce tuto, ceci dit, j’aimerais me servir du factory pour creer un ‘wrapper’ de base donnée (utiliser de maniere transparente n’importe quel base (mysql, postgres, oracle) avec la meme classe), mais je ne vois toujours pas vraiment comment proceder… Je garde quand même cet exemple sous le coude, très pertient. Merci.

  12. Golow

    mai 07, 2009

    Très bien expliqué. Je me met de ce pas au pattern factory ^^
    Merci pour l’astuce du list() :p

  13. ABN

    mai 07, 2009

    Bonjour Antoine, Merci beaucoup pour cette video très calaire,
    J’ai une petite question : C’est quoi l’environnement de développement php que tu utilises dans la video?

  14. Antoine

    mai 07, 2009

    Salut ali,
    j’utilise netbeans :) c’est de la bombe ;)
    enjoy :)

Leave a Reply

Default User

Your Name

mai 07, 2009

* Name, Email, and Comment are Required

Get Adobe Flash playerPlugin by wpburn.com wordpress themes