35
Industrialiser le Contrat PHP À tous les étages

Industrialiser le contrat dans un projet PHP

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Industrialiser le contrat dans un projet PHP

Industrialiser le Contrat PHPÀ tous les étages

Page 2: Industrialiser le contrat dans un projet PHP

En face de vous• Jean-François Lépine• Consultant PHP Chez Alterway• Vice-secrétaire de l’AFUP• @Halleck45• http://blog.lepine.pro

Page 3: Industrialiser le contrat dans un projet PHP

Le Contrat• Signez-ici• Avec votre sang• Sinon…

porte sur un Comportement

On doit pouvoir le vérifier

Page 4: Industrialiser le contrat dans un projet PHP

DANS LE CODE SOURCETous les jours

Page 5: Industrialiser le contrat dans un projet PHP

Un code est un comportement• Une fonction• Attend une donnée (2 entiers )• Traite une données (les additionne)• Fournit une données (1 entier)

Comment s’en assurer ?

Page 6: Industrialiser le contrat dans un projet PHP

Duck TypingC’est un canard !

Page 7: Industrialiser le contrat dans un projet PHP

Modèle Objet PHP

• Une Interface EST un contrat• Ce contrat ne peut être rompu

<?php interface ChienInterface {

public function aboyer();public function manger();public function formir();

}

« Implements » =

« je m’engage à… sinon fouette-moi! »

Page 8: Industrialiser le contrat dans un projet PHP

Programmation par Contrat• N’est rien d’autre que de la POO poussée jusqu’au bout

/** * @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) {

HOA / Praspel

Page 9: Industrialiser le contrat dans un projet PHP

Test Driven Development• Consiste à vérifier le traitement d’une fonction vis-à-vis d’une

donnée avant son implémentation

PHP Unit, atoum

Page 10: Industrialiser le contrat dans un projet PHP

L’ENGAGEMENT DE LA STUPIDITÉLe modèle Objet

Page 11: Industrialiser le contrat dans un projet PHP

KISS

• SOLID• Comment tester la stupidité ?

Page 12: Industrialiser le contrat dans un projet PHP

Métriques• Couplage applicatif• Modularité et dépendance• Complexité cyclomatique• Verticalité applicative PHP Depend

Page 13: Industrialiser le contrat dans un projet PHP

Métriques

Cornac

Page 14: Industrialiser le contrat dans un projet PHP

CONTRACTUALISER LA COLLABORATION

Travailler en équipe

Page 15: Industrialiser le contrat dans un projet PHP

Code accessible• Système de versionning• Source Control Management• Mercurial• Svn• Git• …

Page 16: Industrialiser le contrat dans un projet PHP

Code source lisible

PHP_CodeSniffer, checkStyle

Page 17: Industrialiser le contrat dans un projet PHP

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

Page 18: Industrialiser le contrat dans un projet PHP

Code source propre

PHPMessDetector

Page 19: Industrialiser le contrat dans un projet PHP

CONTRACTUALISER LES OUTILS TIERS

Gestion des Dépendances

Page 20: Industrialiser le contrat dans un projet PHP

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<?php require_once dirname(__FILE__).'/SymfonyRequirements.php'; $symfonyRequirements = new SymfonyRequirements(); $iniPath = $symfonyRequirements->getPhpIniConfigPath(); echo "********************************\n"; echo "* *\n"; echo "* Symfony requirements check *\n"; echo "* *\n"; echo "********************************\n\n";

Page 21: Industrialiser le contrat dans un projet PHP

Dépendances d’outils

• Puissant• Vieillot

<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> …

Pear

Page 22: Industrialiser le contrat dans un projet PHP

Dépendance d’outils

• Puissant• Très utilisé et moderne• Jeune

"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.*«

}

Composer

Page 23: Industrialiser le contrat dans un projet PHP

ASSURER LA SÉCURITÉSécuriser

Page 24: Industrialiser le contrat dans un projet PHP

Audit statique• Vérifier quelques « empreintes » dans le code source

RATS

Page 25: Industrialiser le contrat dans un projet PHP

Surface d’attaqueNIKTO2

Page 26: Industrialiser le contrat dans un projet PHP

CONTRACTUALISER LE BESOINTravailler sur le fonctionnel

Page 27: Industrialiser le contrat dans un projet PHP

Vérifier le besoin métier

<?php require_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);

} }

PHPUnit

Page 28: Industrialiser le contrat dans un projet PHP

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 d'effectuer des opérations basique sur 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 l'argent 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

Page 29: Industrialiser le contrat dans un projet PHP

Vérifier le besoin méterBehat

Page 30: Industrialiser le contrat dans un projet PHP

Domain Driven Design• S’assurer que le code correspond au besoin• Le code recouvre le besoin• Les modèles sont fonctionnels

Page 31: Industrialiser le contrat dans un projet PHP

CENTRALISER LES CONTRATSVision globale

Page 32: Industrialiser le contrat dans un projet PHP

SuperviserSonar

Page 33: Industrialiser le contrat dans un projet PHP

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

Page 34: Industrialiser le contrat dans un projet PHP
Page 35: Industrialiser le contrat dans un projet PHP

Merci !• C’est l’heure des questions• @halleck45• blog.lepine.pro