249
Génie Logiciel ESIEA 2015-2016 Mise-à-jour : 14/01/2016

Génie Logiciel - ICAUDA Mix-it 29-30 avril 2014 Breizth Camp 21-23 mai 2014 Agile France 22-23 mai 2014

Embed Size (px)

Citation preview

Génie Logiciel

ESIEA 2015-2016

Mise-à-jour : 14/01/2016

Thierry Leriche-Dessirier

[email protected]@thierryleriche

www.icauda.com

ESIEA 2001

Cours• 12 fév• 29 fév• 7 mars• 14 mars

Evaluation • Semaine du 13 mai

(aucun document)

Planning 3A( INF3038 )

Projet 3A( LAB3416 )

par équipe de 6-8

Dates clés :• 7 mars : constitution des équipes• 14 mars : Présentation du sujet• 14 avril : Remise du projet par email

Cours• 7 avril• 8 avril• 14 avril• 15 avril

Evaluation • Semaine du 13 mai

(aucun document)

Planning CFA( INF3038 )

Projet 3A( LAB3416 )

par équipe de 6-8

Dates clés :• 14 avril : constitution des équipes• 15 avril : Présentation du sujet• 12 mai : Remise du projet par email

Test DISCwww.profil4.com/disc-essentiel

Pédagogie( futurs jeunes ingénieurs )

www.icauda.com/cours

L’ESIEAl’Ecole qui forme

l’Ingénieur et l’Homme

Arrêté ministériel du 30 décembre 1983(Journal officiel du 19 février 1984)

Le génie logiciel est « l'ensemble des activités deconception et de mise en œuvre des produits etdes procédures tendant à rationaliser laproduction du logiciel et son suivi »

Wikipedia

Le génie logiciel « est une science de génie industriel quiétudie les méthodes de travail et les bonnes pratiquesdes ingénieurs qui développent des logiciels. »

Le génie logiciel « s'intéresse en particulier auxprocédures systématiques qui permettent d'arriver à ceque des logiciels de grande taille correspondent auxattentes du client, soient fiables, aient un coûtd'entretien réduit et de bonnes performances tout enrespectant les délais et les coûts de construction. »

UML + Java (en support)

Un peu d’histoire… pourquoi UML ?

http://en.wikipedia.org/wiki/File:OO-historie-2.svg

http://en.wikipedia.org/wiki/Unified_Modeling_Language

9 diagrammes :

• de classes ;• de cas d’utilisation (use case) ;• d’objets ;• de collaboration ;• de séquence ;• d’états-transitions ;• d’activités ;• de composants ;• de déploiement

Diagramme de classe

Des exemples simples

public interface Mammifere {

int getNombreMamelle();

}

public class Loup implements Mammifere {

private int nbMamelle;

@Override

public int getNombreMamelle() {

return nbMamelle;

}

public void setNombreMamelle(int nbMamelle) {

this.nbMamelle = nbMamelle;

}

}

Accesseurs( getter / setter )

La classe Loup implémente l’interface Mammifere

Attributs

Méthodes

Graphes UML avec ObjectAid

Fleche avec trait en pointillé

public class Chien extends Loup {

private boolean lof;

private String tatouage;

public boolean isLof() {

return lof;

}

public void setLof(boolean lof) {

this.lof = lof;

}

public String getTatouage() {

return tatouage;

}

public void setTatouage(String tatouage) {

this.tatouage = tatouage;

}

}

La classe Chien étend la classe Loup

Fleche avec trait plein

La classe Chien étend la classe Loup qui implémente l’interface Mammifere

Fleche avec trait plein

Fleche avec trait en pointillé

Un exemple vachement plus complexe( mais qui reste courant )

gén

éral

isat

ion

spéc

ialis

atio

n

Graphes UML avec Omondo

Pour la prochaine fois

Trouver le sigle utilisé pour représenter le « protected »

Pour « private » on utilise « - » Pour « public » on utilise « + »

Et pour « protected » ???

public enum Genre {

HOMME(1, "Garcon"),

FEMME(2, "Fille"),

TEMPORAIRE(8, "Temp");

final int codeSecu;

final String label;

Genre(final int codeSecu, final String label) {

this.codeSecu = codeSecu;

this.label = label;

}

public int getCodeSecu() {

return codeSecu;

}

public String getLabel() {

return label;

}

}

public interface Mammifere {

int getNombreMamelle();

Genre getSexe();

}

public class Loup implements Mammifere {

private int nbMamelle;

private Genre sexe;

@Override

public Genre getSexe() {

return sexe;

}

public void setSexe(Genre sexe) {

this.sexe = sexe;

}

...

}

La classe Louppossèdeun attribut du type Genre (sexe).

On parle d’une association.

Association *-1

Graphes sympas avec yUML :http://yuml.me/

AssociationsTélécommande et piles

AgrégationTélécommande et son couvercle

Une télécommande sans couvercle est-elle toujours

une télécommande ?

Diamant vide

CompositionTélécommande et ses touches

Une télécommande sans touche est-elle toujours une

télécommande ?

Diamant plein

Association,Agrégation,Composition

Composition 1-1..*(biilatérale)

Association *-*(unilatérale)

Agrégation 1-1(unilatérale)

Graphes UML avec Omondo

Démo UML avec YUML

[Telecommande|-piles;|+getPiles();+setPiles();]*-*[Pile]

[Telecommande|-couvercle;|+getCouvercle();

+setCouvercle();]<>1-1>[Couvercle]

[Telecommande|-touches|+getTouches();+setTouches();]++1-

1..*>[Touche|-telecommande|+getTelecommande();

setTelecommande();]

Diagramme de séquence

Au volant de sa voiture

Démo UML avec Web Sequence Diagrams

A->B: text

activate B

B-->A: text

deactivate B

A->A: text

A->B: text

participant Conducteur

participant Cle

participant Pedale

participant Voiture

participant Demarreur

participant Moteur

participant Arbre

Conducteur->Cle: tourner

activate Cle

Cle->Voiture: demarrer

activate Voiture

Voiture->Demarreur: activer

activate Demarreur

Demarreur->Arbre: entrainer

activate Arbre

Arbre-->Demarreur: ok

deactivate Arbre

Demarreur-->Voiture: ok

deactivate Demarreur

deactivate Voiture

deactivate Cle

Conducteur->Pedale: appuyer

activate Pedale

Pedale->Voiture: accelerer

activate Voiture

Voiture->Moteur: accelerer

activate Moteur

Moteur->Arbre: entrainer

activate Arbre

Arbre-->Moteur:

deactivate Arbre

Moteur-->Voiture: vitesse_rotation

www.websequencediagrams.com

Diagramme de séquence du programme suivant

Pour la prochaine foisCopie individuelle à rendre sur papier au stylo

public class Launcher {

public static void main(String[] args) {

Job job = new Job();

int result = job.work();

System.exit(result);

}

} public class DogReader {

public DogReader(String string) {

...

}

public List<Dog> getByRace(String string) {

...

}

}

suite

Pour la prochaine foisCopie individuelle à rendre sur papier au stylo

public class Job {

public int work() {

try {

DogReader dr = new DogReader("c:/files/dog.xml");

List<Dog> labradors = dr.getByRace("labrador");

AnimalService service = AnimalService.getInstance();

service.send(labradors);

return labradors.size();

} catch (Exception e) {

return -1;

}

}

}

suite

Pour la prochaine foisCopie individuelle à rendre sur papier au stylo

public class AnimalService {

private static AnimalService instance = null;

private AnimalService() {

...

}

public static AnimalService getInstance() {

if (instance == null) {

instance = new AnimalService();

}

return instance;

}

public void send(List<Dog> labradors) {

...

}

}

Diagramme d’états-transitions

Feux tricolores

Etat (adjectif)

Transition

Lave vaisselle

Laver la vaisselle en machine

Graphes avec Visual Paradigm (community edition) pour Eclipsehttp://www.visual-paradigm.com/

Laver la vaisselle en machine

Fin(Ronds imbriqués)

Début(Ronds plein)

Laver la vaisselle en machine

Laver la vaisselle en machine

Historique

Laver la vaisselle en machine

Diagramme d’état-transitions d’un œuf qu’on cuit dans une casserole d’eau et/ou dans une poêle.

Pour la prochaine foisCopie individuelle à rendre sur papier au stylo

(un seul diagramme pour la casserole et la poêle)

Bifurcation

Bifurcation

final

Bifurcation

http://uml.free.fr

Diagramme d’activité

Laver la vaisselle en machine (encore)

Action (verbe)

Transition

Laver la vaisselle en machine (encore) Diagramme très proche de l’état-transitions

Etat (adjectif)

Action (verbe)

Représentationdes conditions

ReprésentationD’une décision

Décision

Synchronisation

Signaux

Prochaines conférences

Scrum Day10-11 avril 2014http://www.scrumday.fr/

Devoxx France16-18 avril 2014http://www.devoxx.fr/

Mix-it29-30 avril 2014http://www.mix-it.fr/

Breizth Camp21-23 mai 2014http://www.breizhcamp.org/

Agile France22-23 mai 2014http://2014.conference-agile.fr/

Tests avec JUnit

Prouver que ça fonctionne

public class SimpleCalculette

implements Calculette {

@Override

public int additionner(int a, int b) {

return a + b;

}

@Override

public int multiplier(int a, int b) {

return a * b;

}

}

public interface Calculette {

int additionner(int a, int b);

int multiplier(int a, int b);

}

import static junit.framework.Assert.assertEquals;

import org.junit.Before;

import org.junit.Test;

public class SimpleCalculetteTestCase {

private Calculette calculette;

@Before

public void doBefore() {

calculette = new SimpleCalculette();

}

@Test

public void testAdditionner() {

final int a = 2;

final int b = 3;

final int result = calculette.additionner(a, b);

assertEquals(5, result);

}

Conventions de nommage

Avant chaque test

Test

C’est vert donc c’est ok

Les tests de la classe

Temps d’exécution

Démo dans Eclipse( calcul de φ : 1,618 033 988 7 Fibonacci )

Pour la prochaine foisCopie individuelle à rendre sur papier au stylo

(code des tests ET code de la calculette)

Factoriser les tests et les faire tous passer au vert (y compris le dernier sur le durée)

Utiliser une HashMap

Dossier – La suite de Fibonacci et le nombre d’or : http://www.podcastscience.fm/dossiers/2011/03/17/la-suite-de-fibonacci-nombre-d-or/

One more thing

Tests

A la découverte de Junit

« Les Tests en Trois Temps »icauda.com/articles.html#3t

Les méthodes agiles( Scrum, Xp, Kanban, Lean… )

Cycle en V

Manifeste agile

Les 4 valeurs :• Les individus et leurs interactions plus que les processus et les outils.• Des logiciels opérationnels plus qu’une documentation exhaustive.• La collaboration avec les clients plus que la négociation contractuelle.• L’adaptation au changement plus que le suivi d’un plan.

Wikipedia : http://fr.wikipedia.org/wiki/Manifeste_agile

Manifeste agile

Les 12 principes :• Notre plus haute priorité est de satisfaire le client en livrant rapidement et

régulièrement des fonctionnalités à grande valeur ajoutée.• Accueillez positivement les changements de besoins, même tard dans le

projet. Les processus agiles exploitent le changement pour donner un avantage compétitif au client.

• Livrez fréquemment un logiciel opérationnel avec des cycles de quelques semaines à quelques mois et une préférence pour les plus courts.

• Les utilisateurs ou leurs représentants et les développeurs doivent travailler ensemble quotidiennement tout au long du projet.

• Réalisez les projets avec des personnes motivées. Fournissez-leur l’environnement et le soutien dont ils ont besoin et faites-leur confiance pour atteindre les objectifs fixés.

• La méthode la plus simple et la plus efficace pour transmettre de l’information à l'équipe de développement et à l’intérieur de celle-ci est le dialogue en face à face.

Manifeste agile

Les 12 principes (suite) :• Un logiciel opérationnel est la principale mesure d’avancement.• Les processus agiles encouragent un rythme de développement soutenable.

Ensemble, les commanditaires, les développeurs et les utilisateurs devraient être capables de maintenir indéfiniment un rythme constant.

• Une attention continue à l'excellence technique et à une bonne conception renforce l’agilité.

• La simplicité – c’est-à-dire l’art de minimiser la quantité de travail inutile – est essentielle.

• Les meilleures architectures, spécifications et conceptions émergent d'équipes auto organisées.

• À intervalles réguliers, l'équipe réfléchit aux moyens de devenir plus efficace, puis règle et modifie son comportement en conséquence.

« Mémento Manifeste Agile »

« En route vers l'agilité, SCRUM et XP : retour d'expérience »http://rad-hass.developpez.com/tutoriels/conception/route-vers-agilite-scrum-et-xp-retour-

experience/

Des rôles :• Product Owner• Scrum Master• Team

Des concepts :• Story points• Velocity• User story• Done

Des rituels :• Sprint• Daily stand up• Sprint review• Planning poker• Retrospective

Des artefacts :• Product backlog• Sprint backlog• Task board• Burn down

Scrum

User story

Cartes Scrum( planning poker )

Planning poker

Stand up

Stand up

Dashboard

Taskboard

Dashboard (taskboard) pour de vrai

Dashboard (taskboard) pour de vrai

Cherchez ce qui ne va pas

Burndown d’un sprint

Burndown en vrai

0

5

10

15

20

25

30

35

40

45

50

1 2 3 4 5 6 7 8 9 10

RAF

idéal

Idéal adapté

Démo

Rétrospective de fin de sprint

Quelques lectures

« 3T en pratique »http://thierry-leriche-dessirier.developpez.com

« Scrum et Agile avec des bonhommes »http://hingchanscrum.blogspot.com

« Présentation des méthodes agiles et Scrum »http://ineumann.developpez.com/tutoriels/alm/agile_scrum

« Scrum Xp depuis les tranchées »http://henrik-kniberg.developpez.com/livre/scrum-xp

« Mémento Scrum gratuit »http://thierry-leriche-dessirier.developpez.com/tutoriels/general/memento-scrum-destination-

equipe/

« Petit guide du lean »http://leanagilecamp.fr/guide.html

https://www.youtube.com/watch?v=HsB0UZR7XvE&index=1&list=PLypC2fA0xsaWULkC3Q9b1dXdZGIi0oj-h

Multitâche au volant ?

Multitâche au travail ?

Multitâche en réunion ?

Test DISC gratuit : www.profil4.comPodcast : http://www.outilsdumanager.com

DISCComportement et Communication

Erreur de communication…

« Ce que vous voulez que les autres fassent

pour vous, faites-le aussi pour eux »Lc 6,31

Nous parlons aux autres comme on aimerait qu’ils nous parlent.

Il faut parler aux autres comme ils aimeraient qu’on leur parle.

« Tout ce que vous voudriez que les hommes fassent

pour vous, faites le, Vous aussi, pour eux »

Mt 7,12

Les saboteurs

ça n’existent pas !

L’équipe partage des objectifs communs

Dominant

Influent

StableConsciencieux

A une visionmacro

Est (trop) franc

Accepte les challenges

Va droit au but

Parle fort

N’a pas peur de se tromper

Enthousiaste et optimiste

Aime collaborer

Ne supporte pasd’être ignoré

Délègue(beaucoup)

A du mal à finirles tâches

Fashion victim

Ne supporte pasd’être pressé

Communique/agitde façon calme

Aide volontiersEst humble

Parle doucement

A besoin d’indépendance

Est objectif/réfléchi

Aime les détails

A peur dese tromper

A du mal à prendre des

décisions sans avoir toutes les infos

GRATUIT 25 questions

sans pub5-10 min

Compréhension et collaboration

Délégation

Recrutement : renforcement / diversification

la

vérité Est

multipleet

complexe

Test DISC Essentiel Gratuithttp://profil4.com/disc-essentiel.php

Podcast Outils du Managerhttp://www.outilsdumanager.com

DISC sur Wikipediahttps://en.wikipedia.org/wiki/DISC_assessment

ICAUDAhttp://www.icauda.com

Profil 4http://www.profil4.com

Illustrations par Mimikahttp://www.mimikaweb.fr

http://profil4.com/medias.php#mementos

User groups

Paris JUG (Java User Group)http://www.parisjug.org/

Duchess Francehttp://www.duchess-france.org/

Angular JS Parishttp://www.meetup.com/AngularJS-Paris

Paris AUG (Android User Group)http://www.paug.fr/

Story board et maquettes

Dessins sympasavec Iphone Mockup :http://iphonemockup.lkmc.ch

Dessins sympasavec Iphone Mockup :http://iphonemockup.lkmc.ch

Balsamiq mockups :http://balsamiq.com/products/mockups

Axure :http://www.axure.com/

Mockingbird :https://gomockingbird.com/mockingbird/#

Pencil :http://pencil.evolus.vn/en-US/Home.aspx

Iphone mockup :http://iphonemockup.lkmc.ch/

Source Code Management (SCM)

http://fr.wikipedia.org/wiki/Source_Code_Management

SubversionCVS Mercurial Git

pratique ?

disque réseau

Pourquoi pas sur un disque réseau ?

Pourquoi pas par email ?

• Travail à distance ?• Echanges de fichiers (nombreux) dans tous les sens ?• Versions des fichiers ?• Sauvegardes ?• Conflits sur des modifications parallèles ?

Subversion : SCM centralisé

Gestion de sources et contrôle de versions :

• garder un historique des différentes versions des fichiers d'un projet ;

• permettre le retour à une version antérieure quelconque ;

• garder un historique des modifications avec leur nature, leur date, leur auteur... ;

• permettre un accès souple à ces fichiers, en local ou via un réseau ;

• permettre à des utilisateurs distincts et souvent distants de travailler ensemble sur les mêmes fichiers.

Copie de travail (working copy)

La copie de travail est un répertoire situé en local sur l’ordide l'utilisateur et qui contient une copie des fichiers. C'estcette copie qui sert de base de travail et qui est modifiéeen local avant d'être envoyée vers le dépôt.

Dépôt (repository)

Un dépôt Subversion est l'emplacement central où sont stockées toutesles données relatives aux projets gérés. Le dépôt contient l'historiquedes versions des fichiers stockés, les logs enregistrés lors desmodifications, les dates et auteurs de ces modifications, etc.

Un dépôt apparaît de l'extérieur comme un système de fichiers composéde répertoires au sein desquels on peut naviguer, lire et écrire selon lespermissions accordées.

Import / checkout( création de la copie locale )

Update( récupération de la dernière

version des fichiers )

Commit( envoie des fichiers modifiés

vers le repository )

Opérations

Le checkout est l'opération qui consiste à récupérer pour la première fois les fichiers déjà existant au sein d'un projet du dépôt. Cette opération ne se fait en général qu'une fois par projet. Le résultat est une copie de travail.

L'update consiste à synchroniser la copie de travail locale avec le dépôt en récupérant la dernière version des fichiers du dépôt. C'est à cette occasion que des conflits de version peuvent apparaître.

Un commit est l'opération inverse d'un update. Elle consiste à mettre à jour le dépôt à partir de la copie de travail locale. Une nouvelle révision est alors créée. Un log (simple message texte contenant une description des modifications effectuées) doit être saisi à cette occasion.

Remarque : pour qu'un commit soit possible, il faut que la copie de travail corresponde à la dernière version du dépôt (modifications locales exceptées). Si ce n'est pas le cas, il est nécessaire d'effectuer d'abord un update et de résoudre les conflits éventuels avant de réessayer le commit.

Commit( bonne pratique : faire un update avant )

Version 1

Version 2

Version 3

Branches( versions )

Version 1

Branche debug

Branches - merge( versions )

Version 1

Version 2

Tags ( révisions )

1.1 1.2

2.1

Git : SCM décentralisé

Espaces

Repo localRepo distant

Workingcopie

Commandes quotidiennes

push

fetch

pull

commit

clone

Git process

merge fetch

commit push

Tutoriel Git chez Atlassian : https://www.atlassian.com/fr/git/tutorial

Travail en branche( les branches ne sont pas chères avec Git )

A B C D

E F G

Master

M-7548-DEV

Merge

A B C D

E F G

Master

M-7548-DEV

Rebase

A B C D

E F GMaster

M-7548-DEV

E’ F’ G’

Cherry-pick

A B D G

E C E

E’

Master

une autre branche

F H

« Git en 15 minutes »

https://try.github.io/levels/1/challenges/1

Quelques logiciels :• Tortoise• Sourcetree• Ungit• Git bash• Plugins d’IDE (Netbeans/Eclipse/etc.)

Intégration continue

mvn clean install

mvn sonar:sonar

Design patterns

Les 23 Design patterns de GOF :

Abstract factory, Builder, Factory, Prototype, Singleton, Adapter, Bridge, Composite, Decorator, Facade, Flyweight,

Proxy, Chain of responsability, Command, Interpreter, Iterator, Mediator, Memento, State, Strategy, Template,

Visitor, Observer

Les patterns JEE :

MVC (Model-View-Controller), Business delegate, Composite entity, DAO (Data Access Object), Front controller,

Intercepting filter, Service locator, Transfer object, IOC (Inversion Of Control)

JEE : Java Enterprise Edition

3 grosses familles :

• Création : Factory, Builder, Singleton, etc.

• Structure : Facade, Decorator / Adaptor, Proxy, etc.

• Comportement : Iterator, Observer, etc.

Chez vous

Classer les design patterns GOF dans les 3 familles : création, structure ou comportement.

A lire sur le Web : http://www.developpez.com

Singleton

Le S

ingl

eto

n

Le Singleton300 + 500 + 600 = 1s 400ms

public class CarteDeVoeuxService {

private DatabaseConnection conn;

private Smtp smtp;

public void envoyer(String name, String message) {

conn = someDatabse.createConnection(); 300ms

conn.open(); 500ms

String email

= conn.query("SELECT email FROM user WHERE name=" + name);

smtp = someServeur.createSmtp(); 600ms

smtp.send(email, message);

...

}

}

Le Singleton

CarteDeVoeuxService service = new CarteDeVoeuxService();

service.envoyer("Thierry",

"Bonjour ça va ? Bla bla bla");

Le Singleton

service1 = new CDVS();

service1.envoyer(...)

service3 = new CDVS();

service3.envoyer(...)

service2 = new CDVS();

service2.envoyer(...)

service4 = new CDVS();

service4.envoyer(...)

CDVS 1

CDVS 2

CDVS 3

CDVS 4

public class CarteDeVoeuxService {

private DatabaseConnection conn;

private Smtp smtp;

private static CarteDeVoeuxService instance

= new CarteDeVoeuxService()

private CarteDeVoeuxService() {

conn = someDatabse.createConnection(); 300ms

conn.open(); 500ms

smtp = someServeur.createSmtp(); 600ms

}

public static CarteDeVoeuxService getInstance() {

return instance;

}

public void envoyer(String name, String message) {

String email

= conn.query("SELECT email FROM user WHERE name=" + name);

smtp.send(email, message);

...

}

}

Le Singleton

CarteDeVoeuxService service = new CarteDeVoeuxService.getInstance();

service.envoyer("Thierry",

"Bonjour ça va ? Bla bla bla");

Le Singleton

service1 = getInstance();

service1.envoyer(...)

service3 = getInstance();

service3.envoyer(...)

service2 = getInstance();

service2.envoyer(...)

service4 = getInstance();

service4.envoyer(...)

CDVS

public class CarteDeVoeuxService {

private DatabaseConnection conn;

private Smtp smtp;

private static CarteDeVoeuxService instance = null;

private CarteDeVoeuxService() {

...

}

public static CarteDeVoeuxService getInstance() {

if(instance == null) {

instance = new CarteDeVoeuxService();

}

return instance;

}

public void envoyer(String name, String message) {

...

}

}

Chez vous

Dessiner le diagramme de classe UML du Singleton(avec les bonnes associations)

Le S

ingl

eto

n

synchronized ?

« Mémento Singleton »http://thierry-leriche-dessirier.developpez.com/tutoriels/java/design-pattern-mementos/

Factory

Fact

ory

Factory

public enum RaceChienEnum {

LABRADOR("Labrador"),

CANICHE("Faux chien"),

DOBERMAN("Chien méchant");

private final String name;

RaceChienEnum(String name) {

this.name = name;

}

...

}

Fact

ory

public class AnimalFactory {

public Chien getChien(RaceChienEnum race) {

switch (race) {

case CANICHE:

return new Caniche();

case DOBERMAN:

return new Doberman();

case LABRADOR:

return new Labrador();

default:

throw new IllegalArgumentException(

"Race de chien non gérée");

}

}

public Vache getVache(RaceVacheEnum race) {

...

}

}

Façade

Facade

public class CommisDeCuisine {

public Plat cuisiner(String recette) {

Placard placard = Placard.getInstance();

Frigo frigo = Frigo.getInstance();

PlaqueDeCuisson plaque = PlaqueDeCuisson.getInstance();

Poele poele = placard.prendre("poele");

plaque.allumer();

List<Ingredient> ingredients

= frigo.prendre( {"oeuf", "oeuf", "fromage", "beurre"} );

while( plaque.chauffer(poele, ingredients) ) {

// attendre

}

Plat plat = poele.getContenu();

return plat;

}

...

}

pseudo code d’une façade

Faca

de

participant Chef

participant CommisDeCuisine

participant Placard

participant Frigo

participant PlaqueDeCuisson

Chef->CommisDeCuisine: cuisiner

activate CommisDeCuisine

CommisDeCuisine->Placard: prendre

activate Placard

Placard-->CommisDeCuisine: poêle

deactivate Placard

CommisDeCuisine->PlaqueDeCuisson: allumer

activate PlaqueDeCuisson

CommisDeCuisine->Frigo: prendre

activate Frigo

Frigo-->CommisDeCuisine: oeufs, fromage,

beurre

deactivate Frigo

CommisDeCuisine->PlaqueDeCuisson: chauffer

PlaqueDeCuisson-->CommisDeCuisine: cuit_ok

deactivate PlaqueDeCuisson

CommisDeCuisine-->Chef: omelette

deactivate CommisDeCuisine

Podcasts

Les Cast Codeurshttp://lescastcodeurs.com

Le rendez-vous Techhttp://frenchspin.com/fr

niptech / nipdevhttp://nipcast.com

Podcast sciencehttp://www.podcastscience.fm

Outils du managerhttp://www.outilsdumanager.com

Iterator

Iterator

John Marie Lucie Marc Paul

List<String> prenoms = new ArrayList<String>();

prenoms.add( "John" );

prenoms.add( "Marie" );

...

for( int i = 0; i < prenoms.size(); i++ ) {

String prenom = prenoms.get(i);

System.out.println(prenom);

}

Iterator

John Marie Lucie Marc Paul

List<String> prenoms = ...

Iterator<String> iter = prenoms.iterator();

while( iter.hasNext() ) {

String prenom = iter.next();

System.out.println(prenom);

}

for( String prenom : prenoms ) {

System.out.println(prenom);

}

Iterator

public class EnfantQuiCompteIterator

implements Iterator<Integer> {

public final static int NOMBRE_MAX = 100;

public final static int NOMBRE_DEPART = 1;

private int nombre = NOMBRE_DEPART;

public boolean hasNext() {

return nombre < NOMBRE_MAX;

}

public Integer next() {

return ++nombre;

}

Observer

Ob

serv

erpublic enum FeuState {

VERT(60000), // 60 secondes

ORANGE(3000), // 3 secondes

ROUGE(60000); // 60 secondes

private final long duree;

FeuState(long duree) {

this.duree = duree;

}

public FeuState next() {

switch (this) {

case VERT: return ORANGE;

case ORANGE: return ROUGE;

case ROUGE: return VERT;

default: throw new ISE("...");

}

}

Ob

serv

erpublic class FeuTricolor extends Observable

implements Runnable {

private FeuState state;

public FeuState getState() {

return state;

}

@Override

public void run() {

while (true) {

try {

Thread.sleep(state.getDuree());

state = state.next();

notifyObservers(state);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

Observer

public class Conducteur implements Observer {

Voiture voiture = ...

@Override

public void update(Observable obj, Object value) {

if (obj instanceof FeuTricolor) {

FeuState state = (FeuState) value;

if (state == FeuState.VERT) {

voiture.accelerer();

}

}

}

}

JDBC

id name race nb_de_mamelle poids

1 Tigrou labrador 6 45.6

2 Titi caniche 4 6.2

3 Uta labrador 47.1

… … … … …

35 Medor doberman 4 60.0

… … … … …

Table CHIEN

@Override

public List<Labrador> findLabradors() {

List<Labrador> labradors = new ArrayList<Labrador>();

...

return labradors;

}

// (1)

Class.forName("oracle.jdbc.driver.OracleDriver");

// (2)

Connection con

= DriverManager.getConnection("monUrl",

"monLogin", "monPassword");

// (3)

String sql

= "SELECT * FROM chien WHERE race = 'labrador' ";

// (4)

Statement statement = con.createStatement();

// (5)

ResultSet rs = statement.executeQuery(sql);JDBC

select

// (6)

while ( rs.next() ) {

// (7)

String name = rs.getString("name");

double poids = rs.getDouble("poids");

int nbMamelle = rs.getInt("nb_de_mamelle");

// (8)

Labrador labrador = new Labrador();

labrador.setName(name);

labrador.setWeight(poids);

labrador.setNombreMamelle(nbMamelle);

// (9)

labradors.add(labrador);

}

JDBC

selectIterator ?

JDBC

insert

String sql = "INSERT INTO chien "

+ " (name, race, nb_de_mamelle, poids) "

+ " VALUES ( '" + labrador.getName()

+ "', 'labrador', "

+ labrador.getNombreMamelle() + ", "

+ labrador.getWeight() + " )";

Statement stmt = con.createStatement();

stmt.executeUpdate(sql);

JDBC

Insert (PreparedStatement)

String sql = "INSERT INTO chien "

+ " (name, race, nb_de_mamelle, poids) "

+ " VALUES ( ?, 'labrador', ?, ?) ";

PreparedStatement stmt = con.prepareStatement(sql);

stmt.setString( 1, labrador.getName() );

stmt.setInt( 2, labrador.getNombreMamelle() );

stmt.setDouble( 3, labrador.getWeight() );

stmt.executeUpdate(sql);

« Introduction à JPA, application au chargement de données depuis une base MySQL »http://thierry-leriche-dessirier.developpez.com/tutoriels/java/charger-donnees-mysql-jpa-intro/

« JDBI »http://www.jdbi.org/

« Named Parameters for PreparedStatement »http://www.javaworld.com/article/2077706/core-java/named-parameters-for-

preparedstatement.html

« Charger des données depuis une base MySQL en 5 minutes »http://thierry-leriche-dessirier.developpez.com

Ce qu’on a vu en cours et en TD :

• UML ;• Java ;• Tests (TDD, 3T) ;• Design pattern ;• DAO (JDBC / CSV / …) ;• Swing (table model) ;• Story board ;• Maven ;• Subversion/Git ;• Scrum/Kanban ;• etc.

Archive ZIPprojet_GLPOO_ESIEA_2015-2016_groupe-Dupont.zip

Rapport PDFrapport.pdf

Noticenotice.txt

EmailProjet GLPOO ESIEA 2015-2016 groupe Dupont

Thème du projet de GL( EuroMonsters )

Projet( http://www.icauda.com/cours.php )

icauda.com © 1996-2016Tous droits et bases réservés

Reproduction partielle ou complète strictement interdite sans l’autorisation de l’auteur.

Cours

FAQ

Interviews

Articles / tutoriels

Magazine

Forums

News

Agendas

Critiques

13 OOO OOO pages vues par mois

5 500 000 visites par mois

2 500 000 visites uniques par mois

5 000 messages forum par jour

SWING

JButton JRadioButtonJCheckBox

JComboBox JList

JMenu

JTextField JTextArea

JLabel

JFileChooserJTable

JDialog JFrame

JProgressBar

« A Visual Guide to Swing Components »

http://docs.oracle.com/javase/tutorial/ui/features/components.html

http://docs.oracle.com/javase/tutorial/ui/features/compWin.html