Les frameworks c'est bien, développer "en dehors" c'est mieux
J'explique mon point de vue sur les frameworks et sur une erreur (de mon point de vue) qui coute cher aux entreprises...
Les frameworks c'est génial :
- en 1 minute on a une application "vierge" super pro qui se connecte à notre base de données
- en 2 minutes je rajoute un écran sur mon appli
- en 3 minutes je rajoute un web service
- en 4 minutes je rajoute un mécanisme d'authentification SSO avec le plugin tartanpion
- ...
ok ?
On oublie aussi :
- en 2 mois j'apprends à coder AVEC le framework (i.e. maintenable, performant, ...)
- en 3 mois je réalise la migration de la v1.9 du framework à la v2.0 (ca fait mal hein ?)
- au bout de 4 mois je comprends vraiment comment ca marche et que je n'aurais pas développé telle classe comme ça si j'avais su avant :(
- ...
toujours ok ?
Une erreur (ce n'est que mon point de vue) courante que je rencontre sur "le terrain" (i.e. chez mes clients), est l'inconditionnelle mixage entre du code applicatif (i.e. développé par vous) et du code technique (contraint par le framework).
On se retrouve alors souvent à avoir des classes MyPluginSpecificForZF par ci ou sfMonPluginParLa ... qui contient du code que vous développez qui se connecte à la base de données fait des traitements et renvoie OK ou NOK (exception, boolean, ce que vous voulez).
Une question me vient alors à l'esprit :
Pourquoi diable avez vous créé une classe (ou une fonction) dont le nom est si framework-dependant avec un contenu qui ne l'ai pas forcément toujours, et qui surtout vous est tellement spécifique que vous auriez pu le développer même si vous utilisiez un autre framework ?
Personnellement, j'aurai créé une classe autonome suivant mes conventions avec mes packages, dans mon arborescence, capitalisée dans mon dépôt de code, testé unitairement dans un contexte non framework-isé, c'est à dire beaucoup plus simplement en fait, puis, j'aurais créé la même classe que vous (enfin qu'eux), mais il n'y aurai que quelques lignes (uniquement technique, pas applicative) :
try {
MyPackage_MyClass::factory()
->mySpecificMethod($param1, ...);
} catch (Exception $e) {
// do something with the exception if this plugin
}
La même remarque me vient à l'esprit pour tous les "adapters" que l'on peut créer pour les différents frameworks.
Tout ça manque "d'illustration" ? Pensez aux centaines de lignes de code que vous (ou les autres) écrivez pour réaliser des plugins Zend Framework, Symfony, Drupal, Magento, eZPublish, Joomla, <WhatEverFrameworkYouWant>et qu'il faut (difficilement) porter à chaque nouvelle version d'un framework ou carrément réécrire quand vous changez de framework...
D'un point de vue maintenance vous y gagneriez, non ? Vous pourriez même faire des tests unitaires sur votre propre code sans devoir mettre en place des pseudo-artifices a base de XXXXControllerTest et autres, puisqu'au final vous n'auriez que votre classe à tester, pas le framework.
Mais si me dites-vous, car moi j'utilises massivement les "features" du framework dans mon code spécifique (par exemple un Mage::singleton('....')->retrouveMoiMagiquementMesProduits(...) donc je ne peux pas extraire mon code de cet endroit la car il est trop "dépendant" au framework, je vous conseillerais alors d'aller faire un tour du côté des adapters et de ne plus utiliser en direct dans votre des méthodes que vous n'avez pas développé vous même, sauf si il s'agit d'une classe dite "adapter", ...
Que les auteurs de frameworks (que j'ai été et que je suis toujours aussi ;)) ne se formalisent pas, ce que je dénonce ce ne sont pas les frameworks, mais l'usage qui en est fait, qui pour moi est le plus important à long terme (surtout quand on voit que la majorité des frameworks sont réécrits au bout de 2 ou 3 ans)
Donc, si je peux me permettre un conseil :
Ne placez jamais de code à vous dans une classe dont on vous contraint le nom ou l'héritage (extends).
Instanciez plutôt dans cette classe, une classe à vous qui est autonome et que vous avez développé par ailleurs.
Commentaires
Je pense que l'apprentissage du framework est une des facettes de l'apprentissage de notre métier.
Comme si on avait l'habitude de programme "en ligne", le jour où on décide de passe a la POO
- il nous faut 2 mois pour comprendre les subtilité de l'héritage et utiliser les différents design pattern
- Il nous faut 3 mois pour migrer tout le code sur php 5.3 et utiliser les namespaces (on notera que, comme pour le framework, rien nous obliger a upgrader on peut rester sur la version précédente)
- Après 4 mois, on refait tout parce qu'on a compris comment ça marche..
On peut trouver de exemples comparable avec la POO, des design pattern, des nouveau langages etc...
Est ce que sur le dos de l'économie on doit stagner sur nos acquis ? je doute.
Ce qui vaut pour les framework vaut aussi pour les CMS et surtout pour Php lui même.... ;-)
C'est toute l'histoire de l'informatique ou les choses sont rarement figées.
C'est marrant parce que ça fait un moment que je développe un portail client sous drupal et je suis arrivé à la même conclusion.
Si bien que maintenant le module drupal me sert en gros de contrôleur et que les parties Modèles et Vues sont codées séparément.
pour l'apprentissage je suis d'accord, mais c'était pareil quand j'ai appris php, actionscript etc, il y a toujours un periode d'apprentissage et puis c'est tellement bon d'apprendre une nouvelle chose. Après pour ce souvenir des class perso, il y a les commentaires !! non ??
t'as oublié, avec un framework, il suffit de recruter un developpeur qui connait le framework pour qu'il se retrouve facilement dans le code, alors qu'avec un code sans framework ce dernier met 1 mois à comprendre comment ça marche !!
Je suis assez d'accord avec le principe d'écrire du code le plus ré-utilisable possible mais je ne vois pas bien le lien avec le constat fait au début de l'article...
Le temps d'apprentissage du framework est nécessaire et se révèle productif parce qu'on capitalise dessus.
Il n'empeche que le code qu'on va développer dessus peut etre générique comme tu le dis à la fin.
Pour la problématique de passage d'une version majeure à la suivante, c'est vrai que c'est galère, mais en même temps on ne choisit de le faire que si le projet le nécessite, c'est-à-dire si ses fonctionnalités évoluent de manière considérable. Dans le cas contraire, ce n'est souvent pas nécessaire.
Bref, bien coder (code optimisé, réutilisable) ne dépend pas du fait d'utiliser Symfony ou ZF, ni de développer en 5.3 ou pas... Et cet article le rappelle bien !
Pour moi la solution réside vraiment dans certains design patterns (service layer, datamapper, dao, ...) qui permettent vraiment de dissocier la logique métier du framework. J'ai récemment pu faire le test de porter directement ma couche métier de Zend Framework vers eZPublish en changeant uniquement les mappers.
Les modèles étant très génériques, les tests unitaires sur ces classes n'ont plus à être modifiés.
Je pense qu'en adoptant une vision très modulaire et en couches on peut vraiment palier à n'importe quelle problématique et ainsi ne plus être prisonnier d'un framework (en gros on choisit celui sur lequel on est la plus efficace)
Merci à tous pour vos précisions et retours d'expériences !
D'expérience la plupart des plugins Symfony sont le plus souvent des wrappers autour de lbs existantes, ou alors exploitent directement et pleinement les fonctionnalités du coeur du framework (routing, request, response, templates, orm, etc.), ce qui n'est pas toujours évident ni forcément intéressant à découpler.
J'a très très rarement vu des libraires spécifiquement métier publiées sur la forge de plugins de Symfony, et je sais pas trop du coté des autres frameworks...