Vous êtes sur la page 1sur 3

TP 1

Inversion de controle

On voudrait réaliser une application qui permet d’exploiter des données (affichage des données). Ces
données peuvent être des données saisies par l’utilisateur ou bien des données venant d’une source de
données.

Notre application est composée logiquement de trois couches (parties) :


- Couche présentation : exploitation des données en les affichant,
- Couche métier : faire le calcul nécessaire. Réaliser le fonctionnement attendu,
- Couche données : préparation et accès aux données.

Dans un premier temps nous adoptons le diagramme suivant pour la réalisation de notre application.

1. Définir les classes DAO, Metier et Presentation, sachant que


i. DAO : contient une méthode qui fait la saisie des données depuis le clavier.
ii. Metier : utilise les données de DAO pour faire le calcul nécessaire. Elle contient la méthode
calcul() qui permet de retourner un double selon le traitement suivant : d --> d * 2.5 / 100.
iii. Presentation : utilise les objets de Metier pour les afficher.

Par la suite, nous voudrions que les données récupérées depuis la classe DAO soient d’un fichier
EXCEL. On suppose que la valeur recherchée représente la somme de l’ensemble des données qui se
trouvent dans la première colonne.

A quel niveau nous devrons effectuer les modifications ? Peut-on considérer que notre application est
fermée à la modification ouverte à l’extension ?

2. Pour rendre l’application fermée à la modification ouverte à l’extension, on se basera sur les
interfaces. Pour cela nous utiliserons le diagramme suivant :
(a) Définir les interfaces IDao et Imetier, appartenant, successivement aux packages dao et metier.
(b) IDao contient une méthode getValue() qui retourne un double;
(c) Définir une classe DaoImpl, dans le package dao, qui implémente IDao. Cette classe contient
une méthode getValue() qui permet de demander à l’utilisateur de saisir un double au clavier.
(d) Définir une classe MetierImpl appartenant au package metier. Cette classe contient un objet de
type IDao et implémente IMetier. La méthode calcul est redéfini selon :
d --> d * 2.5 / 100.
(e) Définir une classe Presentation qui permet d’instancier les différentes classes indiquées.

3. Définir une deuxième implémentation de la classe IDao qui permet de lire les données depuis un
fichier EXCEL.

Quelle couche est considérée encore comme partie non fermée à la modification et non ouverte à
l’extension? Pourquoi ?
Comment rendre cette partie elle aussi fermée à la modification et ouverte à l’extension ? – Instaniation
dynamique –

Indications :
- Lire un fichier
Scanner config = new Scanner(new File("config.txt"));

// new Scanner(System.in) ; Lire depuis le clavier

String uneLigne = config.nextLine();

- Charger une classe en mémoire :


Class cUneClasse = Class.forName(ClassName);

- Instancier dynamiquement un objet


Type UnType = (Type) cUneClasse.newInstance();
- Invoquer une méthode de cet objet :
Method m = cUneClasse.getMethod("methode", Type.class);
m.invoke(UnType, argument);

Lire un fichier Excel : utiliser l’API Apache POI


(https://poi.apache.org/components/spreadsheet/index.html)

Dépendance maven :

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>

- Read XSLX file


FileInputStream inputStream = new FileInputStream(new
File("C:/demo/employee.xls"));
inputStream.close();

- Get the workbook instance for XLS file


HSSFWorkbook workbook = new XSSFWorkbook(inputStream);

- Get first sheet from the workbook


Sheet dataSheet = workbook.getSheetAt(0);

- Get iterator to all the rows in current sheet


Iterator<Row> rowIterator = dataSheet.iterator();

- Iterate a row
while (rowIterator.hasNext()) {
Row row = (Row) rowIterator.next();
cellule = row.getCell(0);
int id = (int)cellule.getNumericCellValue();

}

Vous aimerez peut-être aussi