industrialiser le contrat dans un projet php
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 2012TRANSCRIPT
Industrialiser le Contrat 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://blog.lepine.pro
Le Contrat• Signez-ici• Avec votre sang• Sinon…
porte sur un Comportement
On doit pouvoir le vérifier
DANS LE CODE SOURCETous les jours
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 ?
Duck TypingC’est un canard !
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! »
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
Test Driven Development• Consiste à vérifier le traitement d’une fonction vis-à-vis d’une
donnée avant son implémentation
PHP Unit, atoum
L’ENGAGEMENT DE LA STUPIDITÉLe modèle Objet
KISS
• SOLID• Comment tester la stupidité ?
Métriques• Couplage applicatif• Modularité et dépendance• Complexité cyclomatique• Verticalité applicative PHP Depend
Métriques
Cornac
CONTRACTUALISER LA COLLABORATION
Travailler en équipe
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 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
Code source propre
PHPMessDetector
CONTRACTUALISER LES OUTILS TIERS
Gestion des Dépendances
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";
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
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
ASSURER LA SÉCURITÉSécuriser
Audit statique• Vérifier quelques « empreintes » dans le code source
RATS
Surface d’attaqueNIKTO2
CONTRACTUALISER LE BESOINTravailler sur le fonctionnel
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
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
Vérifier le besoin méterBehat
Domain Driven Design• S’assurer que le code correspond au besoin• Le code recouvre le besoin• Les modèles sont fonctionnels
CENTRALISER LES CONTRATSVision globale
SuperviserSonar
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
Merci !• C’est l’heure des questions• @halleck45• blog.lepine.pro