RAPPORT ANALYSE ET CONCEPTION
ANDJEMBE Maksoudath, TANIEL Rémi
Le but du projet est de réaliser un tableur "basique" mais facilement extensible, l'application sera divisée en 2 parties :
- le noyau
- la partie graphique
Le noyau s'occupera de toutes les opérations de notre grille, les cases ne pourront contenir que des réels ou des formules(opération binaire ou des fonctions acceptant des plages de cases).
SCHEMA UML
Voici le schéma UML de notre application, les classes et méthodes abstraites sont en italique :
PSEUDO-JAVA CREATION GRILLE,CASES
Voici un exemple de création d'une grille et de l'ajout / modification / affichage de plusieurs types de case :
Grille g= new Grille();
g.addCase("b",1); //Ajout case vide
g.addCase("a",1,100.0); //Ajout case avec valeur
g.addCase("a",2,50.0); //Ajout case avec valeur
g.addCase("a",3,new Addition(g.get("a2"),g.get("a1"))); //Ajout case avec operation binaire
List<Case> plageCase1 = new ArrayList<Case>(); // Crée une liste de case
plageCase1.add(g.get("a1"));
plageCase1.add(g.get("a2"));
plageCase1.add(g.get("a3"));
g.addCase("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.get("a4"));
plageCase1.add(g.get("a2"));
plageCase1.add(g.get("a3"));
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.getFormule("b",2) //Affichera MOYENNE(a4,a2,a3)
g.getFormuleDeveloppe("b",2) //Affichera MOYENNE(Somme(a1,a2,a3),a2,(a1+a2))
CHOIX STRUCTURE DE DONNÉES
Nous devons choisir une structure de donnée pour stocker les cases dans notre grille, nous savons déjà que nous allons utiliser ne collection pour les stocker,voici celles que nous connaissons:
- des tableaux
- des listes
- des maps
- des sets
D'après le schéma UML ci-dessus, nous allons donc utiliser une HashMap
pour stocker les cases de notre grille :
- 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
1. Methode getValeur
Class Grille{
Map<String, Case> cases = new HashMap<>();
double getValeur( String colonne, int ligne){
String code=colonne+ligne;
return cases.get(code).getValeur();
}
}
Class Case{
String colonne;
int ligne;
double valeur;
double getValeur(){
return valeur;
}
}
2. Methode getFormule
Class Grille{
Map<String, Case> cases = new HashMap<>();
String getFormule( String colonne, int ligne){
String code=colonne+ligne;
return cases.get(code).getFormule();
}
}
Class Case{
String colonne;
int ligne;
double valeur;
Formule formule;
String getFormule(){
return this.formule.toString();
}
}
3. Methode getFormuleDeveloppe
Class Grille{
Map<String, Case> cases = new HashMap<>();
String getFormuleDeveloppe( String colonne, int ligne){
String code=colonne+ligne;
return cases.get(code).getFormuleDeveloppe();
}
}
Class Case{
String colonne;
int ligne;
double valeur;
Formule formule;
ArrayList<Case> utiliseDans = new ArrayList<Case>();
String getFormuleDeveloppe(){
return this.formule.getFormuleDeveloppe();
}
}
4. Methode eval()
- Dans Addition :
Class Addition{
Case gauche;
Case droite;
double eval(){
if (!creerCycle)
return gauche + droite ;
else
lève une exception
}
}
- Dans Multiplication :
Class Multiplication{
Case gauche;
Case droite;
double eval(){
if (!creerCycle)
return gauche * droite ;
else
lève une exception
}
}
- Dans Soustraction :
Class Soustraction{
Case gauche;
Case droite;
double eval(){
if (!creerCycle)
return gauche - droite ;
else
lève une exception
}
}
- Dans Division :
Class Division{
Case gauche;
Case droite;
double eval(){
if (!creerCycle && droite!=0)
return gauche / droite ;
else
lève une exception
}
}
- Dans Moyenne :
Class Moyenne{
ArrayList<Case> listePlage = new ArrayList<Case>();
double eval(){
double val=0;
if (!creerCycle && listePlage.size()!=0 )
for(int i=0; i<listePlage.size(); i++)
val=listePlage.get(i).getValeur()+val;
return val/listePlage.size();
else
lève une exception
}
}
- Dans Somme :
Class Somme{
ArrayList<Case> listePlage = new ArrayList<Case>();
double eval(){
double val=0;
if (!creerCycle )
for(int i=0; i<listePlage.size(); i++)
val=listePlage.get(i).getValeur()+val;
return val;
else
lève une exception
}
}
5. Methode setValeur(fixerValeur)
Class Grille{
Map<String, Case> cases = new HashMap<>();
void setValeur( String colonne, int ligne,double value){
String code=colonne+ligne;
return cases.get(code).setValeur(double);
}
}
Class Case{
String colonne;
int ligne;
double valeur;
Formule formule;
ArrayList<Case> utiliseDans = new ArrayList<Case>();
void setValeur(double value){
valeur=value;
for(int i=0; i<utiliseDans.size(); i++)
utiliseDans.get(i).updateValeur();
}
}
5. Methode setFormule
Class Grille{
Map<String, Case> cases = new HashMap<>();
void setFormule( String colonne, int ligne,Formule formule){
String code=colonne+ligne;
return cases.get(code).setFormule(formula);
}
}
Class Case{
String colonne;
int ligne;
double valeur;
Formule formule;
ArrayList<Case> utiliseDans = new ArrayList<Case>();
void setFormule(Formule formula){
if (!formula.creerCycle())
formule=formula
this.updateValeur();
for(int i=0; i<utiliseDans.size(); i++)
utiliseDans.get(i).updateValeur();
else
lève une exception
}
}
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 :
- Création d'une case avec une valeur fixe
- Création d'une case avec une formule d'
Opération binaire
et une fonction commeMoyenne
- Modification d'une case avec une valeur sans qu'elle soit utilisée dans une autre case
- 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 de cycles (direct et indirect)
- Renvoie de la formule dévéloppée d'une case avec une formule assez compliqué