Vous êtes sur la page 1sur 15

Corrigé et Barème Contrôle de connaissances 2011/2012

des étudiants de 2è année (EI2)

CSC4002 : Contrôle Final Session 1

Date : jeudi 26 janvier 2012 — Durée : 1H30

Coordonnateurs : Christian Bac et Denis Conan

Les seuls documents autorisés sont ceux distribués en cours / BE / TP et mis à disposition
sur le site Web du module, ainsi que vos notes personnelles.

Notes en préambule :
— le travail doit se faire individuellement ;
— n’oubliez pas d’indiquer votre nom sur chaque feuille rendue ;
— soyez concis et précis, et justifiez vos réponses par des commentaires appropriés ;
— soyez rigoureux dans la syntaxe JAVA ;
— veillez à rendre une copie propre et lisible.
CF1 2011–2012

1 Étude de cas « Notes de frais »


Nous proposons l’analyse du cas d’étude « Note de frais » que nous présentons ci-après
et qui démontre l’utilisation du patron de conception « Chaîne de responsabilité ».

Étude de cas. Le système dont le diagramme de classes est représenté en partie dans la
figure 1 consiste en la gestion de notes de frais, et plus particulièrement, en la validation
par les responsables hiérarchiques. Le système est composé de deux types d’employés. Les
« simples » Employés peuvent émettre des notes de frais et demander leur validation en les
transmettant (notifiant) à leur supérieurHiérarchique. Cette première catégorie d’employés est
constituée des AssistantDeGestion, IngénieurDAffaire, IngénieurDeRecherche, et TechnicienDe-
Laboratoire. La seconde catégorie constitue les EmployéHabilités, qui possèdent la faculté de
valider les notes de frais de leurs subordonnés, et ce jusqu’à un certain MONTANT_AUTORISÉ.
Pour des raisons de sécurité, un EmployéHabilité ne peut pas valider ses propres notes de frais,
mais doit les notifier à son supérieurHiérarchique. Si le montant de la note de frais dépasse le
MONTANT_AUTORISÉ, alors la note de frais est notifiée au supérieurHiérarchique. Cette seconde
catégorie d’employés est constituée des ResponsableDÉquipe, DirecteurDUnité, VicePrésident,
et Président. Dans notre étude de cas, le dernier maillon de la chaîne, qui est le Président, doit
convoquer le bureau de la société pour valider une note frais dont le montant est supérieur
au MONTANT_AUTORISÉ.

La figure 3 montre un exemple d’utilisation du patron de conception « Chaîne de respon-


sabilité » dans la méthode main de la classe Main. La figure 4 quant à elle donne un exemple
de messages affichés à l’écran lorsque la méthode main est exécutée.

Présentation de la modélisation disponible pour l’implantation. Voici quelques détails sur le


diagramme de classes de la figure 1 :
— un Employé possède un nom. Il est relié à 0..1 objet de classe EmployéHabilité. Il pos-
sède une méthode notifierRequête lorsqu’il souhaite émettre une note de frais et la
transmettre à son supérieur hiérarchique ;
— un EmployéHabilité possède la méthode traiterRequête pour valider les notes de frais no-
tifiées par ses subordonnés. Pour des raisons de simplicité, nous limitons la navigabilité
de l’association entre les classes Employé et EmployéHabilité ;
— les attributs de classes MONTANT_AUTORISÉ des classes enfants de la classe Em-
ployéHabilité sont des constantes ;
— une NoteDeFrais possède un montant et un booléen validé permettant de savoir si la note
de frais est validé par un EmployéHabilité. La chaîneHiérarchique permet de mémoriser
la liste ordonnée de références sur des objets de classe EmployéHabilité. Un objet de
classe EmployéHabilité est référencé par cette liste s’il a déjà ou va traiter la requête de
demande de validation de la NoteDeFrais.
La figure 2 montre le diagramme de machine à états de la classe NoteDeFrais.

Les questions suivantes permettent d’implanter le système. Comme montré dans le dia-
gramme de classes, toutes les classes font partie du paquetage notedefrais.

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 2


CF1 2011–2012

Questions
Question 1 [4 pts] : écrivez tout le code de la classe NoteDeFrais.
Voici quelques commentaires supplémentaires sur les méthodes :
— valider est utilisée pour valider la note de frais, c’est-à-dire mettre le booléen validée
à true ;
— ajoutAChaineHierarchique est utilisée par les méthodes traiterRequete : lorsque le
montant de la note de frais dépasse le montant autorisé, l’objet de type Employe-
Habilite utilise la méthode ajoutAChaineHierarchique pour ajouter son supérieur hié-
rarchique dans la liste des personnes en charge de la validation de la note de frais ;
— toStringChaineHierarchique présente dans une chaîne de caractères les personnes en
charge de la note de frais, c’est-à-dire l’ayant déjà traitée ou allant la traiter.
Répondez aussi à la question suivante :
— Si la classe Vector appartient au paquetage java.util, comment déclarez-vous son
utilisation dans la classe NoteDeFrais ?
Réponse:

package notedefrais ;

import java . util . Vector ;

public class NoteDeFrais {


private double montant ;
private boolean validee ;
private Vector < EmployeHabilite > chaineHierarchique ;
private Employe employe ;

public NoteDeFrais ( double montant , Employe employe ) {


this . montant = montant ;
this . employe = employe ;
validee = false ;
ch ai neHi er ar chi qu e = new Vector < EmployeHabilite >();
}

public double getMontant () {


return montant ;
}

public Employe getEmploye () {


return employe ;
}

public void a j o u t A C h a i n e Hi e r a rc h i q u e ( EmployeHabilite employe ) {


ch ai neHi er ar chi qu e . add ( employe );
}

public boolean getValide () {


return validee ;
}

public void valider () {


validee = true ;
}

public String t o S t r i n g C h a i n e H i e r a r c h i q u e () {

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 3


CF1 2011–2012

return ch ai ne Hi er arc hique . toString ();


}
}

Erreurs fréquemment observées :


— oubli des attributs d’association
— vecteur du mauvais type
— oubli de la création du vecteur
— dans toStringChaineHierarchique, parcours avec return dans la boucle
— On accepte cependant les attributs d’association avec des « @ »
Barème de correction sur 4 point(s) :
Répartition :
0,5 paquetage notedefrais
0,5 attributs montant, validee, et employé (privé, type) (au moins 2 sur 3)
0,5 attribut chaineHierarchique (privé, type)
0,5 constructeur (public, prototype)
0,5 initialisation des attributs avec la déclaration ou dans le constructeur
0,5 ajouterAChaineHierarchique
0,5 toStringChaineHierarchique
0,5 import

Question 2 [4 pts] : écrivez tout le code de la classe Employe.


Voici quelques commentaires supplémentaires sur les méthodes :
— notifierRequete ajoute le supérieur hiérarchique de l’employé à la chaîne hiérarchique
mémorisée par la note de frais et appelle la méthode traiterRequete du supérieur
hiérarchique. Si le supérieur hiérarchique n’est pas connu, alors la méthode retourne
null et aucun autre traitement n’est effectué. Le traitement de ce cas d’erreur par
le mécanisme des exceptions est l’objet de la question 6 ;
— nous vous demandons de redéfinir la méthode toString.
Répondez aussi à la question suivante :
— quel est le mécanisme Java qui interdit de créer des objets de classe Employé ?

Réponse:

package notedefrais ;

import java . util . Vector ;

public abstract class Employe {


private String nom ;
private EmployeHabilite s up e r ie u rH i era rchi que = null ;
private Vector < NoteDeFrais > notesDeFrais ;

public Employe ( String nom ) {


this . nom = nom ;
notesDeFrais = new Vector < NoteDeFrais >();
}

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 4


CF1 2011–2012

public String getNom () {


return nom ;
}

public EmployeHabilite g e tS u p e ri e u r H ie r a r ch i q u e () {
return s u p e r i e ur H ier a rch i que ;
}

public void s e t S u p e r i e u r Hi e r a rc h i q u e ( EmployeHabilite sup ) {


s u per i e u r H i e r a r c h i qu e = sup ;
}

public EmployeHabilite notifierRequete ( NoteDeFrais requete ) {


if ( s u p e r i e u r H i e r a r ch i q ue != null ) {
requete . a j ou t A C h a i n e Hi e r a rc h i q ue ( s uper ieur Hier archi qu e );
notesDeFrais . add ( requete );
return s upe r ieu r Hie r arch ique . traiterRequete ( requete );
} else {
return null ;
}
}

@Override
public String toString () {
return nom ;
}
}

Barème de correction sur 4 point(s) :


Répartition :
0,5 public abstract class
0,5 attributs nom, superieurHierarchique et notesDeFrais (au moins 2 sur 3)
0,5 constructeur
0,5 getSuperieurHierarchique et setSuperieurHierarchique
0,5 notifierRequete, dont la valeur de retour
0,5 test nullité de superieurHierarchique
0,5 toString
0,5 question de cours classe abstraite (ok si public class abstract sans commentaire)

Question 3 [2 pts] : écrivez tout le code de la classe EmployeHabilite.

Réponse:

package notedefrais ;

public abstract class EmployeHabilite extends Employe {


public EmployeHabilite ( String nom ) {
super ( nom );
}

public abstract EmployeHabilite traiterRequete ( NoteDeFrais requete );


}

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 5


CF1 2011–2012

Erreurs fréquemment observées :


— méthode abstraite avec un corps de méthode ou sans le mot clef « abstract »
Barème de correction sur 2 point(s) :
Répartition :
0,5 extends
0,5 classe abstraite
0,5 constructeur avec appel a super(nom)
0,5 methode traiterRequete abstraite

Question 4 [1 pt] : écrivez tout le code de la classe AssistantDeGestion, y compris la


redéfinition de la méthode toString.

Réponse:

package notedefrais ;

public class As sis tant De Ge st io n extends Employe {


public Assi sta nt De Ge st ion ( String nom ) {
super ( nom );
}

@Override
public String toString () {
return "(" + super . toString () + " , assistant de gestion )";
}
}

Barème de correction sur 1 point(s) :


Répartition :
0,5 extends
0,5 constructeur avec appel a super(nom)
0,5 bonus si toString correct avec l’appel à super.toString()

Question 5 [4 pts] : écrivez tout le code de la classe ResponsableDEquipe, en faisant en


sorte que l’attribut MONTANT_AUTORISE soit une constante (c’est-à-dire qu’une fois
qu’il est affecté, sa valeur ne peut pas changer).
Voici quelques informations supplémentaires sur les méthodes :
— traiterRequete possède deux comportements complémentaires. Si le montant est in-
férieur ou égal au montant autorisé alors un premier message est affiché à l’écran
pour indiquer que la note de frais sera validée par lui et un second message est
affiché à l’écran pour donner la liste des personnes ayant traité (vu passer) la note
de frais. En outre la note de frais est validée. Dans le cas contraire, il notifie à son
supérieur, c’est-à-dire fait suivre la requête dans la chaîne de responsabilité.

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 6


CF1 2011–2012

— nous vous demandons de redéfinir la méthode toString.

Réponse:

package notedefrais ;

public class Re spo nsab le DE qu ip e extends EmployeHabilite {


private final static double MONTANT_AUTORISE = 500;

public Resp ons ab le DE qu ipe ( String nom ) {


super ( nom );
}

public EmployeHabilite traiterRequete ( NoteDeFrais requete ) {


EmployeHabilite result = null ;
if ( requete . getMontant () <= MONTANT_AUTORISE ) {
System . out . println (" Votre Responsable d ’ Équipe approuvera "
+ " votre note de frais d ’ un montant de "
+ requete . getMontant () + " euros .");
System . out . println (" Chaîne hiérarchique pour l ’ approbation :"
+ requete . t o S t r i n g C h a i n e H i e r a r c h i q u e ());
requete . valider ();
result = this ;
} else if ( g e t S u p e r i e u r H i e r a rc h i q u e () != null ) {
result = notifierRequete ( requete );
}
return result ;
}

@Override
public String toString () {
return "(" + super . toString () + " , responsable d ’ équipe )";
}
}

Erreurs fréquemment observées :


— mot clef « final » pour rendre un attribut constant
Barème de correction sur 4 point(s) :
Répartition :
0,5 extends
0,5 attribut static
0,5 attribut final
0,5 constructeur avec appel a super(nom)
0,5 traiterRequete si montant inferieur au montant autorise
(affichage + validation)
0,5 traiterRequete si montant superieur
0,5 valeur de retour de traiterRequete
0,5 toString avec appel à super.toString()

Question 6 [3 pts] : dans cette question, nous complétons les classes étudiées dans les
questions précédentes ainsi que la méthode main de la classe Main pour traiter par des
exceptions le cas suivant :

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 7


CF1 2011–2012

— l’auteur de la méthode main de la classe Main a oublié de créer un objet de type


President et l’objet vp de type VicePresident n’a pas de supérieur hiérarchique ;
— lorsque le problème de nullité est détecté, une exception est levée et relayée jusqu’à
la méthode main ;
— lorsque l’utilisateur entre le montant « 100000 », la nouvelle méthode main affiche
à l’écran « (Laure, vice président) ne possède pas de supérieur hiérarchique ! ».
Nous vous demandons :
— d’écrire le code de la classe SuperieurHierarchiqueException utilisée dans cette ques-
tion,
— d’indiquer précisément (c’est-à-dire en réécrivant les lignes de code concernées) les
modifications que vous faites dans les classes étudiées dans les questions précédentes.

Réponse:

Voici les modifications à opérer:

— écrire une classe d’exception SuperieurHierarchiqueException


— dans la classe Employe, dans la méthode notifierRequete, ajouter
un throw lorsque nullité et throws à la signature
— dans la classe EmployeHabilite, dans la méthode traiterRequete,
ajouter throws à la signature
— dans la classe ResponsableHierarchique, dans la méthode
traiterRequete, ajouter throws à la signature
— dans la classe Main, dans la méthode main, ajout d’un bloc try
autour de l’appel à la méthode notifierRequete et ajout d’un bloc
catch avec affichage du message de l’exception

Cela donne le code suit, fichier par fichier.

Classe de l’exception

package n o t e d e f r a i s av e c e x c e p t i o n ;

public class S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n extends Exception {


private static final long serialVersionUID = 1 L ;

public S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n ( String message ) {


super ( message );
}
}

Classe Employe, méthode notifierRequete

package n o t e d e f r a i s av e c e x c e p t i o n ;

import java . util . Vector ;

public abstract class Employe {


private String nom ;
private EmployeHabilite s up e r ie u rH i era rchi que = null ;
private Vector < NoteDeFrais > notesDeFrais ;

public Employe ( String nom ) {


this . nom = nom ;

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 8


CF1 2011–2012

notesDeFrais = new Vector < NoteDeFrais >();


}

public String getNom () {


return nom ;
}

public EmployeHabilite g e tS u p e ri e u r H ie r a r ch i q u e () {
return s u p e r i e ur H ier a rch i que ;
}

public void s e t S u p e r i e u r Hi e r a rc h i q u e ( EmployeHabilite sup ) {


s u per i e u r H i e r a r c h i qu e = sup ;
}

public EmployeHabilite notifierRequete ( NoteDeFrais requete )


throws S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n {
requete . a j o u t A C ha i n e H i e r a r c h i q ue ( s uper ieur Hier archi que );
if ( s u p e r i e u r H i e r a r ch i q ue == null ) {
throw new S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n ( this
+ " ne possède pas de supérieur hiérarchique !");
}
notesDeFrais . add ( requete );
return s u p e r i e ur H ier a rch i que . traiterRequete ( requete );
}

@Override
public String toString () {
return nom ;
}
}

Classe EmployeHabilite, méthode traiterRequete

package n o t e d e f r a i s av e c e x c e p t i o n ;

public abstract class EmployeHabilite extends Employe {


public EmployeHabilite ( String nom ) {
super ( nom );
}

public abstract EmployeHabilite traiterRequete ( NoteDeFrais requete )


throws S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n ;
}

Classe ResponsableDEquipe, méthode traiterRequete

package n o t e d e f r a i s av e c e x c e p t i o n ;

public class Re spo nsab le DE qu ip e extends EmployeHabilite {


private final static double MONTANT_AUTORISE = 500;

public Resp ons ab le DE qu ipe ( String nom ) {


super ( nom );
}

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 9


CF1 2011–2012

public EmployeHabilite traiterRequete ( NoteDeFrais requete )


throws S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n {
EmployeHabilite result = null ;
if ( requete . getMontant () <= MONTANT_AUTORISE ) {
System . out . println (" Votre Responsable d ’ Équipe approuvera "
+ " votre note de frais d ’ un montant de "
+ requete . getMontant () + " euros .");
System . out . println (" Chaîne hiérarchique pour l ’ approbation :"
+ requete . t o S t r i n g C h a i n e H i e r a r c h i q u e ());
requete . valider ();
result = this ;
} else {
result = notifierRequete ( requete );
}
return result ;
}

@Override
public String toString () {
return "(" + super . toString () + " , responsable d ’ équipe )";
}
}

Classe MainAvecException, blocs try et catch

package n o t e d e f r a i s av e c e x c e p t i o n ;

import java . io . BufferedReader ;


import java . io . IOException ;
import java . io . In putStr eamRe ader ;

public class MainAvec Except ion {


public static void main ( String [] args ) throws IOException {
In g eni e u r D e R e c h er c he ingenieur = new IngenieurDeRecherche (" Louis ");
Re sp onsa bl eD Equ ip e responsable = new ResponsableDEquipe (" Luc ");
DirecteurUnite directeur = new DirecteurUnite (" Léa ");
VicePresident vp = new VicePresident (" Laure ");
// President president = new President (" Leslie ");
ingenieur . s e t S u pe r i e ur H i e r a r c h i qu e ( responsable );
responsable . s e t S u p e r i e ur H i e ra r c h iq u e ( directeur );
directeur . s e t S u pe r i e ur H i e r a r c h i qu e ( vp );
// vp . s e t S u p e r i e u r H i e r a r ch i q u e ( president );
double d ;
do {
System . out . println (" Entrer le montant de votre note de frais .");
System . out . print (" > ");
d = Double . parseDouble ( new BufferedReader ( new InputStream Reader (
System . in )). readLine ());
if ( d > 0) {
try {
ingenieur . notifierRequete ( new NoteDeFrais (d , ingenie
} catch ( S u p e r i e u r H i e r a r c h i q u e E x c e p t i o n e ) {
System . out . println ( e . getMessage ());
}
}
System . out . println ();
} while ( d > 0.0);
System . out . println (" Fin de l ’ application ");

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 10


CF1 2011–2012

}
}

Erreurs fréquemment observées :


— oubli du relais dans les méthodes intermédiaires
Barème de correction sur 3 point(s) :
Répartition :
0,5 classe SuperieurHierarchiqueException (extends Exception, constructeur)
0,5 dans la classe Employe, méthode notifierRequete avec throws
0,5 dans la classe Employe, test nullité et levée de l’exception
0,5 dans la classe EmployeHabilite, méthode traiterRequete avec throws
0,5 dans la classe ResponsableDEquipe, méthode traiterRequete avec throws
0,5 pas de blocs try catch, hormis dans le main, qui n’est pas demandé

Question 7 [2 pts] : écrivez, en utilisant JUnit et en vous inspirant du scénario de la


méthode main de la classe Main, un test de validation permettant de tester que la note
de frais de « Louis » est validée par « Leslie ».

Réponse:

package test ;

import n ot e d e f r a i s a ve c e x c e p t i o n . DirecteurUnite ;
import n ot e d e f r a i s a ve c e x c e p t i o n . EmployeHabilite ;
import n ot e d e f r a i s a ve c e x c e p t i o n . In g eni e urD e Recherche ;
import n ot e d e f r a i s a ve c e x c e p t i o n . NoteDeFrais ;
import n ot e d e f r a i s a ve c e x c e p t i o n . President ;
import n ot e d e f r a i s a ve c e x c e p t i o n . Resp on sableDEquipe ;
import n ot e d e f r a i s a ve c e x c e p t i o n . VicePresident ;

import org . junit . After ;


import org . junit . Assert ;
import org . junit . Before ;
import org . junit . Test ;

public class JUnitNoteDeFrais {


private I n gen i e u r D e R e c h e r che ingenieur ;
private Res po ns ab le DE qu ip e responsable ;
private DirecteurUnite directeur ;
private VicePresident vp ;
private President president ;

@Before
public void setUp () throws Exception {
ingenieur = new I n gen i eur D eRecherche (" Louis ");
responsable = new R es ponsab leDEquipe (" Luc ");
directeur = new DirecteurUnite (" Léa ");
vp = new VicePresident (" Laure ");
president = new President (" Leslie ");
ingenieur . s e t S u pe r i e ur H i e r a r c h i qu e ( responsable );
responsable . s e t S u p e r i e ur H i e ra r c h iq u e ( directeur );
directeur . s e t S u pe r i e ur H i e r a r c h i qu e ( vp );

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 11


CF1 2011–2012

vp . s e t S u p e r i e u r H i e r a r ch i q u e ( president );
}

@After
public void tearDown () throws Exception {
ingenieur = null ;
responsable = null ;
directeur = null ;
vp = null ;
president = null ;
}

@Test
public void te st Ce ntM il le Eu ros () throws Exception {
EmployeHabilite hab = ingenieur
. notifierRequete ( new NoteDeFrais (100000 , ingenieur ));
Assert . assertEquals ( president . getNom () , hab . getNom ());
}
}

Barème de correction sur 2 point(s) :


Répartition :
0,5 initialisation = scénario, méthode setUp ou équivalent
0,5 annotations @Test, voire aussi @Before et @After
0,5 test avec Assert.assertEquals
0,5 remise à null des références

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 12


CF1 2011–2012

notedefrais

NoteDeFrais
−montant: double
−validée: boolean = false
+NoteDeFrais(double montant)
+getMontant(): double
* +ajoutÀChaîneHiérarchique(EmployéHabilité sup): void
+getValidé(): boolean
+valider(): void
+toStringChaîneHiérarchique(): String

* chaîneHiérarchique

*
<<abstract>> <<abstract>>
Employé EmployéHabilité
−nom:String

+Employé(String nom)
* 0..1
+getNom():String +EmployéHabilité(String nom)
+getSupérieurHiérarchique():EmployéHabilité supérieurHiérarchique +<<abstract>> traiterRequête(NoteDeFrais note):EmployéHabilité
+setSupérieurHiérarchique(EmployéHabilité sup):void
+notifierRequête(NoteDeFrais note):EmployéHabilité

AssistantDeGestion ResponsableDÉquipe
+MONTANT_AUTORISÉ:double=500

+AssistanDeGestion(String nom) +ResponsableDÉquipe(String nom)


+traiterRequête(NoteDeFrais note):EmployéHabilité

IngénieurDAffaire
DirecteurDUnité
+IngénieurDAffaire(String nom) +MONTANT_AUTORISÉ:double=5000
+DirecteurDUnité(String nom)
IngénieurDeRecherche +traiterRequête(NoteDeFrais note):EmployéHabilité

+IngénieurDeRecherche(String nom) VicePrésident


+MONTANT_AUTORISÉ:double=50000
TechnicienDeLaboratoire
+VicePrésident(String nom)
+traiterRequête(NoteDeFrais note):EmployéHabilité

+TechnicienDeLaboratoire(String nom)

Président
+MONTANT_AUTORISÉ:double=500000
+Président(String nom)
+traiterRequête(NoteDeFrais note):EmployéHabilité

Figure 1 – Diagramme de classes : pour des raisons de simplicité, nous limitons la navigabilité de l’association
entre les classes Employé et EmployéHabilité.

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 13


CF1 2011–2012

validation par un EmployéHabilité


EnConstruction Validée
/ valider()
entrée : constructeur()

e
èm
yst
es
par l
ssion
pre
sup

EnDestruction

Figure 2 – Diagramme de machine à états de la classe NoteDeFrais.

package notedefrais ;

import java . io . BufferedReader ;


import java . io . I nputStreamRe ader ;

public class Main {


public static void main ( String [] args ) throws Exception {
In gen i eu r D e R e c h e r c he ingenieur = new IngenieurDeRecherche (" Louis ");
Re sp onsa bl eD Eq ui pe responsable = new ResponsableDEquipe (" Luc ");
DirecteurUnite directeur = new DirecteurUnite (" Léa ");
VicePresident vp = new VicePresident (" Laure ");
President president = new President (" Leslie ");
ingenieur . s e t S u p er i e u r H i e r a r c h i qu e ( responsable );
responsable . s e t S u p e r i e u rH i e r ar c h i qu e ( directeur );
directeur . s e t S u p er i e u r H i e r a r c h i qu e ( vp );
vp . s e t Su p e r i e u r H i e r a r c hi q u e ( president );
double d ;
do {
System . out . println (" Entrer le montant de votre note de frais .");
System . out . print (" > ");
d = Double . parseDouble ( new BufferedReader (
new InputStreamReader ( System . in )). readLine ());
if ( d > 0) {
ingenieur . notifierRequete ( new NoteDeFrais (d , ingenieur ));
}
System . out . println ();
} while ( d > 0.0);
System . out . println (" Fin de l ’ application ");
}
}

Figure 3 – Code Java de la classe Main

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 14


CF1 2011–2012

Entrer le montant de votre note de frais.


> 100
Votre Responsable d’Équipe approuvera votre note de frais d’un montant de 100.0 euros.
Chaîne hiérarchique pour l’approbation :[(Luc, responsable d’équipe)]

Entrer le montant de votre note de frais.


> 1000
Votre Directeur d’Unité approuvera votre note de frais d’un montant de 1000.0 euros.
Chaîne hiérarchique pour l’approbation :[(Luc, responsable d’équipe), (Léa, directeur d’unité)]

Entrer le montant de votre note de frais.


> 10000
Le Vice Président approuvera votre note de frais d’un montant de 10000.0 euros.
Chaîne hiérarchique pour l’approbation :[(Luc, responsable d’équipe), (Léa, directeur d’unité),
(Laure, vice président)]

Entrer le montant de votre note de frais.


> 100000
Le Président approuvera votre note de frais d’un montant de 100000.0 euros.
Chaîne hiérarchique pour l’approbation :[(Luc, responsable d’équipe), (Léa, directeur d’unité),
(Laure, vice président), (Leslie, président)]

Entrer le montant de votre note de frais.


> 1000000
Votre note de frais d’un montant de 1000000.0 euros requiert une réunion du bureau de la société !
Chaîne hiérarchique pour l’approbation :[(Luc, responsable d’équipe), (Léa, directeur d’unité),
(Laure, vice président), (Leslie, président)]

Entrer le montant de votre note de frais.


> 0

Fin de l’application

Figure 4 – Exemple d’exécution de la classe Main

Télécom SudParis — Denis Conan et Christian Bac — 26 janvier 2012 — CSC4002 15

Vous aimerez peut-être aussi