Lister des objets par criteres

Lister des objets par criteres - Java - Programmation

Marsh Posté le 01-02-2008 à 18:55:36    

Bonjour,
 
Je démarre mon premier projet java et j'en suis à la phase d'analyse UML. C'est un projet universitaire.
 
Je ne suis donc pas encore dans la phase de développement (d'où mes lacunes), mais j'ai une question technique qui me permettrai d'avancer.
 
Je voulais savoir si il était possible d'avoir la liste des instances de classe ayant tel ou tel propriété.
 
Par exemple, avoir la liste des objets avec la propriété valeur=1 et la propriété complet=1.
 
Y'a t'il des fonctions toutes prete permettant un acces rapide ou étons obligé de boucler sur toutes les instances?
 
En vous remerciant par avance!
 
A+

Reply

Marsh Posté le 01-02-2008 à 18:55:36   

Reply

Marsh Posté le 01-02-2008 à 19:13:51    

Non, pas directement (à moins d'utiliser des fnoctions internes de la VM et d'avoir les droits d'accès qui peuvent être restreints par un classloader servant à isoler les objets).
Mais tu peux ajouter, dans la classe elle-même, les instances que tu crées en les ajoutant à une collection dont la référence est statique.
 
Exemple (raccourci):
 

Code :
  1. public class MaClasse {
  2.   static List INSTANCES = new LinkedList<MaClasse>();
  3.   public MaClasse() {
  4.     //(...) init diverses puis:
  5.     INSTANCES.add(this);
  6.   }
  7. }


 
Gros défaut quand on fait ça: les références aux objets sont enregistrées dans la collection et y restent indéfiniment même si elles ne sont plus utilisées ailleurs. La solution (partielle) est de ne pas stocker dans la collection des objets mais des WeakReference vers les instances. Mais cette fois ce sont les objets WeakReference qui vont persister dans la collection qui continuera à grossir indéfiniment (jusqu'à la mort de la VM).
 
Dernière solution: utiliser comme collection une HashMap de WeakReference vers tes instances, et gérer leur mort quand le GC va vouloir libérer les objets: il te faut alors retrouver dans la HashMap la WeakReference vers l'objet encore vivant, et remplacer cette WeakReference par null dans ta hashtable.
 
Tout ceci est bien compliqué pour un usage finalement limité. Il vaut mieux utiliser un constructeur utilisant en paramètre un paramètre pour l'objet Collection (par exemple un paramètre population) auquel la nouvelle instance créée sera ajoutée.
 
Si le but est de déboguer le programme pour voir qui utilise les instances et combien sont utilisées ou perdues car plus accessible depuis le point où elles sont susceptibles d'être encore utilisées, utilise plutôt la JVMDI pour parcourir le heap (à partir du programme lui-même où d'un client externe qui se connecte à cette VM via une interface remote accessible comme le port IP local que crée la VM pour permettre son débogage externe).
 
Après ça, c'est à toi de définir la pertinence de l'ajout des instances à la population: si la propriété est non mutable, il sufft d'ajouter l'objet à la population seulement quand il a la bonne valeur, sinon il te faut une boucle pour chercher parmi toutes les instances ayant actuellement une certaine valeur de propriété.
 
LA collection n'est pas nécessairement en mémoire: elle peut être aussi dans une table SQL (voir avec Hibernate comment sérialiser tes objets pour les stocker dans ta table, et faire ensuite des recherches par une requête SQL). Dans un projet UML, généralement on conçoit cette sérialisation d'objets et des collections (et leur persistance même après l'arrêt de la VM) avec un stockage externe, souvent via Hibernate en Java, ou d'autres méthodes à base de JavaBeans.


Message édité par verdy_p le 01-02-2008 à 19:25:45
Reply

Marsh Posté le 01-02-2008 à 19:32:03    

Salut et merci beaucoup pour ta réponse.
 
En fait, mon but est trés simple.
Je développe un petit jeu de carte et je voulais savoir si il était possible d'avoir la liste des cartes "rouge" présente sur le plateau.
 
Il n'y a donc pas de fonction direct permettant ca? Obligé de boucler?
 
Encore merci!


Message édité par akito06 le 01-02-2008 à 19:36:30
Reply

Marsh Posté le 02-02-2008 à 16:16:18    

Tu peux faire un manager qui trie tes cartes quand tu les enregistres

Code :
  1. public class CardManager {
  2.   private List<Card> redCard = new Vector<Card>();
  3.   private List<Card> otherCard = new Vector<Card();
  4.   public void save(Card c) {
  5.      if ( c.getColor() == Color.Red) {
  6.          redCard.add(c);
  7.      }else {
  8.         otherCard.add(c);
  9.      }
  10.   }
  11.  
  12.   public List<Card> getRedCard() { return redCard; }
  13. }
 


Message édité par zapan666 le 02-02-2008 à 16:24:58

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 02-02-2008 à 17:56:06    

Salut zapan666
 
Avec cette classe, je suis obligé d'envoyé chaque carte a la methode save (Card c)? non?
Donc je boucle sur mon jeu en envoyant la carte a chaque fois c'est ca?
 
Par exemple, au cours de la partie, si je veux savoir combien il reste de carte de type=roi, je boucle sur mes instance carte et j'appel ta methode?
 
Merci pour ton aide!

Message cité 1 fois
Message édité par akito06 le 02-02-2008 à 18:09:52
Reply

Marsh Posté le 02-02-2008 à 21:32:58    

akito06 a écrit :

Salut zapan666

 

Avec cette classe, je suis obligé d'envoyé chaque carte a la methode save (Card c)? non?
Donc je boucle sur mon jeu en envoyant la carte a chaque fois c'est ca?

 

Par exemple, au cours de la partie, si je veux savoir combien il reste de carte de type=roi, je boucle sur mes instance carte et j'appel ta methode?

 

Merci pour ton aide!


tu va boucler uniquement lors de la creation des cartes

Reply

Marsh Posté le 02-02-2008 à 22:44:03    

Merci pour ta réponse.
 
Ok j'ai mieux compris ta classe. En fait tu voudrais que j'envoie chaque carte lors de la création et qu'elle soit trié selon la couleur par ta methode.
 
Mais je ne peux pas faire ça, car si je veux a un moment du jeu savoir les cartes "2" qui sont sur le plateau, il faudra que j'ai fait au préalable le tri des cartes selon le chiffre dans ta méthode, et effacer les cartes de la liste...
 
On ne peut pas directement faire ca sur les instances de cartes?

Reply

Marsh Posté le 03-02-2008 à 00:57:54    

Ce que te propose zapan666 c'est de stocker une référence de chaque carte dans une liste lui correspondant, par ex :  
 - une liste des cartes rouges qui recevra les cartes rouges
 - une liste des cartes non rouges qui recevra les cartes non rouges
 
Je pense que c'est une bonne piste mais qu'il est possible de faire un peu mieux. Avant de l'exprimer ici j'aimerais que tu nous présentes un diagramme de classes qui montre la relation qui unit le plateau et les cartes.


Message édité par charly007 le 03-02-2008 à 01:00:42
Reply

Marsh Posté le 03-02-2008 à 03:09:43    

Un diagramme de classes... tu y vas fort à parler tout de suite UML à quelqu'un qui visiblement début dans l'objet et s'essaye à Java.
Il me semble qu'on connait un peu Java (le plus souvent) avant de maitriser la modélisation. A moins que ce soit un étudiant qui n'ai vu UML qu'en C++, ce qui serait étonnant, vu qu'aux endroits où un ensigne ça, on leur apprend aussi C++, Java, C#/.Net, Ada, et des bases pour SQL (souvent Oracle et MySQL).
Il me semble que déjà il ne connait pas les modèles objets de base: conteneurs ou collections (listes triées ou non, tables de hachage, arbres...) ce qu'il faut savoir pour implémenter ensuite un modèle, alors que déjà il commence à parler de "boucles" c'est à dire un ancien réflexe de programmation structurée (de quelqu'un qui a fait un peu trop de C ou de Basic ou de bouts de codes en assembleur) et non d'objets.
 
En principe, si on parle de modélisation de données, on ne se pose pas d'abord la question de comment on va écrire les boucles, on sait à l'avance les structures de données adaptées au modèle, et on sait aussi que les modèles fournissent presque automatiquement les méthodes et algorithmes de traitement correspondants. On ne raisonne plus au bas niveau mais au niveau supérieur.
 
Mais ma réponse était trop générique pour son problème (qui était mal posé puisqu'en fait son problème n'est pas aussi générique qu'il l'avait décrit). En fait tu as touché du doigt le problème: il ne sait pas encore modéliser son problème, il apprend. On pourra toujours lui donner des bouts de code, mais ça ne servira pas à grand chose q'ils les remploie à l'aveugle.
 
Ce que je peux lui suggérer c'est déjà de consulter la JavaDoc des collections en Java. Ce sera indispensable pour déjà en faire le tour en comprenant les différences entre les structures de données représentées par les interfaces qu'elles implémentents.
 
S'il ne comprend pas non plus les interfaces, il va falloir se repencher sur leur signification en Java (qui sépare clairement le concept de classes et d'interfaces là où C++ mélange tout), sinon pas moyen de comprendre comment on est sensé utiliser correctement les collections, au moyens de méthodes où on évite en le plus possible d'écrire du code pour les parcourir et traiter tous les cas, tout en restant efficace globalement (bien sûr un puriste du C ou de l'asembleur verra des tas d'optimisations locales, mais le développement objet se fiche de ce détail qui n'intervient qu'à la fin mais pas en phase de conception, et ne remet pas en cause le projet, au contraire d'une optimisation trop en avance qui oublie comment les modules écrits vont s'imbriquer, et devoir se généraliser pour être réutilisé ensuite, mais surtout bien testé).

Reply

Marsh Posté le 03-02-2008 à 13:49:20    

verdy_p a écrit :

Un diagramme de classes... tu y vas fort à parler tout de suite UML à quelqu'un qui visiblement début dans l'objet et s'essaye à Java.


C'est lui qui en parle dans son premier post  ;)
 
A défaut d'un diagramme de classes, je voudrais qu'il me dise la relation qui unit le plateau de jeu et les cartes et aussi l'ensemble des critères de recherche de ses cartes.


Message édité par charly007 le 03-02-2008 à 15:29:41
Reply

Marsh Posté le 03-02-2008 à 13:49:20   

Reply

Marsh Posté le 06-02-2008 à 21:56:06    

Bonjour et merci pour vos réponses!
 
charly007, tu n'as pas tord de parler de diagramme de classe, car en effet mon projet démarre par une analyse UML.
 
En fait, je suis au tout début du projet, dans la phase de réflexion, avant meme la conception UML.
 
Donc je pense a mon jeu dans son ensemble, et ce qui me bloquait ici, est qu'avant d'écrire la classe carte, je voulais en savoir un peu plus sur comment j'allais pouvoir accéder à ces cartes en cours de jeu.
 
Le jeu sera simple, un jeu de type memory, mais se jouant contre l'ordinateur.
 
L'ordinateur mémorisera a chaque coup les cartes qu'il a "vu" sur le plateau (avec plus ou moins d'efficacité pour se rapprocher de la réalité).
 
Quand l'ordinateur va jouer, il devra savoir quelles cartes sont les mieux mémorisées. Donc la carte aura par exemple une propriété memo=10.
A un instant T, j'aurai besoin d'avoir la liste de toutes les cartes ayant la propriété memo>=10.
 
Pour evaluer si ma conception sera réalisable, je voulais juste savoir si c'était faisable en java, d'avoir la liste des objets répondant a des criéteres de propriété de maniere simple.
 
J'espere que mon explication est compréhensible.
 
En tout cas, merci pour votre aide!

Reply

Marsh Posté le 06-02-2008 à 22:42:37    

akito06 a écrit :


Pour evaluer si ma conception sera réalisable, je voulais juste savoir si c'était faisable en java, d'avoir la liste des objets répondant a des criéteres de propriété de maniere simple.


En informatique, tout est possible.

 

Pour ton projet, tu devrais réfléchir en terme de programmation par contrat, genre

 
Code :
  1. List<Card> getRedCardFromPlayer(Player p);


tu sais que ça doit retourner les cartes rouges du joueur P.
Comment c'est fait. On s'en fou complètement, tant que ça fait ce que ça doit faire (le contrat). C'est l'implémentation qui va en décider, de la manière de répondre à ce contrat.

 


Message édité par zapan666 le 06-02-2008 à 22:43:06

---------------
my flick r - Just Tab it !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed