Upload
trinhbao
View
213
Download
0
Embed Size (px)
Citation preview
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
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. »
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
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 qui implémente l’interface Mammifere
Fleche avec trait plein
Fleche avec trait en pointillé
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;
}
...
}
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
[Telecommande|-touches|+getTouches();+setTouches();]++1-
1..*>[Touche|-telecommande|+getTelecommande();
setTelecommande();]
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) {
...
}
}
Laver la vaisselle en machine
Graphes avec Visual Paradigm (community edition) pour Eclipsehttp://www.visual-paradigm.com/
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)
Laver la vaisselle en machine (encore) Diagramme très proche de l’état-transitions
Etat (adjectif)
Action (verbe)
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/
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
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/
Tests
A la découverte de Junit
« Les Tests en Trois Temps »icauda.com/articles.html#3t
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.
« 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
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
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
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
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
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/
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
• Travail à distance ?• Echanges de fichiers (nombreux) dans tous les sens ?• Versions des fichiers ?• Sauvegardes ?• Conflits sur des modifications parallèles ?
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.
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.
Git process
merge fetch
commit push
Tutoriel Git chez Atlassian : https://www.atlassian.com/fr/git/tutorial
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.
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) {
...
}
}
« Mémento Singleton »http://thierry-leriche-dessirier.developpez.com/tutoriels/java/design-pattern-mementos/
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) {
...
}
}
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
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;
}
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();
}
}
}
}
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
icauda.com © 1996-2016Tous droits et bases réservés
Reproduction partielle ou complète strictement interdite sans l’autorisation de l’auteur.
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
« 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