Blame view

rapport.md 8.49 KB
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é