72a4b821
Remi
merge
|
1
|
# RAPPORT ANALYSE ET CONCEPTION
|
1be42697
ANDJEMBE
hu
|
2
3
4
|
> ANDJEMBE Maksoudath, TANIEL Rémi
|
72a4b821
Remi
merge
|
5
6
|
Le but du projet est de réaliser un tableur "basique" mais facilement
extensible, l'application sera divisée en 2 parties :
|
2e8fbd04
Remi
global refactor
|
7
|
* le kernel
|
72a4b821
Remi
merge
|
8
|
* la partie graphique
|
1be42697
ANDJEMBE
hu
|
9
|
|
2e8fbd04
Remi
global refactor
|
10
|
Le kernel s'occupera de toutes les opérations de notre grid, les cases
|
72a4b821
Remi
merge
|
11
|
ne pourront contenir que des réels ou des formules(opération binaire ou
|
84149d6c
mandjemb
schema uml
|
12
|
des fonctions acceptant des plages de cases).
|
d2c86fc1
Remi
finish rapport
|
13
|
|
72a4b821
Remi
merge
|
14
|
### SCHEMA UML
|
1be42697
ANDJEMBE
hu
|
15
|
|
72a4b821
Remi
merge
|
16
17
|
Voici le schéma UML de notre application, les classes et méthodes
abstraites sont en italique :
|
1be42697
ANDJEMBE
hu
|
18
|
|
84149d6c
mandjemb
schema uml
|
19
20
21
|
![UML](uml.png)
|
72a4b821
Remi
merge
|
22
23
|
### PSEUDO-JAVA CREATION GRILLE,CASES
|
2e8fbd04
Remi
global refactor
|
24
|
Voici un exemple de création d'une grid et de l'ajout / modification /
|
72a4b821
Remi
merge
|
25
|
affichage de plusieurs types de case :
|
1be42697
ANDJEMBE
hu
|
26
|
|
72a4b821
Remi
merge
|
27
|
```java
|
d2c86fc1
Remi
finish rapport
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
class Application {
public static void main(String[] args) {
Grille g = new Grille();
g.createCase("b",1); //Ajout case vide
g.createCase("a",1,100.0); //Ajout case avec valeur
g.createCase("a",2,50.0); //Ajout case avec valeur
g.createCase("a",3,new Addition(g.getCase("a",2),g.getCase("a",1))); //Ajout case avec operation binaire
List<Case> plageCase1 = new ArrayList<Case>(); // Crée une liste de case
plageCase1.add(g.getCase("a",1));
plageCase1.add(g.getCase("a",2));
plageCase1.add(g.getCase("a",3));
g.createCase("a",4,new Somme(plageCase1)); //Ajout case avec fonctions
g.setValeur("b",1,100); //Met la valeur de b1 à 100
List<Case> plageCase2 = new ArrayList<Case>(); // Crée une liste de case
plageCase1.add(g.getCase("a",4));
plageCase1.add(g.getCase("a",2));
plageCase1.add(g.getCase("a",3));
g.setFormule("b",2,new Moyenne(plageCase2)); //Met la formule dans b2
g.getValeur("a",1); //Affichera 100.0
g.getValeur("a",4); //Affichera (100+50+150)=100
g.getFormuleAsString("b",2); //Affichera MOYENNE(a4,a2,a3)
|
2e8fbd04
Remi
global refactor
|
57
|
g.getFormuleDeveloppe("b",2); Sum
|
d2c86fc1
Remi
finish rapport
|
58
59
|
}
}
|
1be42697
ANDJEMBE
hu
|
60
61
|
```
|
72a4b821
Remi
merge
|
62
|
### CHOIX STRUCTURE DE DONNÉES
|
1be42697
ANDJEMBE
hu
|
63
|
|
72a4b821
Remi
merge
|
64
|
Nous devons choisir une structure de donnée pour stocker les cases dans
|
2e8fbd04
Remi
global refactor
|
65
|
notre grid, nous savons déjà que nous allons utiliser ne collection
|
72a4b821
Remi
merge
|
66
|
pour les stocker,voici celles que nous connaissons:
|
d2c86fc1
Remi
finish rapport
|
67
68
69
70
|
- des tableaux
- des listes
- des maps
- des sets
|
1be42697
ANDJEMBE
hu
|
71
|
|
72a4b821
Remi
merge
|
72
|
D'après le schéma UML ci-dessus, nous allons donc utiliser une `HashMap`
|
2e8fbd04
Remi
global refactor
|
73
|
pour stocker les cases de notre grid :
|
72a4b821
Remi
merge
|
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
* Pour rechercher une case et, effectuer des opérations dessus ce sera
plus facile, la clé de la Map sera une chaine de caractère (String) qui
représente la coordonnée de cette case (c'est-à-dire la concaténation
du nom de ligne et de l'indice de la colonne, exemple "A1", "B9", etc...)
Une case peut etre utilisée dans plusieurs autres cases, on ne sait
pas le nombre d'autres cases où elle sera utilisée, on stockera donc
cette donée dans une `ArrayList` de `Case`.
Certaines fonctions (`Moyenne`, `Somme`) utilise également une plage de case, pour stocker ces cases,
nous allons également une `ArrayList` de `Case`.
### METHODES ESSENTIELLES EN PSEUDO-JAVA
|
48bf0ff8
[mandjemb]
avec pseudo java
|
88
89
90
91
|
#### 1. Methode getValeur
```java
|
d2c86fc1
Remi
finish rapport
|
92
|
class Grille {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
93
94
|
Map<String, Case> cases = new HashMap<>();
|
d2c86fc1
Remi
finish rapport
|
95
|
double getValeur(String colonne, int ligne){
|
48bf0ff8
[mandjemb]
avec pseudo java
|
96
97
98
99
100
101
|
String code=colonne+ligne;
return cases.get(code).getValeur();
}
}
|
d2c86fc1
Remi
finish rapport
|
102
|
class Case {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
103
104
105
106
|
String colonne;
int ligne;
double valeur;
|
d2c86fc1
Remi
finish rapport
|
107
|
double getValeur() {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
108
109
110
111
112
113
114
|
return valeur;
}
}
```
|
d2c86fc1
Remi
finish rapport
|
115
|
#### 2. Methode getFormuleAsString
|
48bf0ff8
[mandjemb]
avec pseudo java
|
116
117
118
|
```java
|
d2c86fc1
Remi
finish rapport
|
119
120
|
class Grille {
Map<String, Case> cases = new HashMap<>();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
121
|
|
d2c86fc1
Remi
finish rapport
|
122
|
String getFormule(String colonne, int ligne) {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
123
|
String code=colonne+ligne;
|
d2c86fc1
Remi
finish rapport
|
124
|
return cases.get(code).getFormuleAsString();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
125
126
127
128
|
}
}
|
d2c86fc1
Remi
finish rapport
|
129
|
class Case {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
130
131
132
133
134
|
String colonne;
int ligne;
double valeur;
Formule formule;
|
d2c86fc1
Remi
finish rapport
|
135
136
137
138
139
|
String getFormuleAsString() {
if (formule != null)
return formule.toString();
else
return toString();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
140
141
142
|
}
}
|
d2c86fc1
Remi
finish rapport
|
143
144
145
146
147
148
149
150
151
152
|
// Exemple pour Addition
class Addition {
Case gauche;
Case droite;
String toString() {
return gauche.toString() + "+" + droite.toString();
}
}
|
48bf0ff8
[mandjemb]
avec pseudo java
|
153
154
155
156
157
158
|
```
#### 3. Methode getFormuleDeveloppe
```java
|
d2c86fc1
Remi
finish rapport
|
159
|
class Grille{
|
48bf0ff8
[mandjemb]
avec pseudo java
|
160
161
|
Map<String, Case> cases = new HashMap<>();
|
d2c86fc1
Remi
finish rapport
|
162
|
String getFormuleDeveloppe(String colonne, int ligne) {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
163
|
String code=colonne+ligne;
|
d2c86fc1
Remi
finish rapport
|
164
|
return cases.get(code).getFormuleDeveloppe();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
165
166
167
|
}
}
|
d2c86fc1
Remi
finish rapport
|
168
|
class Case{
|
48bf0ff8
[mandjemb]
avec pseudo java
|
169
170
171
172
173
174
|
String colonne;
int ligne;
double valeur;
Formule formule;
ArrayList<Case> utiliseDans = new ArrayList<Case>();
|
d2c86fc1
Remi
finish rapport
|
175
176
177
178
179
|
String getFormuleDeveloppe() {
if (formule != null)
return formule.getFormuleDeveoppe();
else
return toString();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
180
181
182
|
}
}
|
2e8fbd04
Remi
global refactor
|
183
|
Average
|
d2c86fc1
Remi
finish rapport
|
184
185
186
187
|
class Moyenne {
List<Case> listCases = new ArrayList<Case>();
String getFormuleDeveloppe() {
|
2e8fbd04
Remi
global refactor
|
188
|
return Average + listCases.stream().map(c -> c.getFormuleDeveloppe()).collect((Collectors).joining(", ")) + ")";
|
d2c86fc1
Remi
finish rapport
|
189
190
191
|
}
}
|
48bf0ff8
[mandjemb]
avec pseudo java
|
192
193
194
195
196
197
198
199
|
```
#### 4. Methode eval()
- Dans Addition :
```java
|
d2c86fc1
Remi
finish rapport
|
200
|
class Addition {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
201
202
203
|
Case gauche;
Case droite;
|
d2c86fc1
Remi
finish rapport
|
204
205
|
double eval() {
return gauche.getValeur() + droite.getValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
206
207
208
209
210
211
212
213
|
}
}
```
- Dans Multiplication :
```java
|
d2c86fc1
Remi
finish rapport
|
214
|
class Multiplication {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
215
216
217
|
Case gauche;
Case droite;
|
d2c86fc1
Remi
finish rapport
|
218
219
|
double eval() {
return gauche.getValeur() * droite.getValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
220
221
222
223
224
225
|
}
}
```
- Dans Soustraction :
|
1be42697
ANDJEMBE
hu
|
226
|
|
48bf0ff8
[mandjemb]
avec pseudo java
|
227
|
```java
|
d2c86fc1
Remi
finish rapport
|
228
|
class Soustraction {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
229
230
231
|
Case gauche;
Case droite;
|
d2c86fc1
Remi
finish rapport
|
232
233
|
double eval() {
return gauche.getValeur() - droite.getValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
234
235
236
237
238
239
240
241
|
}
}
```
- Dans Division :
```java
|
d2c86fc1
Remi
finish rapport
|
242
|
class Division {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
243
244
245
|
Case gauche;
Case droite;
|
d2c86fc1
Remi
finish rapport
|
246
247
248
|
double eval() {
if (droite.getValeur() != 0)
return gauche.getValeur() / droite.getValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
249
|
else
|
d2c86fc1
Remi
finish rapport
|
250
|
lève une exception
|
48bf0ff8
[mandjemb]
avec pseudo java
|
251
252
253
254
255
256
257
258
|
}
}
```
- Dans Moyenne :
```java
|
d2c86fc1
Remi
finish rapport
|
259
260
|
class Moyenne {
List<Case> listCases = new ArrayList<Case>();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
261
|
|
d2c86fc1
Remi
finish rapport
|
262
263
|
double eval() {
double val=0;
|
48bf0ff8
[mandjemb]
avec pseudo java
|
264
|
|
d2c86fc1
Remi
finish rapport
|
265
266
267
268
|
if (listCases.size() != 0)
for(int i=0; i<listCases.size(); i++)
val += listCases.get(i).getValeur();
return val / listCases.size();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
269
|
else
|
d2c86fc1
Remi
finish rapport
|
270
|
lève une exception
|
48bf0ff8
[mandjemb]
avec pseudo java
|
271
272
|
}
}
|
1be42697
ANDJEMBE
hu
|
273
|
|
1be42697
ANDJEMBE
hu
|
274
|
```
|
48bf0ff8
[mandjemb]
avec pseudo java
|
275
276
277
|
- Dans Somme :
```java
|
d2c86fc1
Remi
finish rapport
|
278
279
280
281
282
283
284
285
|
class Somme {
List<Case> listCases = new ArrayList<Case>();
double eval() {
double val=0;
if (listCases.size() != 0)
for(int i=0; i<listCases.size(); i++)
val += listCases.get(i).getValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
286
287
|
return val;
else
|
d2c86fc1
Remi
finish rapport
|
288
|
lève une exception
|
48bf0ff8
[mandjemb]
avec pseudo java
|
289
290
291
292
293
|
}
}
```
|
d2c86fc1
Remi
finish rapport
|
294
|
#### 5. Methode setValeur
|
48bf0ff8
[mandjemb]
avec pseudo java
|
295
296
|
```java
|
d2c86fc1
Remi
finish rapport
|
297
|
class Grille {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
298
299
|
Map<String, Case> cases = new HashMap<>();
|
d2c86fc1
Remi
finish rapport
|
300
301
302
|
void setValeur(String colonne, int ligne, double value) {
String code = colonne + ligne;
return cases.get(code).setValeur(value);
|
48bf0ff8
[mandjemb]
avec pseudo java
|
303
304
305
|
}
}
|
d2c86fc1
Remi
finish rapport
|
306
|
class Case {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
307
308
309
310
|
String colonne;
int ligne;
double valeur;
Formule formule;
|
d2c86fc1
Remi
finish rapport
|
311
|
List<Case> utiliseDans = new ArrayList<Case>();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
312
|
|
d2c86fc1
Remi
finish rapport
|
313
314
|
void setValeur(double value) {
valeur = value;
|
48bf0ff8
[mandjemb]
avec pseudo java
|
315
|
for(int i=0; i<utiliseDans.size(); i++)
|
d2c86fc1
Remi
finish rapport
|
316
|
utiliseDans.get(i).updateValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
317
318
319
320
321
322
323
324
|
}
}
```
#### 5. Methode setFormule
```java
|
d2c86fc1
Remi
finish rapport
|
325
|
class Grille {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
326
327
|
Map<String, Case> cases = new HashMap<>();
|
d2c86fc1
Remi
finish rapport
|
328
329
330
|
void setFormule(String colonne, int ligne, Formule formule) {
String code = colonne + ligne;
return cases.get(code).setFormule(formula);
|
48bf0ff8
[mandjemb]
avec pseudo java
|
331
332
333
334
|
}
}
|
d2c86fc1
Remi
finish rapport
|
335
|
class Case {
|
48bf0ff8
[mandjemb]
avec pseudo java
|
336
337
338
339
|
String colonne;
int ligne;
double valeur;
Formule formule;
|
d2c86fc1
Remi
finish rapport
|
340
|
List<Case> utiliseDans = new ArrayList<Case>();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
341
|
|
d2c86fc1
Remi
finish rapport
|
342
343
344
345
346
347
348
349
|
void updateValeur() {
valeur = formule.eval();
}
void setFormule(Formule formula) {
if (!formula.creerCycle(this))
formule = formula;
updateValeur();
|
48bf0ff8
[mandjemb]
avec pseudo java
|
350
351
352
353
|
for(int i=0; i<utiliseDans.size(); i++)
utiliseDans.get(i).updateValeur();
else
lève une exception
|
48bf0ff8
[mandjemb]
avec pseudo java
|
354
355
356
|
}
}
|
2e8fbd04
Remi
global refactor
|
357
|
BinaryOperation
|
d2c86fc1
Remi
finish rapport
|
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
|
class OperationBinaire {
Case gauche;
Case droite;
boolean creerCycle(Case case) {
if (gauche != case && droite != case) {
if (gauche.isFormula() && droite.isFormula())
return gauche.getFormule().creerCycle(case) && droite.getFormule().creerCycle(case);
else
return false;
}
return true;
}
}
|
48bf0ff8
[mandjemb]
avec pseudo java
|
373
|
|
d2c86fc1
Remi
finish rapport
|
374
|
```
|
dd4a1e45
Remi
test
|
375
376
377
378
379
380
381
|
### LISTE DE TESTS
Afin de s'assurer de la maintenabilité de notre code et de la qualité de
celui-ci, nous allons réaliser plusieurs tests sur les différentes méthodes
que nous allons programmé dans notre application, voici quelques
exemples :
|
d2c86fc1
Remi
finish rapport
|
382
383
384
|
- Création d'une case avec une valeur fixe
- Création d'une case avec une formule d' `Opération binaire` et une
|
dd4a1e45
Remi
test
|
385
|
fonction comme `Moyenne`
|
d2c86fc1
Remi
finish rapport
|
386
|
- Modification d'une case avec une valeur sans qu'elle soit utilisée dans
|
dd4a1e45
Remi
test
|
387
|
une autre case
|
d2c86fc1
Remi
finish rapport
|
388
389
|
- Modification d'une case avec une valeur utilisée dans une autre case
- Vérification qu'une erreur se lève lors de la création des 2 types
|
dd4a1e45
Remi
test
|
390
|
de cycles (direct et indirect)
|
d2c86fc1
Remi
finish rapport
|
391
|
- Renvoie de la formule dévéloppée d'une case avec une formule assez compliqué
|