septembre
2008
Pour mon logiciel d’éducation, je dois composer avec plusieurs matières, et dans plusieurs pays. C’est peu dire que l’apprentissage du Baseball en France n’est pas le même qu’aux Etats-Unis, et que la Géographie n’est pas tout à fait identique en Colombie ou au Vénézuela, aussi le nombre de Matières à gérer est conséquent.
Je ne veux pas que les utilisateurs créent eux-même les matières, sinon on pourrait en trouver en double. Par exemple la matière Equitation alors qu’il peut y avoir ‘Spécialité Equitation’. Je préfère que ce soit une SousMatière de Sport. Je classerai donc les matières moi-même, selon la catégorie (litteraire, science), le pays, et avec des sous-matière. Et chaque type d’établissement, selon le pays, reçoit par défaut un groupe de matière.
Dans les premières versions de test, avec une quinzaine de matière inscrites dans MySQL, c’était déjà compliqué à classer : repérer les matière par des indexs de 1 à 15 n’est pas facile. Imaginez de 1 à 1000. Voici par contre ce que cela donne avec des Enum.
EnumSubject.java
* Subjects numeration
* @author Nicolas Zozol - http://www.edupassion.com - Robusta Web
*/
public enum EnumSubject {
/**
*FRENCH CLASSIC
*/
/*Foreign languages */
ALLEMAND(1, SubjectCategory.FOREIGN_LANGUAGE, "fr"), ANGLAIS(2, SubjectCategory.FOREIGN_LANGUAGE, "fr"),
ESPAGNOL(3, SubjectCategory.FOREIGN_LANGUAGE, "fr"), ARABE(4, SubjectCategory.FOREIGN_LANGUAGE, "fr"),
/* First languages */
FRANCAIS_EXPERT(21, " SubjectCategory.LITTERARY, "fr"), ALLEMAND_EXPERT(22, SubjectCategory.LITTERARY, "fr"),
/* Regional languages */
CORSE(31, SubjectCategory.REGIONAL_LANGUAGE, "fr"), BRETON(32,SubjectCategory.REGIONAL_LANGUAGE, "fr"), OCCITAN(33, SubjectCategory.REGIONAL_LANGUAGE, "fr"),
/* sciences */
MATH(51, SubjectCategory.SCIENCE, "fr"), SCIENCES_PHY(52, , SubjectCategory.SCIENCE, "fr"), SVT(53, SubjectCategory.SCIENCE, "fr"),
/* personal developpment */
ART_PLASTIQUE(71, SubjectCategory.ART, "fr"), MUSIQUE(72, SubjectCategory.ART, "fr"), THEATRE(73, SubjectCategory.ART, "fr"),
/**
* AMERICAN
*/
SOCIAL_STUDIES(501, SubjectCategory.HUMAN_SCIENCE, "us"),
/**
* ALL -- needs some translation, probably.
*/
OPTION1(1001, SubjectCategory.OTHER, "all"), OPTION2(1002, SubjectCategory.OTHER, "all");
int databaseValue;
SubjectCategory category;
private EnumSubject(int databaseValue,SubjectCategory category) {
this.databaseValue = databaseValue;
this.category = category;
}
public int getDatabaseValue() {
return databaseValue;
}
A priori, ca n’ajoute strictement rien à une base de donnée, SQL ou XML. Mais voici ce qui se passe lorsque je veux choisir les Matières par établissement :
Toujours dans EnumSubject.java
EnumSubject[] array = new EnumSubject[]{
ALLEMAND, ANGLAIS, ESPAGNOL, FLE,
LATIN, GREC,
ART_PLASTIQUE, MUSIQUE, THEATRE,
EPS, SPECIALITE_SPORT,
FRANCAIS_EXPERT, ALLEMAND_EXPERT,
CORSE, BRETON, OCCITAN, FLAMAND_REGION, BASQUE, CATALAN,
HIST_GEO, EDUC_CIV,
MATH, SCIENCES_PHY, SVT, TECHNO, INFORMATIQUE,
TRAVAUX_DIRIGES, PROJETS
};
return array;
}
public static EnumSubject[] getLyceeFrance() {
EnumSubject[] array = new EnumSubject[]{
ALLEMAND, ANGLAIS, ESPAGNOL, ARABE, CHINOIS, ITALIEN, FLE, FLAMMAND, RUSSE,
LATIN, GREC,
ART_PLASTIQUE, MUSIQUE, THEATRE,
EPS, SPECIALITE_SPORT,
FRANCAIS_EXPERT, ALLEMAND_EXPERT,
CORSE, BRETON, OCCITAN, FLAMAND_REGION, BASQUE, CATALAN,
HIST_GEO, EDUC_CIV, SES, PHILOSOPHIE,
MATH, SCIENCES_PHY, SVT, TECHNO, INFORMATIQUE, SCIENCES_INGENIEUR,
TPE, PROJETS
};
return array;
}
Puis dans SchoolType :
* Differents type of school accross the world
*/
public enum SchoolType {
OTHER(0, "all", "Other/Autre"),
INTERNATIONAL(1, "all", "International School"),
FR_Primaire(4, "fr", "Primaire"),
FR_CES(5,"fr", "Collège (au sens français)"), FR_LYCEE(6, "fr", "Lycée"), FR_CES_LYCEE(7, "fr", "Collège & Lycée"),
UNIVERSITE(8, "fr", "Supérieur"),
K(9, "us", "K"), Primary(10, "us", "Primary"), Secondary(11, "us", "Secondary"),
UNIVERSITY(12, "us", "University)");
(...)
public EnumSubject[] getStandardSubjects (){
switch (this){
case FR_Primaire : return EnumSubject.getPrimaireFrance();
case FR_CES : return EnumSubject.getCollegeFrance();
case FR_LYCEE : return EnumSubject.getLyceeFrance();
default : return null;
}
}
}
Voici une technique qui a certainement beaucoup de défauts, notamment lorsqu’il s’agira de faire des mises à jour :
- Il faut rebooter le serveur pour installer le nouveau .jar contenant ces infos
- Il faut changer le nom de la version du .jar car les browsers appelerons une applet, avec l’ancienne version en cache.
- Si le fichier contient un nombre très important de Matières, c’est un ensemble de données dont beaucoup sont inutiles pour l’utilisateur à charger, et la mise en mémoire de façon est sans doute peu efficace, côté serveur et client Applet
Mais c’est tellement plus simple à organiser. Pour obtenir un classement aussi efficace, à partir de MySQL, il faudrait que je fasse une petite applet. Et évidemment, c’est ce qu’il faudra faire, mais en attendant, c’est un répit sympathique. Je n’aurais pas déjà raté la rentrée scolaire ?
Aussitôt posté, aussitôt refactorisé :). Bloguer permet de mettre ses idées à l’écrit, et c’est souvent efficace.
En l’occurence, j’ai viré toute notion de pays ici. Ce sera traité ailleurs, où la distinction culturelle sera plus importante.
J’ai également enlevé tout ce qui est nom de la Matière. On est ici dans le code métier, et cela poserait de gros problèmes pour l’internationalisation, qui sera donc trraitée extérieurement.
Et je garderai probablement les Enums bien plus longtemps que prévu, pour un investissement de départ bien moindre qu’en utilisant une bdd.