Article complet: Les Enums comme base de données READ-ONLY

18/09/2008

Permalink 10:30:11, Catégories: Java, Langage(s), 891 mots   French (FR) , Nicolas Zozol

[Java] Les Enums comme base de données READ-ONLY

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.

[Suite:]

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

 
 
public static EnumSubject[] getCollegeFrance() { 
 
  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 ? :(

Social Bookmarking:

                                     

Commentaires:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: Nicolas Zozol [Membre] · http://www.edupassion.com
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.
Permalien 18/09/2008 @ 11:22

Vous devez être identifié pour poster un commentaire.

Liste des blogs

Robusta : Java & RESTful Web Services

Il s'agit d'un Blog sur les meilleures utilisations de REST dans un environnement JAVA. Le Blog contient également du contenu sur la technologie Ajax et également un journal de bord sur le développement du site pédagogique http://www.Edupassion.com

Nicolas Zozol - Edupassion.com

Catégories


Rechercher

<  Février 2012  >
Lun Mar Mer Jeu Ven Sam Dim
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web