• Aucun résultat trouvé

CSC4102: Programmation orient´ee objet en Java et construction de logiciel

N/A
N/A
Protected

Academic year: 2022

Partager "CSC4102: Programmation orient´ee objet en Java et construction de logiciel"

Copied!
36
0
0

Texte intégral

(1)

CSC4102: Programmation orient´ee objet en Java et construction de logiciel

Denis Conan, avec Christian Bac

Janvier 2022

(2)

Sommaire

1. Motivations et objectifs de la s´ eance 2. Retours sur l’h´ eritage

3. Classe param´ etr´ ee (par un type)

4. ´ Enum´ eration, annotation, argument variadique 5. Visibilit´ e, ´ egalit´ e et hachage

6. Biblioth` eque, avec l’exemple des collections 7. Construction de logiciel avec Maven 8. Mise en pratique en TP (2h) + HP (3h)

2/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(3)

1 Motivations et objectifs de la s´ eance

1.1 Contexte — O` u en sommes-nous ?

1.2 Qui demande ` a outiller la construction du logiciel ? 1.3 Quels sont les objectifs de la s´ eance ?

3/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(4)

1.1 Contexte — O` u en sommes-nous ?

■ Mise en place du processus de construction du logiciel

■ Premi` ere ´ ebauche des classes (sans les exceptions et sans les tests)

■ A venir dans la s´ ` eance 6

• Gestion des cas d’erreur avec les exceptions

• Programmation des tests unitaires et de validation

Spécification Comprendre les

besoins, décrire le

Conception détaillée Expression des besoins

S’accorder sur les fonctionnalités du système

QUOI du système

Détailler le COMMENT pour un langage de programmation donné

Préparation...

Codage

des tests ...Exécution

Tests unitaires Pour un objet, chaque opération fonctionne−t−elle correctement ? Tests d’intégration

Tests de validation

Les différentes parties du logiciel fonctionnent−elles correctement ensemble ?

Le système est−il conforme au cahier des charges ? Le système est−il conforme à la spécification ? Recette

Logiciel Cahier des charges

Conception préliminaire S’accorder sur le COMMENT

de construction du système

fonctionnalités et tests

Objet de la séance

4/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(5)

1.2 Qui demande ` a outiller la construction du lo- giciel ?

Un ´ editeur de texte comme emacs ou un environnement de d´ eveloppement comme Eclipse ne suffisent-ils pas ?

Section 42 de «

The Pragmatic Programmer : From journeyman to master

»

[Hunt and Thomas, 2000]

We were once at a client where all the developers were using the same IDE.

Their system administrator gave each developer a set of instructions on installing add-on packages to the IDE.

These instructions filled many pages—pages full of click here, scroll there, drag this, double-click that, and do it again [...]

IDEs have their advantages, but with IDEs alone it can be hard to achieve the level of automation that we are looking for.

We want to check out, build, test, and ship with a single command.

■ Dans ce module, nous utilisons Maven + GitLab CI

• Pour construire notre application et la tester ` a chaque commande git push

5/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(6)

1.3 Quels sont les objectifs de la s´ eance ?

■ En chemin vers un premier noyau fonctionnel de l’application

• Programmation des classes

− Attributs et op´ erations des premiers cas d’utilisation

• Uniquement ceux qui sont n´ ecessaires pour la r´ ealisation des cas d’utilisation du Sprint 1

− Ce cours : programmation sans prise en compte des cas d’erreurs

■ Outillage de la construction du logiciel

Etude de ´ Maven : squelette de configuration fourni au d´ emarrage du d´ epˆ ot

− Nous faisons le « pari » que nous gagnerons du temps ensuite

• « Let the computer do the repetitions, the mundane—it will do a better job of it than we would. We’ve got more important and more difficult things to do. »

[Hunt and Thomas, 2000]

6/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(7)

2 Retours sur l’h´ eritage

2.1 Transtypage

2.2 Red´ efinition (en anglais, overriding ) 2.3 Classes abstraites

2.4 Interfaces

7/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(8)

2.1 Transtypage

■ Vers le haut (en anglais, upcast) = implicite : une r´ ef´ erence d’une classe T peut r´ ef´ erencer toute instance de la classe T ou de ses classes enfants

■ Vers le bas (en anglais, downcast) = explicite : une r´ ef´ erence d’une classe S d´ eriv´ ee d’une classe T peut recevoir une r´ ef´ erence de la classe T si et seulement si :

L’objet r´ ef´ erenc´ e est autoris´ e : bien du type S ou d’un de ses types d´ eriv´ es

• Le changement de type est explicite vers le nouveau type

Classeseance5.mediathequesimplifiee.transtypage.ExempleTranstypage 1 D o c u m e n t doc = n u l l;

2 A u d i o a u d i o =n e w A u d i o ( " 3 " , " R o c k ␣ b o t t o m " , " R o b e r ␣ W y a t t " , " 73 " , " P r o g r e s s i f " ) ; 3 doc = a u d i o ; // t r a n s t y p a g e v e r s le haut , u p c a s t

4 S y s t e m . out . p r i n t l n ( " doc ␣ est ␣ un ␣ D o c u m e n t ␣ : ␣ " + ( doc i n s t a n c e o f D o c u m e n t ) 5 + " ; ␣ doc ␣ est ␣ un ␣ A u d i o ␣ : ␣ " + ( doc i n s t a n c e o f A u d i o ) ) ;

6 a u d i o = ( A u d i o ) doc ; // t r a n s t y p a g e v e r s le bas , d o w n c a s t

7 S y s t e m . out . p r i n t l n ( " a u d i o ␣ est ␣ un ␣ D o c u m e n t ␣ : ␣ " +( a u d i o i n s t a n c e o f D o c u m e n t ) 8 + " ; ␣ a u d i o ␣ est ␣ un ␣ A u d i o ␣ : ␣ " + ( a u d i o i n s t a n c e o f A u d i o ) ) ;

doc est un Document : true; doc est un Audio : true audio est un Document : true; audio est un Audio : true

8/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(9)

2.2 Red´ efinition (en anglais, overriding )

■ Red´ efinition possible des m´ ethodes publiques ou prot´ eg´ ees h´ erit´ ees

• C’est le principe de substitution de Liskov&Wing (polymorphisme d’inclusion)

Mettre l’annotation@Override= v´erification du prototype par le compilateur

■ Quelle m´ ethode est appel´ ee ? = ⇒ liaison dynamique

Red´ efinition la plus proche dans l’arbre d’h´ eritage de la classe actuelle

Classeseance5.mediathequesimplifiee.liaisontardive.ExempleLiaisonTardive

1 D o c u m e n t doc = n e w D o c u m e n t ( " C 0 0 7 " , " Le ␣ s e i g n e u r ␣ des ␣ a n n e a u x " , " T o l k i e n " ,

" 1 9 5 0 " ) ;

2 A u d i o a u d i o = n e w A u d i o ( " C 0 0 3 " , " R o c k ␣ b o t t o m " , " R o b e r ␣ W y a t t " , " 1 9 7 3 " , "

P r o g r e s s i f " ) ;

3 S y s t e m . out . p r i n t l n ( doc . t o S t r i n g () ) ; 4 S y s t e m . out . p r i n t l n ( a u d i o . t o S t r i n g () ) ;

5 doc = a u d i o ; // t r a n s t y p a g e v e r s le haut , t y p e f o r m e l / a c t u e l = D o c u m e n t / A u d i o 6 S y s t e m . out . p r i n t l n ( doc . t o S t r i n g () ) ; // a p p e l de t o S t r i n g de A u d i o

Document[code=C007, titre=Le seigneur des anneaux, auteur=Tolkien, annee=1950, empruntable=false, emprunte=false, nbEmprunts=0]

Audio[classification=Progressif, toString()=Document[code=C003, titre=Rock bottom, auteur=Rober Wyatt, annee=1973, empruntable=false, emprunte=false, nbEmprunts=0]]

Audio[classification=Progressif, toString()=Document[code=C003, titre=Rock bottom, auteur=Rober Wyatt, annee=1973, empruntable=false, emprunte=false, nbEmprunts=0]]

9/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(10)

2.3 Classes abstraites

classification:string nbEmpruntsTotal:integer=0

Audio Vidéo

nombrePage:integer Livre nbEmpruntsTotal:integer=0 DURÉE:integer=6*7 TARIF:double=0.5 TARIF:double=1.0

DURÉE:integer=4*7

duréeFilm:integer mentionLégale:string nbEmpruntsTotal:integer=0 DURÉE:integer=2*7 TARIF:double=1.5 code:string

titre:string auteur:string année:string empruntable:booléen=F /emprunté:booléen=F nbEmprunts:integer=0

<<abstract>> dureeEmprunt() : double

<<abstract>> tarifEmprunt() : double

<<abstract>>

Document

■ Classe abstraite Document qui

ne peut pas ˆ etre instanci´ ee

Raison 1 :

on ne veut pas d’instance

Raison 2 :

des m´ ethodes ne sont pas d´ efinies

■ Sp´ ecialisation n´ ecessaire jusqu’` a obtenir des classes instanciables

• P.ex. la classe Audio

= ⇒ La classe abstraite impose un comportement commun ` a toutes les classes enfants

■ Possibilit´ e de cr´ eer des tableaux ou des collections de r´ ef´ erences de type de la classe abstraite

10/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(11)

2.3.1 Exemple de classe abstraite

Classeseance5.mediathequesimplifiee.classeabstraite.Document 1 p u b l i c a b s t r a c t c l a s s D o c u m e n t {

2 // ...

3 p u b l i c b o o l e a n e m p r u n t e r () {

4 e m p r u n t e = t r u e; g e n r e . e m p r u n t e r () ; n b E m p r u n t s ++; r e t u r n t r u e; } 5 p u b l i c a b s t r a c t i n t d u r e e E m p r u n t () ; // non d e f i n i e

6 p u b l i c a b s t r a c t d o u b l e t a r i f E m p r u n t () ; // non d e f i n i e

7 // ...

Classeseance5.mediathequesimplifiee.classeabstraite.Audio

1 // ...

2 @ O v e r r i d e // r e d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e

3 p u b l i c b o o l e a n e m p r u n t e r () { s u p e r. e m p r u n t e r () ; n b E m p r u n t s T o t a l ++; r e t u r n t r u e; }

4 @ O v e r r i d e // d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e 5 p u b l i c i n t d u r e e E m p r u n t () { r e t u r n D U R E E ; } 6 @ O v e r r i d e // d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e 7 p u b l i c d o u b l e t a r i f E m p r u n t () { r e t u r n T A R I F ; }

8 // ...

11/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(12)

2.4 Interfaces

Document

<<abstract>>

code:string titre:string auteur:string année:string empruntable:booléen=F /emprunté:booléen=F nbEmprunts:integer=0

classification:string nbEmpruntsTotal:integer=0

Audio Vidéo

TARIF:double=1.0 DURÉE:integer=4*7

duréeFilm:integer mentionLégale:string nbEmpruntsTotal:integer=0 DURÉE:integer=2*7 TARIF:double=1.5

nombrePage:integer Livre nbEmpruntsTotal:integer=0 DURÉE:integer=6*7 TARIF:double=0.5

Empruntable<<interface>>

dureeEmprunt() : Integer tarifEmprunt() : Double

■ Les membres d’une interface sont principalement

1

des m´ ethodes abstraites

■ Une interface est d´ eclar´ ee avec le mot r´ eserv´ e interface

■ Une interface peut h´ eriter (extends) de plusieurs interfaces

■ Une classe peut impl´ ementer (implements) une ou plusieurs interfaces

• Rappel : une classe n’h´ erite (extends) que d’une seule classe

1. Depuis la version 5, possibilit´ e de d´ efinir des constantes (public +

final), et depuis la

version 8, possibilit´ e de d´ efinir des

default methods

ainsi que des m´ ethodes

static

12/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(13)

2.4.1 Exemple d’interface

Interfaceseance5.mediathequesimplifiee.exempleinterface.Empruntable 1 p u b l i c i n t e r f a c e E m p r u n t a b l e {

2 i n t d u r e e E m p r u n t () ; // d e f i n i t i o n d ’ un p r o t o t y p e ( c o n t r a t ) 3 d o u b l e t a r i f E m p r u n t () ; // d e f i n i t i o n d ’ un p r o t o t y p e ( c o n t r a t ) 4 }

Classeseance5.mediathequesimplifiee.exempleinterface.Document

1 p u b l i c a b s t r a c t c l a s s D o c u m e n t i m p l e m e n t s E m p r u n t a b l e { // i m p l e m e n t a t i o n

Classeseance5.mediathequesimplifiee.exempleinterface.Audio 1 p u b l i c f i n a l c l a s s A u d i o e x t e n d s D o c u m e n t { // h e r i t a g e

2 // ...

3 @ O v e r r i d e // r e s p e c t du p r o t o t y p e de l ’ i n t e r f a c e 4 p u b l i c i n t d u r e e E m p r u n t () { r e t u r n D U R E E ; } 5 @ O v e r r i d e // r e s p e c t du p r o t o t y p e de l ’ i n t e r f a c e 6 p u b l i c d o u b l e t a r i f E m p r u n t () { r e t u r n T A R I F ; }

7 // ...

13/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(14)

3 Classe param´ etr´ ee (par un type)

■ Polymorphisme param´ etrique ; generics dans la terminologie JAVA

Opération générique Attribut générique Paramètre de type

élément : E taille : Integer premierÉlément : E dernierÉlément : E

ajouter(E) estPrésent(E) retirer(E)

ListeDeChoses E

■ Param` etre de type = classe associ´ ee ` a la classe des objets manipul´ es

■ Classe associ´ ee sp´ ecifi´ ee entre « <> »

P.ex. ArrayList<String> myStringArray = new ArrayList<>();

14/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(15)

4 ´ Enum´ eration, annotation, argument variadique

■ Enum´ ´ eration = type ´ enum´ er´ e en JAVA

Classeseance5.enumeration.Dimension 1 p u b l i c e n u m D i m e n s i o n { A4 , A5 , L E T T E R ; }

■ Annotation = sucre syntaxique associant des m´ eta-donn´ ees ` a un ´ el´ ement

• Nom introduit par « @ » avec possiblement des arguments (nom=valeur)

• Annotations standards

@Override

: utilis´ ee par le compilateur pour v´ erifier l’invariance des prototypes lors de la red´ efinition de m´ ethode

− @Deprecated : utilis´ ee par JavaDoc pour d´ econseiller l’utilisation de la m´ ethode

− @SuppressWarnings : utilis´ ee par le compilateur pour ne pas g´ en´ erer les avertissements concernant l’´ el´ ement annot´ e

Dans la s´ eance 6, les annotations de JUnit

■ Argument variadique en JAVA

Classeseance5.argumentvariadique.ExempleVarArg 1 p r i v a t e s t a t i c S t r i n g f o r m a t (f i n a l S t r i n g ... s t r i n g s ) {

2 O b j e c t s . r e q u i r e N o n N u l l ( s t r i n g s ) ; 3 var r e s u l t = n e w S t r i n g B u f f e r () ;

4 f o r ( S t r i n g s t r i n g : s t r i n g s ) { r e s u l t . a p p e n d ( " ␣ " ) . a p p e n d ( s t r i n g ) ; } 5 r e t u r n r e s u l t . t o S t r i n g () ; }

15/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(16)

5 Visibilit´ e, ´ egalit´ e et hachage

5.1 Visibilit´ e des attributs et des op´ erations 5.2 ´ Egalit´ e de contenu — M´ ethode equals 5.3 Hachage — M´ ethode hashCode

16/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(17)

5.1 Visibilit´ e des attributs et des op´ erations

package p2;

class C4 extends C1 { ...

} class C5 {

...

} package p1;

class C1 { public int a;

}

class C2 extends C1 { ...

} class C3 {

...

}

protected int b;

int c; // package private int d;

private

= seule la classe courante

package

= private + classes du paquetage

package par d´ efaut

protected

=

package

+ classes enfants

public

= toutes les classes

a b c d

Accessible de C2 oui oui oui – Accessible de C3 oui oui oui – Accessible de C4 oui oui – – Accessible de C5 oui – – –

17/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(18)

5.2 ´ Egalit´ e de contenu — M´ ethode equals

´ Egalit´ e de r´ ef´ erence Versus ´ egalit´ e de contenu d’objet

■ o1 == o2 = r´

ef´ erences ´ egales

(mˆ eme objet en m´ emoire)

■ o1.equals(o3) = contenus ´

egaux

(objets peut-ˆ etre diff´ erents en m´ emoire)

o1

o2

o3

21/02/11

21/02/11

Classeseance5.collections.ExempleCalendarEquals

1 D a t e i n i t i a l = C a l e n d a r . g e t I n s t a n c e () . g e t T i m e () ; // v a l e u r i n i t i a l e 2 C a l e n d a r o1 = C a l e n d a r . g e t I n s t a n c e () ; o1 . s e t T i m e ( i n i t i a l ) ;

3 C a l e n d a r o2 = o1 ; // e g a l i t e de r e f e r e n c e 4 C a l e n d a r o3 = // m e m e v a l e u r i n i t i a l e

5 C a l e n d a r . g e t I n s t a n c e () ; o3 . s e t T i m e ( i n i t i a l ) ; 6 S y s t e m . out . p r i n t l n ( " o1 ␣ == ␣ o2 ␣ : ␣ " + ( o1 == o2 )

7 + " ,\ t " + " o1 . e q u a l s ( o2 ) ␣ : ␣ " + ( o1 . e q u a l s ( o2 ) ) ) ; 8 S y s t e m . out . p r i n t l n ( " o1 ␣ == ␣ o3 ␣ : ␣ " + ( o1 == o3 )

9 + " ,\ t " + " o1 . e q u a l s ( o3 ) ␣ : ␣ " + ( o1 . e q u a l s ( o3 ) ) ) ; Traces d’ex´ecution :

o1 == o2 : true, o1.equals(o2) : true o1 == o3 : false, o1.equals(o3) : true

18/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(19)

5.2.1 M´ ethode equals avec instanceof

Classeseance5.mediathequesimplifiee.equalshashcode.ClientAvecInstanceof 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;

2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;

3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;

M´ethodeequals(´egalit´e de contenu) :

clients « ´ egaux » = mˆ

emes noms et mˆ emes pr´ enoms

1 @ O v e r r i d e // D e f a u l t i m p l e m e n t a t i o n in O b j e c t is ( t h i s == obj ) 2 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // G e n e r a t e d w i t h E c l i p s e 3 if ( obj == n u l l) { r e t u r n f a l s e; }

4 if (t h i s == obj ) { r e t u r n t r u e; }

5 if (!( obj i n s t a n c e o f C l i e n t A v e c I n s t a n c e o f ) ) { r e t u r n f a l s e; } 6 C l i e n t A v e c I n s t a n c e o f c = ( C l i e n t A v e c I n s t a n c e o f ) obj ;

7 r e t u r n ( nom . e q u a l s ( c . nom ) && p r e n o m . e q u a l s ( c . p r e n o m ) ) ;

8 }

■ Dans Eclipse , menu Source puis Generate hashCode() and equals()

• Lors de la g´ en´ eration, cocher la case « Use “instanceof” to compare types » . Comme sugg´ er´ e par J. Bloch

[Bloch, 2008]

, notre pr´ ef´ erence va ` a cette fac ¸on de faire, c’est-` a-dire equals mis en œuvre avec instanceof

19/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(20)

5.2.2 M´ ethode equals avec getClass

Classeseance5.mediathequesimplifiee.equalshashcode.ClientAvecGetClass 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;

2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;

3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;

M´ethodeequals(´egalit´e de contenu) :

clients « ´ egaux » = mˆ

emes noms et mˆ emes pr´ enoms

1 @ O v e r r i d e // D e f a u l t i m p l e m e n t a t i o n in O b j e c t is ( t h i s == obj ) 2 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // G e n e r a t e d w i t h E c l i p s e 3 if ( obj == n u l l) { r e t u r n f a l s e; }

4 if (t h i s == obj ) { r e t u r n t r u e; }

5 if ( g e t C l a s s () != obj . g e t C l a s s () ) { r e t u r n f a l s e; } 6 C l i e n t A v e c G e t C l a s s c = ( C l i e n t A v e c G e t C l a s s ) obj ; 7 r e t u r n ( nom . e q u a l s ( c . nom ) && p r e n o m . e q u a l s ( c . p r e n o m ) ) ;

8 }

■ Dans Eclipse , menu Source puis Generate hashCode() and equals()

20/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(21)

5.3 Hachage — M´ ethode hashCode

■ M´ ethode utilis´ ee pour calculer un indice dans certaines collections, plus pr´ ecis´ ement les dictionnaires

■ Contrat de base :

• Doit retourner la mˆ eme valeur lorsqu’elle est appel´ ee plusieurs fois sur le mˆ eme objet

∀o

1

, o

2

: o

1

.equals(o

2

) = o

1

.hashCode() = o

2

.hashCode()

− La contrapos´ ee n’est pas vraie

• Peut retourner la mˆ eme valeur pour deux objets diff´ erents

• C’est la limite du hachage

Espace des objets

Espace des entiers du hachage

21/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(22)

5.3.1 Exemple hashCode

Classeseance5.mediathequesimplifiee.equalshashcode.Client 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;

2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;

3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;

M´ethodehashCode:

mˆ emes attributs que ceux utilis´ es dans equals

(nom,pr´enom)

1 p u b l i c i n t h a s h C o d e () { // G e n e r a t e d w i t h E c l i p s e 2 f i n a l i n t p r i m e = 37 , m a g i c = 17;

3 i n t r e s u l t = m a g i c ;

4 if ( nom != n u l l) { r e s u l t += nom . h a s h C o d e () ; }

5 if ( p r e n o m != n u l l) { r e s u l t = p r i m e * r e s u l t + p r e n o m . h a s h C o d e () ; } 6 r e t u r n r e s u l t ;

7 }

■ Algorithme utilis´ e par Eclipse = celui de J. Bloch

[Bloch, 2008]

Dans Eclipse, menu Source puis Generate hashCode() and equals()

22/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(23)

6 Biblioth` eque, avec l’exemple des collections

6.1 Organisation des biblioth` eques 6.2 Quelques interfaces

6.3 Quelques classes concr` etes

6.4 Algorithmes dans la classe Collections 6.5 Dictionnaires Map<K,V>

6.6 Structure d’une HashMap, equals et hashCode 6.7 Parcours de collections

23/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(24)

6.1 Organisation des biblioth` eques

■ P.ex. les collections pour les associations avec des multiplicit´ es ̸= 0..1

■ Conceptuellement, une biblioth` eque = + Interface = types de donn´ ees abstraits

− Les interfaces constituent un standard de fait du langage + Classes concr` etes = structures de donn´ ees

− Les classes concr` etes sont les mises en œuvre de r´ ef´ erence

− Possibilit´ e de construire de nouvelles mises en œuvre + Algorithmes = m´ ethodes de classe pour trouver, trier, etc.

− M´ ethodes polymorphiques, donc applicables ` a beaucoup de classes concr` etes

. Autres langages :

C++ Standard Template Library

(STL),

Smalltalk’s collection hierarchy

24/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(25)

6.2 Quelques interfaces

Pour boucle « for−each » avec méthode forEach()

Tri sur la clé List<E>

<<interface>>

add(E) : boolean

<<interface>>

Collection<E>

: boolean

addAll(Collection <? extends E>) clear()

contains(Object) : boolean isEmpty() : boolean iterator() : Iterator<E>

remove(Object) : boolean removeAll(Collection<?>) : boolean size() : int

Map<K,V>

<<interface>>

Iterable<E>

<<interface>>

add(E) : boolean

toArray(T[]) : <T> [T]

Set<E>

<<interface>>

SortedMap<K,V><<interface>>

SortedSet<E><<interface>>

■ List<E> avec doublons possibles (liste), Set<E> sans doublon (ensemble)

■ Map<K,V> apparie une cl´ e (k ∈ K ) et un objet (v ∈ V ) (dictionnaire)

La cl´ e k indentifie de fac ¸on unique v

■ Toutes les interfaces sont param´ etr´ ees avec un ou plusieurs types

■ Certaines m´ ethodes sont dites optionnelles dans la documentation

• Une classe concr` ete peut ne pas « supporter » des m´ ethodes optionnelles.

Dans ce cas, la mise en œuvre l` eve l’exception UnsupportedOperationException

25/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(26)

6.3 Quelques classes concr` etes

■ Diff´ erentes cat´ egories de classes concr` etes

• Mises en œuvre de base

• Mises en œuvre pour la concurrence d’acc` es (cf. java.util.concurrent)

• Mises en œuvre sp´ ecifiques, p.ex. avec tri des ´ el´ ements

■ Uniquement trois mises en œuvre de base n´ ecessaires dans ce module

• Pour les collections de petite taille, ArrayList ≡ tableau de taille dynamique

• Pour les collections de grande taille, HashMap ≡ dictionnaire

• Pour les petites collections, TreeSet ≡ Ensemble tri´ e

26/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel La classe E doit implémenter Comparable<E>

+

Pas de méthode get get(int index) : E

<<interface>>

List<E>

add(int, E) indexOf(E) : int lastIndexOf(E) : int remove(int index) set(int index, E newE) : E subList(int from, int to) : List<E>

AbstractList<E><<abstract>>

ArrayList<E>

<<interface>>

Set<E>

AbstractSet<E><<abstract>>

TreeSet<E>

add(int, E) remove(int index)

SortedSet<E>

<<interface>>

containsKey(K) : boolean

<<interface>>

Map<K,V>

containsValue(V) : boolean get(Object) : V put(K, V) : V replace(K, V) : V entrySet() : Set<Map.Entry<K,V>

HashMap<K,V>

(27)

6.4 Algorithmes dans la classe Collections

■ sort : tri d’une liste (merge sort

algorithm)

■ reverse : r´ eordonne en sens inverse

■ fill : remplissage avec un ´ el´ ement donn´ e

■ copy : d’une liste ` a une autre

■ swap : permuter deux ´ el´ ements donn´ es

■ addAll : ajouter tous les ´ elements d’une liste

■ binarySearch : pour trouver un

´ el´ ement

■ frequency : compte le nombre d’occurrences

■ disjoint : pas d’´ el´ ements en commun

■ min et max : selon l’op´ erateur de tri

■ shuffle : m´ elange al´ eatoire des

´ el´ ements

Classeseance5.collections.ExempleTriListe 1 i m p o r t j a v a . u t i l . A r r a y s ;

2 i m p o r t j a v a . u t i l . C o l l e c t i o n s ; 3 i m p o r t j a v a . u t i l . L i s t ; 4 p u b l i c c l a s s E x e m p l e T r i L i s t e {

5 p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) {

6 List < String > l i s t e = A r r a y s . a s L i s t (n e w S t r i n g [] { " x " , " d " , " e " , " d " }) ; 7 C o l l e c t i o n s . s o r t ( l i s t e ) ; // m e t h o d e g e n e r i q u e de tri sur une l i s t e 8 S y s t e m . out . p r i n t l n ( l i s t e ) ;

9 }

10 }

27/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(28)

6.5 Dictionnaires Map<K,V>

■ La classe associ´ ee ` a la cl´ e doit red´ efinir les m´ ethodes hashCode() et equals()

Si la cl´ e d’une classe contient plusieurs attributs

alors il faut cr´ eer une classe pour rassembler ces attributs

2

(concept de n-uplet)

Classeseance5.collections.ClefClient

1 p u b l i c f i n a l c l a s s C l e f C l i e n t { 2 p r i v a t e S t r i n g nom ;

3 p r i v a t e S t r i n g p r e n o m ;

4 p u b l i c C l e f C l i e n t (f i n a l S t r i n g n , f i n a l S t r i n g p ) { t h i s. nom = n ; t h i s. p r e n o m = p ; }

5 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // . . .

6 }

7 p u b l i c i n t h a s h C o d e () { // . . .

8 }

Classeseance6.mediathequesimplifiee.pourlestests.Mediatheque 1 p r i v a t e Map < C l e f C l i e n t , Client > l e s C l i e n t s ;

2 l e s C l i e n t s = n e w H a s h t a b l e < C l e f C l i e n t , Client >() ;

3 C l e f C l i e n t hc = n e w C l e f C l i e n t ( cl . g e t N o m () , cl . g e t P r e n o m () ) ;

2. Sinon, besoin de cr´ eer des objets factices pour obtenir un ´ el´ ement

28/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(29)

6.6 Structure d’une HashMap, equals et hashCode

Classeseance5.collections.ExempleHashMap 1 Map < String , String > hm = n e w HashMap < >() ;

2 hm . put ( " Ba " , " Bah " ) ; hm . put ( " Aa " , " aha " ) ; hm . put ( " BB " , " b e b e " ) ; 3 f o r ( Entry < String , String > e : hm . e n t r y S e t () ) {

4 S y s t e m . out . p r i n t l n ( e . g e t K e y () + " ␣ ( " + e . g e t V a l u e () . h a s h C o d e () + " ) ␣ : ␣ " + e . g e t V a l u e () ) ; }

Traces d’ex´ ecution

Clef hashCode() : Valeur Aa (2112) : aha BB (2112) : bebe Ba (2143) : Bah

Bebe Aha

Bah 2112 2143

BB

Aa Ba

■ Recherche d’une valeur v ` a partir d’une cl´ e k :

1. hashCode(k) donne l’ensemble des cl´ es ayant mˆ eme valeur de hachage 2. equals(k) donne la bonne cl´ e, puis la valeur v

29/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(30)

6.7 Parcours de collections

■ Construction for-each : utilise implicitement un it´ erateur

Pas d’acc` es ` a l’it´ erateur = pas de suppression d’´ el´ ement dans la boucle

Classeseance5.collections.ExempledeParcoursDeCollection

1 f o r ( Entry < String , Integer > e n t r y : d i c t i o n n a i r e . e n t r y S e t () ) {

2 S y s t e m . out . p r i n t ( e n t r y . g e t K e y () + " - > " + e n t r y . g e t V a l u e () + " , ␣ " ) ; 3 // d i c t i o n n a i r e . r e m o v e ( e n t r y . g e t K e y () ) ; //= > e x c e p t i o n C o n c u r r e n t M o d i f ...

4 }

■ Construction avec while et un it´ erateur explicite

hasNext() : retourne vrai si l’it´ erateur contient encore une ´ el´ ement

next() : retourne l’´ el´ ement suivant

remove() : supprime le dernier ´ el´ ement retourn´ e par next() de la collection

3

Classeseance5.collections.ExempledeParcoursDeCollection 1 I t e r a t o r < String > i t E l e m = l i s t e . i t e r a t o r () ; 2 w h i l e ( i t E l e m . h a s N e x t () ) { // i t e r a t e u r e x p l i c i t e

3 S t r i n g e l e m = i t E l e m . n e x t () ; S y s t e m . out . p r i n t ( e l e m + " , ␣ " ) ; 4 i t E l e m . r e m o v e () ; // s u p p r e s s i o n p o s s i b l e

5 }

■ Cf. ...ExempledeParcoursDeCollection pour des exemples de parcours

3. Possible, mais un peu dangereux et ` a ´ eviter

30/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(31)

7 Construction de logiciel avec Maven

7.1 Motivations — Pourquoi Maven ? 7.2 D´ epˆ ot et arborescence standard

7.3 Processus de construction, version simplifi´ ee

. https://maven.apache.org et

http://books.sonatype.com/mvnex-book/reference/index.html

31/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(32)

7.1 Motivations — Pourquoi Maven ?

■ Toujours le mˆ eme processus de construction : javac, javadoc, jar, etc.

■ Logiciels d´ ecompos´ es en de multiples modules

■ Le casse-tˆ ete des d´ ependances

xerces

aval

dom4j

asm

xstream dream−annotation

junit julia−runtime dtdparser

julia−asm

fractal−spoonlet

spoon−core log4j

eclipse.jdt.core jsap ant fractal−adl

fractal−rmi dream−adl

dream−core

julia−mixins fscript

antlr

cosmos−core

cosmos−lib saje

cosmos−saje

fractal−util

task−deployment

task−framework

ast−core

monolog−api fractal−api

perseus−cache easymock

jdom joda−time

xml−writer stax wstw−asl

stax−api xom xpp3_min cglib_nodep

jettison jmock

oro commons−lang

■ Am´ elioration par rapport ` a make et Ant (Cf. « Pour aller plus loin »)

32/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(33)

7.2 D´ epˆ ot et arborescence standard

■ D´ epˆ ots (Repositories)

• Beaucoup de d´ epˆ ots sont disponibles

− P.ex. http://search.maven.org/ ou https://mvnrepository.com/

epˆ ot local dans le r´ epertoire: ˜/.m2/repository

− Peupl´ e comme un cache des d´ epˆ ots distants

■ Arborescence standard — version simplifi´ ee

pom.xml: POM (Project Object Model ), toujours au niveau le plus ´ elev´ e

• D´ eclaration de configuration du processus de construction du module

• LICENSE.txt et README.md

src/main/java: code source du module

src/test/java: code source des tests du module

target: tous les contenus g´ en´ er´ es (*.class, *.jar, site Web...)

33/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(34)

7.3 Processus de construction, version simplifi´ ee

jar:jar

test surefire:test

install:install

deploy:deploy process−test−resources resources:testResources

test−compile compiler:test−compile

package

install

deploy compile

process−resources

compiler:compile resources:resources PHASES PLUGINS:GOALS

34/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(35)

8 Mise en pratique en TP (2h) + HP (3h)

■ Etude du module ´ Maven pr´ epar´ e, cr´ eation du projet Eclipse

D´ ecouverte de la biblioth` eque eu.telecomsudparis.csc4102.util (dates, console)

■ D´ ebut de la programmation de l’application

• Classes, attributs, constructeurs, m´ ethodes invariant()

• Au besoin, m´ ethodes equals et hashCode, voire toString

• On programme des cas d’utilisation (algo. des m´ ethodes dans les diagrammes de s´ equences)

− Et non « une classe compl` ete, puis une autre, etc. »

■ Rendu de la s´ eance en HP (3h): PDF + JAVA, dans « sprint1 »

• Le script de fin de s´ eance v´ erifie que le code de votre projet compile

■ Compl´ ements « Pour aller plus loin » sur la construction de logiciel avec

Maven

35/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

(36)

ef´ erences I

Bloch, J. (2008).

Effective Java, 2nd Edition.

Addison-Wesley.

Hunt, A. and Thomas, D. (2000).

The Pragmatic Programmer: From journeyman to master.

Addison-Wesley.

Maven (2016).

Apache Maven Project.

https://maven.apache.org.

O’Brien, T., Brian, J., van Zyl, J., Xu, J., Locher, T., Fabulich, D., Redmond, E., and Snyder, B. (2016).

Maven by Example.

http://books.sonatype.com/mvnex-book/reference/index.html.

Creative Commons License.

36/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel

Références

Documents relatifs

• Chaque classe enveloppe poss`ede des m´ethodes pour extraire la valeur d’un objet : primitifValue() appliqu´ee sur l’objet enveloppe renvoie une valeur de type primitif.. •

• Chaque classe enveloppe poss`ede des m´ethodes pour extraire la valeur d’un objet : primitifValue() appliqu´ee sur l’objet enveloppe renvoie une valeur de type primitif.. •

− d’appliquer des patrons (motifs) de conception et de programmation (idiomes) donn´ es dans le but d’am´ eliorer la qualit´ e du logiciel 2.. Qualit´ e logicielle et

3/30 01/2022 Denis Conan CSC4102 : Programmation JAVA — exceptions et tests... Thomas, « The Pragmatic Programmer » [Hunt and

5/32 01/2022 Denis Conan CSC4102 : Qualit´ e du code JAVA et introduction aux idiomes JAVA.?. 1.3 Quels sont les objectifs de la

3/38 01/2022 Denis Conan CSC4102 : Lambda expressions, Streams et Optional.?. 1.1 Qui demande de la programmation

• Membres (variables et méthodes) déclarés avec une visibilité privée ne peuvent être référencées par leur nom dans une classe fils. • Ils peuvent être

• Si la classe Rect est derivée de la classe Shape, une operation qui peut être exécutée sur un objet de la classe Shape peut aussi être exécutée sur un objet de la classe