reunion technique pmsipilot - janvier 2010
DESCRIPTION
Bonnes pratiques de développementTRANSCRIPT
Bonnes pratiques de
développement
Réunion technique 13/01/09
01/15/102
Réunion technique
Plan
Recommandations de codage – PHPNe pas modifier SymfonyGestion des actionsRouting SFDépendancesRefactoringFichiersGestion des pluginsJavascript - CSSDébogage (+ Profiling)Etapes d'un développement
01/15/103
Réunion technique
Best pratices (once again !?)
Sont mouvantesSont empiriques (= subjectives)Doivent nous servir et nous rassurer
01/15/104
Réunion technique
Recommandations de codage - PHP
Standard de codage PMSIpilotIndenter avec 2 espacesEcrire les accolades sur des nouvelles lignes
Respecter les règles de nommage SFPour une classe, le nom de fichier se termine par .class.phpPour une task, le nom de fichier se termine par Task.class.php
Si possible, ne pas fermer les tags PHP – Zend Programmer's Reference Guide :
Ne pas l'inclure permet de se prémunir des problèmes liés à l'injection accidentelle d'espaces blancs dans la sortie.
01/15/105
Réunion technique
Recommandations de codage - PHP
Standard de codage PMSIpilotPréfixer les noms des classes maison par « pmsipilot »Logguer les erreurs Log::add()Déclencher des pmsipilotException
plutôt que des sfException
Utiliser les pre et post Execute sur les composantsNe pas utiliser l'autoformatting de votre éditeurPlacer des @FIXME et @TODO (mode goret only) Etc
cf. http://trac.symfony-project.org/wiki/HowToContributeToSymfony#CodingStandards
01/15/106
Réunion technique
Recommandations de codage - PHP
Une variable doit être obligatoirement initialiséeMême si PHP sette les variables non initialisées à null
01/15/107
Réunion technique
Recommandations de codage - PHP
Préférer sprintf à l'opérateur '.' pour concaténerUtiliser la méthode sprintf
Plus lisiblePermet le formatage (remplisseur, type, etc)N'émet pas d'erreur en cas de variable inexistante
Au besoin, se servir de la syntaxe Heredoc
01/15/108
Réunion technique
Recommandations de codage - PHP
Rendre ses méthodes paramétrablesPour éviter d'avoir des paramètres facultatifs nuisibles lors
des appels
Mettre, en dernier paramètre de fonction, un tableau paramétrable à souhait
01/15/109
Réunion technique
Ne pas modifier Symfony
Même si la modification apporte un gain !Buts :
obtenir impérativement le comportement attendu de SFupgrader SF sans problèmes
Modifier le core SF
Etendre SFsurchargefactories.yml...
Voire ponctuellement Forker SF
01/15/1010
Réunion technique
Ne pas modifier Symfony
Etendre SF : exemple de pmsipilotUserMettre dans pmsipilotUser ce qui est commun à toutes les
applis
Coder dans myUser ce qui est spécifique à une application
01/15/1011
Réunion technique
Gestion des actions
En début d'action, vérifier systématiquement les paramètres obligatoires
01/15/1012
Réunion technique
Gestion des actions
Faites des redirect au lieu de forwardPour éviter de casser la navigationPour éviter le re-post du formulaire si rechargement de la
page
http://www.symfony-project.org/forms/1_2/fr/02-Form-Validation
01/15/1013
Réunion technique
(Gestion des actions)
Casser le MVC
01/15/1014
Réunion technique
Routing SF
Nous utilisons peu les routes Modules très rigides : à cause de références permanentes
aux noms des modules et des actionsURLs peu sexy
01/15/1015
Réunion technique
Dépendances
Doivent nous obséder carspécialisation forte du codeunit testing compromis
Au minimum, les référencerAu mieux, les éviter ou les casser
Dans l'idéal, les gérerinjection de dépendances en PHP
http://fabien.potencier.org/article/15/symfony-service-container-using-xml-or-yaml-to-describe-services
01/15/1016
Réunion technique
Dépendances - exemple
2010 : 1 appel à sfContext::getInstance() = 2 points boulet ?
utiliser pmsipilotContext en dehors d'un contexte SF devient pénible
utiliser pmsipilotContext dans différents contextes SF devient hasardeux
01/15/1017
Réunion technique
Dépendances - exemple
Si inutile, éviter de passer des objets à un constructeur ou à un setter
01/15/1018
Réunion technique
Refactoring
Eviter les classes qui ne contiennent que des méthodes statiques et fourre tout
Eviter les mélanges de conceptS'appuyer sur la POO
(OMG)
01/15/1019
Réunion technique
Refactoring
Ranger les librairies aux bons endroitsplugins pmsipilotApp*Plugin
Conserver la généricité du codeCentraliser les modules, les surchargerDifférencier les traitements bas niveau relevant du core
01/15/1020
Réunion technique
Refactoring
Yes we canJobs d'importGestion utilisateurComposants PMSIpilot dans VisiopôleCriteriaGestion des menusPage de détails des séjoursMessage d'accueilGammes, licences
RAFpmsipilot*Actionpmsipilot*UserTranches d'agesIndicateur de synthèse
01/15/1021
Réunion technique
Fichiers
Tout fichier créé doit être suppriméEcrivez dans /var/tmpUtiliser pmsipilotUtils::myTempnam pour nommer les
fichiers (cf. http://fr.php.net/tempnam)
Eviter les accès au disqueUn sfFinder dans le bon répertoireVaut mieuxQu'un sfFinder trop large qui resserre avec un « prune »
01/15/1022
Réunion technique
Fichiers
Référencer le chemin vers un fichier à partir du répertoire courant
Pour ne pas harcoder de pathPour éviter par exemple des soucis lors de déplacement de
code
Ignorer les lignes vides
01/15/1023
Réunion technique
Gestion des plugins
N'envisager de nouveaux plugins que s'ils ont des schema.yml
Pour ne pas polluerPossibilité de maintenir un schéma DBDesigner par plugin
Etre awareDe la version du pluginDu placement et nommage des patchsDes dépendances avec d'autres pluginsDu référencement des plugins (config/plugins.txt)...
01/15/1024
Réunion technique
Javascript - CSS
Tester en dev mais surtout tester en prodEn prod, compression JS (pmsipilotCombineFilter)
Tester sur FF mais surtout tester sur IEIE foire sur des utilisations particulières de fonctions
jQueryjQuery.map()Statut des cases à cocheretc
01/15/1025
Réunion technique
Javascript - CSS
Eclater les inclusions de js/css par action et par composant
Plutôt que tout mettre dans le view.yml de l'applicationUtiliser la surcharge YAML (javascripts[-*] LOL)
Coder des objets javascriptProblématique des dépendances valable en JS
01/15/1026
Réunion technique
Javascript - CSS
Sprites
01/15/1027
Réunion technique
Débogage ( + Profiling)
Un traitement pédale ?vous incluez des url_for en boucle LOL ?votre task SF se retape un autoloading pour le fun LOL ?le logger Propel éclate votre RAM LOL ?
Suivre la web debug toolbarAvant d'optimiser, MESURER
Eventuellement, se mettre en prodTout ce qui arrive en dev n'arrive pas forcément en prod (et vice versa)
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" Donald Knuth
01/15/1028
Réunion technique
Débogage ( + Profiling)
Xdebug + kcachegrindXhprof
Installationhttp://mirror.facebook.net/facebook/xhprof/http://techportal.ibuildings.com/2009/12/01/profiling-with-xhprof/
Intégration
Cf démo !
01/15/1029
Réunion technique
Etapes d'un développement
1. faire un plan2. écrire les tests possibles3. penser sécurité4. penser performance5. penser simplicité et donc réutilisation6. coder tout, ne rien tester7. (optimiser)8. tester tout, ne rien coder9. coder10. tester11. coder12. tester IE 6, IE 7, IE 8, FF
01/15/1030
Réunion technique
Conclusion
01/15/1031
Réunion technique
Merci de votre attention
Questions