Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de modularité

3 réponses
Avatar
kiddy
Salut a tous,

J'ai une classe F, deux classes C1 et C2 qui heritent de F.
Un utilisateur veut creer un objet F (C1 ou C2 je ne sais pas).
cet objet, je l'ajoute a une liste d'objet F.
Maintenant je veux recuperer un objet F de la liste par une methode get.
Ma liste d'objet F est stockée dans un fichier.
quand je recupere tous les attributs de objet F, je sais si cet objet est
C1 ou C2.
donc pour le creer je fais un new C1(...) ou new C2(...)


Mon probleme est donc si je veux creer plus tard un objet C3 qui herite
de F. Je vais avoir un nouveau test dans ma methode get pour savoir si
cet objet est C3.

et apres si j'ai 1000 objets qui heritent de F, je vais avoir 1000 test
dans get (c pas top).

Avez vous une autre solution a mon problème (des methode cachées dans
java qui peuvent m'aider ;) )
car mon but serai de creer des objets qui heritent de F sans modifier ma
methode get.

Merci d'avance
Kiddy

3 réponses

Avatar
Jc Sirot
kiddy wrote:
J'ai une classe F, deux classes C1 et C2 qui heritent de F.
Un utilisateur veut creer un objet F (C1 ou C2 je ne sais pas).
cet objet, je l'ajoute a une liste d'objet F.
Maintenant je veux recuperer un objet F de la liste par une methode get.
Ma liste d'objet F est stockée dans un fichier.
quand je recupere tous les attributs de objet F, je sais si cet objet est
C1 ou C2.
donc pour le creer je fais un new C1(...) ou new C2(...)

Mon probleme est donc si je veux creer plus tard un objet C3 qui herite
de F. Je vais avoir un nouveau test dans ma methode get pour savoir si
cet objet est C3.

et apres si j'ai 1000 objets qui heritent de F, je vais avoir 1000 test
dans get (c pas top).

Avez vous une autre solution a mon problème (des methode cachées dans
java qui peuvent m'aider ;) )


Je suppose que tu as défini deux classes que j'ai nommé FFileEntries et
FFileEntry. FFileEntries permet d'accéder aux objets de type F dans le
fichier avec les méthodes hasMoreElements() et nextElement() ;
FFileEntries est construit à partir d'un objet de type File. Chaque
objet de type F est représenté par un objet de type FFileEntry qui
contient les attributs de l'objet et un id qui indique le type réel C1,
C2... ou Cn.

public F get()
throws IOException,
ClassNotFoundException,
InstantiationException,
IllegalAccessException
{
File file = new File(FICHIER_AVEC_LES_OBJETS_F)
/*
* on construit la liste des représentations de F dans le fichier.
*/
FFileEntries entries = new FFileEntries(file);
while (entries.hasMoreElements()) {
/*
* nouvelle entrée dans le fichier
*/
FFileEntry entry = entries.nextElement();
/*
* On récupère la class correspondante par exemple
* dans une HashMap.
*/
String className = entryClass.get(entry.getClassId());
Class clazz = Class.forName(className);
/*
* On l'instancie l'objet Ci
*/
F f = (F)clazz.newInstance();
/*
* on appelle la méthode :
* void populate(FFileEntry entry)
*
* elle est déclarée abstract dans F et définie
* dans chaque Ci pour initialiser les attributs
* propres à chaque sous-classe de F.
*/
f.populate(entry);
return f;
}


--

Cordialement
-- JC Sirot

Avatar
Nicolas Delsaux
Le 13 avr. 2004, kiddy s'est levé(e) et s'est dit "tiens, si j'écrivais
aux mecs de fr.comp.lang.java"

Salut a tous,

J'ai une classe F, deux classes C1 et C2 qui heritent de F.
Un utilisateur veut creer un objet F (C1 ou C2 je ne sais pas).
cet objet, je l'ajoute a une liste d'objet F.
Maintenant je veux recuperer un objet F de la liste par une methode
get. Ma liste d'objet F est stockée dans un fichier.
quand je recupere tous les attributs de objet F, je sais si cet objet
est C1 ou C2.
donc pour le creer je fais un new C1(...) ou new C2(...)


Mon probleme est donc si je veux creer plus tard un objet C3 qui
herite de F. Je vais avoir un nouveau test dans ma methode get pour
savoir si cet objet est C3.


Déja entendu parler de design patterns ? Et en particulier du design
pattern "factory" ? Parce que c'est exactement conçu pour ce type de
situation :
tu as un certain nombre d'objets en entrée (dans ton cas une chaîne de
caractères ou un tableau de chaînes).
En fonction de leur valeur, tu vas créer un objet C1 ou C2, mais en tout
cas un objet F. Je te proposes la chose suivante :
- tu crées une classe FFactory, qui crée des objets de classe F.
- Cette classe n'a qu'une méthode : public F createF(String line){...}
Celle-ci examine le contenu de la ligne, et crée le bon objet.
Et voilà !
Ainsi, tu n'as plus besoin d'un code de création complexe dans F !

et apres si j'ai 1000 objets qui heritent de F, je vais avoir 1000
test dans get (c pas top).

car mon but serai de creer des objets qui heritent de F sans modifier
ma methode get.


Tu veux générer de nouvelles sous-classes sans modifier le code de ta
classe de création d'objet (maintenant FFactory) ? Là, tu risques de
devoir faire appel à la magie noire Java...

Merci d'avance
Kiddy



--
Nicolas Delsaux
AN>Faire de la pub, c'est se mettre sur le même plan que Begbeider,
Séguéla ou Raffarin.
AN>C'est quand même ultime les boules.
in frab la pub

Avatar
Olivier Demaine
J'ai une classe F, deux classes C1 et C2 qui heritent de F.
Un utilisateur veut creer un objet F (C1 ou C2 je ne sais pas).
cet objet, je l'ajoute a une liste d'objet F.
Maintenant je veux recuperer un objet F de la liste par une methode
get. Ma liste d'objet F est stockée dans un fichier.
quand je recupere tous les attributs de objet F, je sais si cet objet
est C1 ou C2.
donc pour le creer je fais un new C1(...) ou new C2(...)


Mon probleme est donc si je veux creer plus tard un objet C3 qui
herite de F. Je vais avoir un nouveau test dans ma methode get pour
savoir si cet objet est C3.


Déja entendu parler de design patterns ? Et en particulier du design
pattern "factory" ? Parce que c'est exactement conçu pour ce type de
situation :
tu as un certain nombre d'objets en entrée (dans ton cas une chaîne de
caractères ou un tableau de chaînes).
En fonction de leur valeur, tu vas créer un objet C1 ou C2, mais en tout
cas un objet F. Je te proposes la chose suivante :
- tu crées une classe FFactory, qui crée des objets de classe F.
- Cette classe n'a qu'une méthode : public F createF(String line){...}
Celle-ci examine le contenu de la ligne, et crée le bon objet.
Et voilà !
Ainsi, tu n'as plus besoin d'un code de création complexe dans F !

et apres si j'ai 1000 objets qui heritent de F, je vais avoir 1000
test dans get (c pas top).

car mon but serai de creer des objets qui heritent de F sans modifier
ma methode get.


Tu veux générer de nouvelles sous-classes sans modifier le code de ta
classe de création d'objet (maintenant FFactory) ? Là, tu risques de
devoir faire appel à la magie noire Java...


Si c'est stocké dans un fichier on peut très bien y mettre aussi le nom de
la classe à charger, comme ca dans le factory
on peut avoir une méthode qui fait :

public F build(Strinf classeName) {
Class c = Class.forName(classeName);
return (F)c.newInstance();
}

Olivier