IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation par agent Java Discussion :

Un Problème d'instance


Sujet :

Programmation par agent Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de kululu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2009
    Messages : 120
    Par défaut Un Problème d'instance
    Bonjour

    J'ai un petit soucis:
    Tout d'abord je vous explique ma situation
    Je veux créer 2 agents communicants tout simple :
    _un 1er Agent vérifie si la porte de la maison est ouverte et si non il appelle le portier
    _Le 2eme Agent, le portier viens à la rescousse du 1er en lui ouvrant la porte si elle est fermée

    Pour cela j'ai créé une classe Déménageur(le 1er agent), une classe Portier, et enfin une classe Maison

    Maison n'est pas un agent mais possèdes les Attribut tel que le boolean qui dit si la porte est ouverte (que l'on récupère avec un geteur)

    Or pour utiliser les méthodes de la classe Maison (les geteurs et les seteurs) je dois instancier la classe Maison dans mes 2 agents (en faisant new Maison() ) mais si je fais cela j'aurais donc une "maison" différente (donc 2 instances différente) de la maison

    Quel pourrait-être la solution pour que mes 2 agents utilisent la même instance de Maison? (ou ptêt bien qu'c'est po possible?)

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par kululu Voir le message
    Quel pourrait-être la solution pour que mes 2 agents utilisent la même instance de Maison? (ou ptêt bien qu'c'est po possible?)
    Evidemment que c'est possible !
    Sinon on n'irait pas bien loin avec la programmation objet

    J'imagine d'après ta description que tu fais quelque chose de ce genre dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Portier {
       private Maison maison;
       public Portier() {
          this.maison = new Maison();
       }
    }
     
    public class Demenageur{
       private Maison maison;
       public Demenageur() {
          this.maison = new Maison();
       }
    }
     
    public static void main(String[] args) {
       Portier portier = new Portier();
       Demenageur demenageur = new Demenageur();
    }
    Solution : au lieu de créer une nouvelle instance de maison dans les constructeurs des classes Portier et Demenageur, passe plutôt ta maison déjà instanciée en paramètre des constructeurs.
    Ça te permet d'affecter le portier et le déménageur à la maison que tu veux, plutôt que de les affecter systématiquement à une nouvelle maison, inconnue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Portier {
       private Maison maison;
       public Portier(Maison maison) {
          this.maison = maison;
       }
    }
     
    public class Demenageur{
       private Maison maison;
       public Demenageur(Maison maison) {
          this.maison = maison;
       }
    }
     
    public static void main(String[] args) {
       Maison maison = new Maison();
       Portier portier = new Portier(maison);
       Demenageur demenageur = new Demenageur(maison);
    }



    EDIT

    Par ailleurs, tu peux aussi décider de ne pas affecter "définitivement" un agent à une maison (et donc supprimer le champ maison) mais de passer en paramètre la maison aux méthodes qui l'utilisent.
    C'est à dire au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Portier {
       private Maison maison;
       public Portier(Maison maison) {
          this.maison = maison;
       }
       public ouvrir() {
          // traitement sur la maison
       }
    }
    faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Portier {
       public Portier() {
       }
       public ouvrir(Maison maison) {
          // traitement sur la maison
       }
    }
    Ça dépend de la relation entre tes agents et les maisons : est-ce que tout au long de sa vie un agent est affecté à une maison (et alors il est logique de garder dans la classe une référence sur une instance de Maison) ou est-ce qu'un agent peut agir sur n'importe quelle maison (et alors il est logique de passer la maison en paramètre des actions que peut effectuer l'agent) ?

  3. #3
    Membre confirmé Avatar de kululu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2009
    Messages : 120
    Par défaut
    Merci Astartee en effet j'y avais pensé à la solution de mettre en paramètre (dans la méthode main) la Maison lorsque j'instancie mes 2 agents

    Mais le prolème c'est que j'utilise JADE (un Framework multi-agent) et donc je ne passe pas par un main (mais par une ligne de commande qui me créé mon agent)

    Je suis débutant encore dans l'utilisation de JADE mais je me demande si ça pourrait marcher ça :

    -gui jade.Boot totoDemenageuremenageur(maison) //<-- paramètre Maison
    -gui jade.Boot titiPortierortier(maison)

    Mais si oui comment le JVM saura que c'est de la MEME maison que l'on parle?
    De plus si je ne m'abuse les parmètres entre parenthèse sont des String et non des objet :s

  4. #4
    Membre confirmé Avatar de kululu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2009
    Messages : 120
    Par défaut
    Bonne idée darrylsite un seteur de Maison Mais comment faire toujours si j'ai pas de main?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par kululu Voir le message
    Mais le prolème c'est que j'utilise JADE (un Framework multi-agent) et donc je ne passe pas par un main (mais par une ligne de commande qui me créé mon agent)
    Ah bah si tu utilises un framework spécial au lieu d'écrire directement du code Java, il faut le dire tout de suite, ça évite de perdre du temps à répondre à côté de la plaque
    Je ne connais pas JADE, il faudra attendre quelqu'un d'autre pour t'aider...

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Par défaut
    Sinon une autre solution consiste à mettre les variables importantes que tes deux classes démenageur et portier vont tout deux utiliser en static.
    Cela signifie que même si tu as deux instances différentes de la classe maison, elle auront toutes les deux accès à la même variable static !
    Mais sinon la première solution reste la mieux enfin cela dépend de ce que tu comptes faire !

  7. #7
    Membre averti
    Profil pro
    Architecte technique
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Par défaut
    Bonjour,

    Sinon, tu peux utiliser le design pattern (=patron de conception) Singleton.
    Le principe est simple : tu crées une classe où tu t'assures qu'une seule instance de ta classe sera crée.

    Pour cela, tu rends le constructeur de ta classe Maison privé, tu utilises une instance privée statique de ta classe Maison, et tu crées une méthode statique getInstance qui :
    • crée une nouvelle instance de ta classe maison si elle n'a jamais été instanciée
    • renvoie l'instance statique si la méthode a déja été appellée.


    Dans ton cas, tu auras le code suivant (un bout de code vaut toujours mieux qu'un long discours ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class Maison{
     
        private static Maison monUniqueMaison; // Ton instance privée statique
     
        /* Le constructeur privé de ta classe Maison */
        private Maison() {
        }
     
        /* La méthode statique que tes agents appelleront à chaque fois qu'ils
        veulent accéder à "la" maison */
        public static Maison getInstance() {
            if (monUniqueMaison == null) {
                monUniqueMaison= new Maison();
            }
            return monUniqueMaison;
        }
    }
    Avec ca, tu peux être sûr qu'il n'y aura qu'une seule Maison dans ton application

    Pour + d'infos sur le design pattern Singleton, regarde ici

  8. #8
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par kululu Voir le message
    Bonjour
    Quel pourrait-être la solution pour que mes 2 agents utilisent la même instance de Maison? (ou ptêt bien qu'c'est po possible?)

    Merci d'avance
    Pour avoir la meme classe maison dans les deux agents, il te suffit de creer d'abord la maison et ensuite passer la reference de la classe maison à tes agents via une methode.
    En gros,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Maison laMaison= new Maison();
    Agent agent1= new Agent("nom", ...);
    Agent agent2=new Agent("non",...);
     
    agent1.setMaison(laMaison);
    agent2.setMaison(laMaison);
    La classe Agent possede une proprité dont laquelle on va garder la refence de maison.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème connexion - instance utilisateur
    Par LE VIEUX dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 26/09/2008, 09h46
  2. Problème d'instance avec création de plusieurs dialog ?
    Par supergrey dans le forum Windows
    Réponses: 2
    Dernier message: 19/09/2008, 18h05
  3. Problème 2 instances de base de données
    Par Plastic84 dans le forum Connexions aux bases de données
    Réponses: 5
    Dernier message: 31/03/2008, 14h43
  4. problème objets instanciés
    Par polo42 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/06/2007, 15h35
  5. Problème plusieurs instances MS-SQLSERVER!
    Par pegautier dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/11/2006, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo