Industrialiser leContrat PHPÀ tous les étages
En face de vous•   Jean-François Lépine•   Consultant PHP Chez Alterway•   Vice-secrétaire de l’AFUP•   @Halleck45•   http...
Le Contrat• Signez-ici• Avec votre sang• Sinon…porte sur un ComportementOn doit pouvoir le vérifier
Tous les joursDANS LE CODE SOURCE
Un code est uncomportement• Une fonction  • Attend une donnée     (2 entiers )  • Traite une données    (les additionne)  ...
Duck TypingC’est un canard !
Modèle Objet PHP        <?php        interface ChienInterface {               public function aboyer();               publ...
Programmation par Contrat• N’est rien d’autre que de la POO poussée jusqu’au bout                                    HOA /...
Test Driven Development• Consiste à vérifier le traitement d’une fonction vis-à-vis d’une  donnée avant son implémentation...
Le modèle ObjetL’ENGAGEMENT DE LA STUPIDITÉ
KISS• SOLID• Comment tester la stupidité ?
Métriques•   Couplage applicatif•   Modularité et dépendance•   Complexité cyclomatique•   Verticalité applicative        ...
Métriques            Cornac
Travailler en équipeCONTRACTUALISER LACOLLABORATION
Code accessible• Système de versionning• Source Control Management  •   Mercurial  •   Svn  •   Git  •   …
Code source lisible     PHP_CodeSniffer, checkStyle
Code source chargeable• Respectez le contrat de la PHP Standard Recommandation 0  (PSR-0)  • Un nom de classe commence par...
Code source propre        PHPMessDetector
Gestion des DépendancesCONTRACTUALISER LES OUTILSTIERS
Dépendances systèmes  • PHING (Ant)<target name="php.check.curl">   <php        expression="in_array(curl, get_loaded_exte...
Dépendances d’outils  <dependencies>    <required>      <php><min>5.3.0</min></php>      <pearinstaller> <min>1.9.4</min><...
Dépendance d’outils                                               Composer"require": {        "php": ">=5.3.3",        "sy...
SécuriserASSURER LA SÉCURITÉ
Audit statique                                                    RATS• Vérifier quelques « empreintes » dans le code source
Surface d’attaque                    NIKTO2
Travailler sur le fonctionnelCONTRACTUALISER LE BESOIN
Vérifier le besoin métier                                                   PHPUnit<?phprequire_once PHPUnit/Extensions/St...
Vérifier le besoin métierFonctionnalité: posséder un compte bancaire  Afin de gérer les comptes bancaires des utilisateurs...
Vérifier le besoin méter                    Behat
Domain Driven Design• S’assurer que le code correspond au besoin• Le code recouvre le besoin• Les modèles sont fonctionnels
Vision globaleCENTRALISER LES CONTRATS
Superviser             Sonar
Intégration continue• Permet de s’assurer que quoi qu’il se passe, un code qui ne  respecte pas l’ensemble des contrats ne...
Merci !• C’est l’heure des questions• @halleck45• blog.lepine.pro
Industrialiser le contrat dans un projet PHP
Prochain SlideShare
Chargement dans…5
×

Industrialiser le contrat dans un projet PHP

5 987 vues

Publié le

La notion de contrat intervient à tous les étages en PHP : du code source au besoin fonctionnel, en passant par la nécessité de travailler en équipe ou de fournir un travail clair et compréhensible. Petit tour d'horizon des outils qui vous permettront de vous assurer automatiquement que ces contrats sont bien respectés.

Conférences lors du rendez-vous AFUP Nantes du 29 octobre 2012

Publié dans : Technologie
1 commentaire
4 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
5 987
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4 031
Actions
Partages
0
Téléchargements
32
Commentaires
1
J’aime
4
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Industrialiser le contrat dans un projet PHP

  1. 1. Industrialiser leContrat PHPÀ tous les étages
  2. 2. En face de vous• Jean-François Lépine• Consultant PHP Chez Alterway• Vice-secrétaire de l’AFUP• @Halleck45• http://blog.lepine.pro
  3. 3. Le Contrat• Signez-ici• Avec votre sang• Sinon…porte sur un ComportementOn doit pouvoir le vérifier
  4. 4. Tous les joursDANS LE CODE SOURCE
  5. 5. Un code est uncomportement• Une fonction • Attend une donnée (2 entiers ) • Traite une données (les additionne) • Fournit une données (1 entier) Comment s’en assurer ?
  6. 6. Duck TypingC’est un canard !
  7. 7. Modèle Objet PHP <?php interface ChienInterface { public function aboyer(); public function manger(); public function formir(); }• Une Interface EST un contrat• Ce contrat ne peut être rompu « Implements » = « je m’engage à… sinon fouette-moi! »
  8. 8. Programmation par Contrat• N’est rien d’autre que de la POO poussée jusqu’au bout HOA / Praspel /** * @requires nom : string(boundinteger(1,10)); * @requires jour : boundinteger(1,31); * @requires mois : boundinteger(1,12); * @requires annee : boundinteger(1911,2011); * @ensures result : boolean(); * @throwable FooException; */ public function test1($nom,$jour,$mois,$annee) {
  9. 9. Test Driven Development• Consiste à vérifier le traitement d’une fonction vis-à-vis d’une donnée avant son implémentation PHP Unit, atoum
  10. 10. Le modèle ObjetL’ENGAGEMENT DE LA STUPIDITÉ
  11. 11. KISS• SOLID• Comment tester la stupidité ?
  12. 12. Métriques• Couplage applicatif• Modularité et dépendance• Complexité cyclomatique• Verticalité applicative PHP Depend
  13. 13. Métriques Cornac
  14. 14. Travailler en équipeCONTRACTUALISER LACOLLABORATION
  15. 15. Code accessible• Système de versionning• Source Control Management • Mercurial • Svn • Git • …
  16. 16. Code source lisible PHP_CodeSniffer, checkStyle
  17. 17. Code source chargeable• Respectez le contrat de la PHP Standard Recommandation 0 (PSR-0) • Un nom de classe commence par une majuscule • Chaque namespace est séparé par un _ ou un • Chaque séparateur de namespace représente un niveau dans l’arborescence des dossiers • Correspondance extacte entre le nom de la classe et le nom du fichier
  18. 18. Code source propre PHPMessDetector
  19. 19. Gestion des DépendancesCONTRACTUALISER LES OUTILSTIERS
  20. 20. Dépendances systèmes • PHING (Ant)<target name="php.check.curl"> <php expression="in_array(curl, get_loaded_extensions())" returnProperty="curlEnabled“ /> <fail unless="curlEnabled" message="You need cUrl" /></target> • PHP<?phprequire_once dirname(__FILE__)./SymfonyRequirements.php;$symfonyRequirements = new SymfonyRequirements();$iniPath = $symfonyRequirements->getPhpIniConfigPath();echo "********************************n";echo "* *n";echo "* Symfony requirements check *n";echo "* *n";echo "********************************nn";
  21. 21. Dépendances d’outils <dependencies> <required> <php><min>5.3.0</min></php> <pearinstaller> <min>1.9.4</min></pearinstaller> <package> <name>PHPUnit</name> <channel>pear.phpunit.de</channel> <min>3.7.0</min> <max>3.7.1</max> </package> …• Puissant Pear• Vieillot
  22. 22. Dépendance d’outils Composer"require": { "php": ">=5.3.3", "symfony/symfony": "2.2.*", "doctrine/orm": ">=2.2.3,<2.4-dev", "doctrine/doctrine-bundle": "1.0.*", "twig/extensions": "1.0.*«}• Puissant• Très utilisé et moderne• Jeune
  23. 23. SécuriserASSURER LA SÉCURITÉ
  24. 24. Audit statique RATS• Vérifier quelques « empreintes » dans le code source
  25. 25. Surface d’attaque NIKTO2
  26. 26. Travailler sur le fonctionnelCONTRACTUALISER LE BESOIN
  27. 27. Vérifier le besoin métier PHPUnit<?phprequire_once PHPUnit/Extensions/Story/TestCase.php;require_once BowlingGame.php;class BowlingGameSpec extends PHPUnit_Extensions_Story_ TestCase { /** * @scenario */ public function scoreForGutterGameIs0() { $this ->given(New game) ->then(Score should be, 0); }}
  28. 28. Vérifier le besoin métierFonctionnalité: posséder un compte bancaire Afin de gérer les comptes bancaires des utilisateurs En tant que client Je dois être capable deffectuer des opérations basiquesur mon compte Scénario: Avoir un compte bancaire valide Etant donné que je suis un nouveau client Alors je dois avoir "0" euros sur mon compte Scénario: Retirer de largent sur mon compte Etant donné que je suis un client Et que je possède "50" euros sur mon compte Quand je retire "10" euros Alors je dois avoir "40" euros sur mon compte
  29. 29. Vérifier le besoin méter Behat
  30. 30. Domain Driven Design• S’assurer que le code correspond au besoin• Le code recouvre le besoin• Les modèles sont fonctionnels
  31. 31. Vision globaleCENTRALISER LES CONTRATS
  32. 32. Superviser Sonar
  33. 33. Intégration continue• Permet de s’assurer que quoi qu’il se passe, un code qui ne respecte pas l’ensemble des contrats ne peut pas être mis en production
  34. 34. Merci !• C’est l’heure des questions• @halleck45• blog.lepine.pro

×