Bonjour 1
Structurer son code Design patterns... 2
Bonnes pratiques Limiter l héritage Référencer des interfaces plutôt que des implémentations Segmentation des interfaces par responsabilité métier 3
Limites de l héritage Base SousClasse1 SousClasse2 ClasseFinale 4
Limites de l héritage Base Classe A SousClasse1 Classe B SousClasse2...?! SousClasseN 5
Encapsulation Limiter le nombre de lignes d un traitement Limiter la «complexité cyclomatique» (imbrications multiple de boucles et conditions) Favoriser la réutilisation 6
Le couplage Classe 1 Interface Classe 2 7
Interfaces vs Implémentations Interchangeabilité des implémentations Interface Implementation 1? Implementation 2 8
Evoluer par ajout vs Evoluer par modification Usage des interfaces Principe de composition 9
Design Patterns Bonnes pratiques de développement 10
Définition Solution générique, applicable à un problème récurrent dans la conception d un programme 11
Objectifs Eviter les erreurs classiques de conception Partager une approche commune 12
Mythes et réalités C est Une méthodologie générale Une approche Ce n est pas Une technologie Restreint à un langage en particulier 13
Catégories de DP Création Politique de création des instances d objets de votre programme Structuration «Typologie» de classes : comment concevoir ses classes pour qu elles assument un rôle particulier Comportement «Orchestration» : comment les classes vont-elles communiquer? 14
Création Singleton Classe ne pouvant être instanciée qu une fois au sein de l application Abstract Factory Classe en charge de l instanciation d objets d une certaine famille 15
Création Builder Principe de segmenter un processus de création complexe en traitements unitaires, pouvant servir dans différents contextes Factory Method Interface proposant des méthodes de création d objets, dont le détail est délégué aux implémentations 16
Comportement Object Pool Principe de recycler des instances d objets non utilisées plutôt qu en recréer de nouvelles Prototype Principe de préparer une instance d objet et en retourner une copie à chaque demande 17
Structuration Adapter Classe ou interface créée dans le but d utiliser un élément ou une librairie non compatible avec votre architecture Composite Principe de décomposition d un ensemble en souspartie (ex. arbre) Decorator Classe en charge d ajouter des fonctionnalités à une autre sans utiliser de technique d héritage 18
Structuration Facade Proposer une interface simple exposant des fonctionnalités d un sous-système complexe Proxy Objet encapsulant un autre objet de façon à en modifier le comportement initialement prévu 19
Comportement State Principe d une classe effectuant un traitement différent en fonction de son état. (ex. workflow) Strategy Interchangeabilité d une classe implémentant un comportement à l exécution Command Principe de décorréler une requête de son exécution, délégant cette exécution à une ou plusieurs classes en charge d une action unitaire : la commande 20
Comportement Mediator Classe par laquelle va transiter un ensemble de traitements d une même nature, de façon à offrir un point nevralgique assurant leur coordination. Memento Principe de conservation de points de reprise, permettant à un programme de restaurer son état à un instant passé. Observer Instance notifiée lorsqu une autre effectue un certain type de traitement. L observer s enregistre auprès d un sujet afin d être appelé au moment opportun. 21
Comportement Template method Principe d une classe abstraite définissant des traitements dont certaines parties sont déléguées aux classes filles. Visitor Classe dont le rôle est de parcourir un ensemble d élément et d y opérer des modifications en fonction de leur type 22
Exemples Composite Arbre Adapter Transformateur de courant Decorator Cadre photo Facade Machine à laver Proxy Coque d iphone State Distributeur automatique Strategy Machine à café Commande Télécommande Mediator Panneau électrique Memento Jeu vidéo Observer Panneau solaire Visitor Facteur 23
Strategy Une interface, plusieurs implémentations, une implémentation définie à l exécution Exécution de méthodes dynamiques (type callback ou pointeur sur fonction) Interface Implémentation 1 Implémentation 2 24
MVC Modèle Représentation logique de données métier modélisée sous forme d'objets véhicules d'information et non de logique Vue Représentation visuelle / éléments de l'interface utilisateur Controller Programme en charge d alimenter les données utilisées par la vue pour sont affichage de réceptionner, contrôler et traiter les messages issus de l'interface utilisateur 25
MVC sur client lourd Contrôleur = code défini en réaction aux événements de la vue, interagissant avec les composants Vue = vue de l écran sur laquelle on place les composants 26
Quelques questions clé Que vais-je réutiliser? Ce mode de fonctionnement est-il susceptible d évoluer prochainement? Les noms que j utilise sont-ils clairs? Si cette règle change, quels seraient les impacts? 27
Plus concrètement Séparation des responsabilités Classes «modèle» (Value Objects) Classes d accès au données Classes en charge d appliquer les règles de gestion métier Classes en charge de la présentation des données à la vue Classes de vue en charge de l affichage 28
Architecture Accès aux données Données Services métiers Métier Modèle Contrôle des vues Présentation Vues 29
Plus concrètement Utiliser les packages pour catégoriser vos classes par couche Proposer des interfaces pour le dialogue entre ces couches (métier et données notamment) 30
Exemple VO = Value Object (Objet valué) DAO = Data Access Object (Objet d accès aux données) BilletVO UtilisateurVO UtilisateurDAO BlogDAO BilletDAO CommentaireDAO CommentaireVO BlogService AccueilController AccueilView PageBilletController PageBilletView 31
BlogService va... 1. Contrôler les droits d accès 2. Vérifier la cohérence des données transmises 3. Appliquer les règles de gestion (ex. notifier l administrateur si un billet contient de mots grossiers...) 4. Transmettre les objets vérifiés à la couche d accès aux données 5. Eventuellement combiner différentes données issues de la couche d accès aux données pour fournir un résultat complet 32
BlogService Utilisateur authentifier(string login, String password) boolean ecrirebillet(utilisateur auteur, Billet billetecrit) boolean supprimerbillet(billet billetasupprimer) List<Billet> getbilletsaveccommentaires() boolean ajoutercommentaire(commentaire commentaire, Billet billetcommente) boolean supprimercommentaire(commentaire commentaire) boolean deconnexion(utilisateur utilisateur) 33
BilletDAO boolean ajouterbillet(billet billet) boolean supprimerbillet(integer idbillet) List<Billet> listerbillets(boolean tripardate) 34
CommentaireDAO boolean ajoutercommentaire(commentaire commentaireainserer) boolean supprimercommentaire(integer idcommentaire) Map<Integer, List<Commentaire>> listercommentaireparbillet(set<integer> idbillets) 35
Automatisation 36
Pourquoi? Accélérer les tâches répétitives Réduire le risque d erreur 37
Approches Script Shell / batch, Ant, Grunt.js, Gradle... Métadonnées Maven, Gradle... 38
Script Avantages Aucune limite #!/bin/sh javac... cp... echo Terminé! Inconvénients Dépendant de l OS Complexe Pas de standard @echo off javac... copy... echo Terminé! 39
Ant Avantages Simple Java : multiplateforme Extensible Intégré à la majorité des IDE du marché Inconvénients <?xml version="1.0" encoding="utf-8"?> <project name="osmf.samples.exampleplayer" default="build"> <property environment="env" /> <property file="./build.properties" /> <!-- compile project --> <target name="build" depends="clean-bin" > <javac> </javac> </target> <!-- cleans the output directory --> <target name="clean-bin"> <sequential> <delete includeemptydirs="true" quiet="true"> <fileset dir="${basedir}"> <include name="${output.bin}/**/*" /> </fileset> </delete> </sequential> </target> </project> Pas de standard 40
Maven Avantages Extensible Définit un standard Dépasse la simple automatisation de tâches src main java resources test java pom.xml Gestion de dépendances transitives Déploiement... Inconvénients Plus long à apprendre qu Ant 41
Gradle Avantages Très flexible Groovy : task hello { dolast { println 'Hello world!' } } multiplateforme script et non XML Définit un standard Personnalisation plus simple que Maven Inconvénients Temps d apprentissage 42
Grunt.js Avantages Orienté web Compression de scripts JS, CSS Javascript: multiplateforme Simple d accès Inconvénients Jeune Orienté web module.exports = function(grunt) { // Project configuration. grunt.initconfig({ pkg: grunt.file.readjson('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // Load the plugin that provides the "uglify" task. grunt.loadnpmtasks('grunt-contrib-uglify'); }; // Default task(s). grunt.registertask('default', ['uglify']); 43
Ant Principe Fichier build.xml Déclaration d un projet (project), composé de «cibles» (target) Une cible est un enchaînement de tâches (tasks) 44
Ant Installation Dans eclipse Sinon : binaire téléchargeable sur le site ajout du répertoire «bin» à la variable d environnement «PATH» Exécution ant build.xml 45
Ant Exemple <?xml version="1.0"?> <project name="magentomodule" basedir=".." default="copylocal"> <property name="magento.installdir" value="/applications/mamp/htdocs/magento"/> <target name="copylocal"> <copy todir="${magento.installdir}/app/code/local" overwrite="true"> <fileset dir="${basedir}/app/code/local"/> </copy> </target> </project> 46
Principale tâches Ant <property name="chemin" value="c:\temp \Build" /> Définir une variable <echo>démarrage...</echo> Afficher un message sur la sortie <fileset dir="./"> Définit un ensemble de fichiers listés à partir d un répertoire <include name="**/*.jar" /> Inclut tous les fichiers JAR (dans un fileset). Opposé : exclude 47
Principale tâches Ant <classpath> Redéfinit le classpath utilisé par la tâche en cours d exécution <javac srcdir="./src" destdir="./build" /> Compile des fichiers Java en.class <jar jarfile="./build/malib.jar" basedir="./build" /> Crée un fichier JAR à partir de sources compilées <mkdir> <copy> <delete> Opération sur le système de fichiers 48
Maven Configuration et organisation projet 49
Qu est-ce que Maven? Permet d automatiser la gestion et la construction de projets Java Propose un cadre standard Organisation des sources, tests unitaires Description de l équipe, du référentiel de sources Gestion des dépendances et dépendances transitives Profils de compilation 50
Comment l utiliser? pom.xml Descripteur d un projet http://maven.apache.org/pom.html 51
pom.xml <build> Décrit les fonctions relatives à la construction d un projet (classpath, version de java...) <profiles> Profils de construction, permet de personnaliser la totalité du pom selon des identifiants de profil 52
pom.xml <dependencies> Liste les dépendances selon un format «qualifié» groupid : nom d un groupe (en général le préfixe du package principal) artifactid : nom de la dépendance (en général le nom du projet) version : version du projet type : format (jar, pom...) scope : le contexte pour lequel on a besoin de la dépendance (compilation, runtime...) 53
pom.xml basique <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.mycompany.app</groupid> <artifactid>my-app</artifactid> <packaging>jar</packaging> <version>1.0-snapshot</version> <name>maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> 54
Structure de répertoires src main Principales sources du programme java Sources Java resources Fichier non Java utilisé dans le cadre de l exécution du programme test Fichiers relatifs aux tests unitaires java Sources des tests unitaires resources Fichiers non Java utilisés uniquement dans le cadre des tests unitaires target Résultat de la compilation 55
Comment l utiliser? L utilitaire en ligne de commande, depuis l emplacement du fichier pom.xml Avec [goal] = mvn [goal] clean : supprimer les éléments précédemment construits test : lancer les tests unitaires package : packager (un WAR, un JAR) deploy : déployer l application sur le serveur cible install : installer le JAR sur le repository local... 56
Installons Maven... http://maven.apache.org Anatomie de l installation bin Contient l exécutable mvn conf Contient le fichier de configuration settings.xml (utile pour le proxy) 57
Premier projet Maven Les archetypes permettent de créer un projet, prêt à démarrer Il existe de nombreux archetypes contribués par la communauté 58
Premier projet Maven mvn archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=com.mycompany.app \ -DartifactId=my-app 59
Pratique avec eclipse 60
Pratique avec eclipse 61
Maven - settings.xml <localrepository> E:\Dev... </localrepository> Répertoire contenant les JARs gérés par Maven 62
Pratique - Projet Maven 63
Pratique - Projet Maven 64
Pratique - Projet Maven 65
Pratique - Projet Maven 66
Résolution de dépendances Réseau interne Internet Dépôt local Dépôt public Poste interne Synchronisation repo1.maven.org 67
Proxy Maven Réseau interne Internet Dépôt local Dépôt d entreprise Dépôt public Poste interne Synchronisation Nexus Synchronisation repo1.maven.org 68
Proxy Maven Serveur permettant d installer des dépendances personnalisées http://www.sonatype.org/nexus/ 69
Maven - settings.xml <mirrors> <mirror> <id>nexus</id> <mirrorof>*</mirrorof> <url>http://votreserveur/nexus/content/groups/public</url> </mirror> </mirrors> Miroir du référentiel central de Maven 70
Maven - settings.xml <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>central</id> <url>http://central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginrepositories> <pluginrepository> <id>central</id> <url>http://central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginrepository> </pluginrepositories> </profile> </profiles> Configuration du miroir pour prendre les dépendances et les plugins 71
Maven - settings.xml <activeprofiles> <activeprofile>nexus</activeprofile> </activeprofiles> Activation du profil 72
Intégration continue 73
Intégration continue L'intégration continue est le principe de faire d'un processus d'intégration logiciel un «non-évènement» - Martin Fowler - 74
Objectifs Définir un processus répétable Automatiser ce processus 75
Principe Que se passe-t-il entre le moment ou vous terminez un développement et le moment où votre application est déployée et disponible pour votre client? 76
Principales étapes 1.Déclencher le processus 2.Mise à jour des sources 3.Compilation 4.Tests unitaires 5.Construction 6.Déploiement 77
Principales étapes 1.cron... 2.svn update... 3.javac... 4.java -cp junit.jar... 5.jar -cvf monappli.war... 6.copy... 78
Moyens «A la main» Script / Ant Basique Maven (deploy), Gradle Outillé Hudson, CruiseControl, Jenkins 79
Outils Hudson Ancêtre de Jenkins Jenkins Standard actuel du marché, multi-langages, simple d accès CruiseControl Moins «user-friendly» que Jenkins, néammoins répandu Continuum Porté par Apache 80
Jenkins Configuration Définir le JDK Installations Ant, Maven, ou relatives aux plugins SMTP pour mail Plugins Compilation (.NET, Ruby, C++...) Déploiement (FTP, CIFS,...) Notifications (Campfire, Google, Growl, IRC, Jabber...) Stats (Sonar, Selenium...)... 81
Jenkins Jobs Définition d un processus d intégration continue Dashboard de suivi de l historique des exécutions de jobs Consultation de rapports d analyse 82
Jenkins : Demo https://builds.apache.org/ 83
Détail d un job 84