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

MVC Discussion :

MVC et séparation des couches


Sujet :

MVC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut MVC et séparation des couches
    Bonjour à tous,

    je me trouve face à un soucis auquel j'ai bien une idée pour le résoudre, mais j'aimerai votre avis.

    Supposons un DAO avec une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Individu> findAll();
    Qui se connecte à une BDD, et peuple la liste à partir d'une table.

    Puis une couche BR (Business Rules), avec une méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Individu> findAllIndividu();
    Qui retourne simplement la liste retourné par la méthode findAll du DAO précédent.

    Et enfin, une fenêtre (JForm) affichant dans un tableau (JTable) le résultat de la méthode findAllIndividu du BR.
    Jusque là, pas de grande difficulté.
    Maintenant, j'aimerai affiché en bas de l'écran l'état d'avancement du chargement de la liste, avec un message de ce style:

    x individus chargé(s) - Avec x variant de 0 au nombre d'individu dans la liste, dynamiquement.

    Comment feriez-vous cela en gardant une bonne séparation des couches ?
    Car dans mon cas, c'est la couche DAO qui impacte sur ce que la Vue affiche !

    La solution à laquelle j'ai pensé, c'est d'utiliser les Listeners, et créer par exemple un CountListener - ayant une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void countUpdated(int x);
    implémenté par le Controler, qui a chaque appel de cette méthode mettra le Model à jour.
    Or, il faudra faire cela dans la couche DAO, pour prévenir la couche BR. Puis le faire dans la couche BR, pour enfin prévenir le controler... Ca fait pas mal de boulot pour "pas grand chose" !?

    L'autre idée que j'ai, est de passé le Model à la couche BR, qui le repasse à la couche DAO, qui elle met à jour le nombre de donnée chargé à chaque itération directement dans le Model. Mais maintenant, la couche DAO fait autre chose qu'accéder aux données :'(

    Qu'en pensez vous ?

  2. #2
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Le problème, c'est que tu attaques une base de données, avec du SQL derrière, et qu'il n'existe pas de moyen de suivre l'avancement du chargement avec. Impossible donc à moins d'utiliser des curseurs et autres choses du genre.

    À mon avis, tu devrais utiliser une barre de progression infinie (car le temps de chargement ou le taux d'avancement est inconnu / non borné), et laisser tomber l'idée du "x individus chargés" et le remplacer par "chargement en cours".

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Citation Envoyé par Patriarch24 Voir le message
    Le problème, c'est que tu attaques une base de données, avec du SQL derrière, et qu'il n'existe pas de moyen de suivre l'avancement du chargement avec. Impossible donc à moins d'utiliser des curseurs et autres choses du genre.
    Si, ça je peux l'avoir facilement. J'utilise JDBC pour mes DAO, donc je peuple les liste moi même et j'ai donc accès à l'index incrémenté.
    J'aimerai juste connaitre la meilleure façon de le faire.

  4. #4
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Dans ce cas, il faut utiliser des évènements.

    Un évènement est lancé (IndividuCountUpdatedEvent par exemple) depuis le DAO, récupéré par un contrôleur, qui met à jour le modèle associé à la barre de progression. Peut-être que tu peux directement traiter l'évènement depuis le modèle associé à la barre de progression (ça ne me semble pas illogique à première vue).

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    J'aime bien ton idée du Listener:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface DaoEventListener {
    	void progress(int currentrow, int rowcount);
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyDAO {
     
    	public List<Individu> findAll() { return findAll(null); }
     
    	public List<Individu> findAll(DaoEventListener listener) {
    		/* ... */
    		while(rs.next()) {
    			if (listener!=null) listener.progress(currentrow,rowcount);
    			/* ... */
    		}
    	}
    }

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    J'aime bien ton idée du Listener:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface DaoEventListener {
    	void progress(int currentrow, int rowcount);
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyDAO {
     
    	public List<Individu> findAll() { return findAll(null); }
     
    	public List<Individu> findAll(DaoEventListener listener) {
    		/* ... */
    		while(rs.next()) {
    			if (listener!=null) listener.progress(currentrow,rowcount);
    			/* ... */
    		}
    	}
    }
    Je le voyais pas exactement comme ça, car là du coup, ça limite à un seul listener, mais l'idée me séduit quand même !

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par DeathMaker Voir le message
    Je le voyais pas exactement comme ça, car là du coup, ça limite à un seul listener, mais l'idée me séduit quand même !
    Sinon tu peux injecter tes Listener par des Setters de la classe DAO. Comme cela tu peux en avoir plusieurs.

    Code java : 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
    public class MyDAO {
     
    	private DaoEnumerateListener enumeratelistener = null;
     
    	public void SetEnumerateListener(DaoEnumerateListener listener) {
    		this.enumeratelistener = listener;
    	}
     
    	public List<Individu> findAll() {
    		/* .. */
    		while(rs.next()) {
    			if (this.enumeratelistener!=null) this.enumeratelistener.progress(currentrow,rowcount);
    			/* ... */
    		}
    	}
    }

Discussions similaires

  1. [PDO] Séparation des couches et portabilité d'une requêtes SQL
    Par dancom5 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/04/2014, 01h15
  2. [C#] MVC et séparation des données
    Par wiemwiem dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/06/2011, 09h59
  3. Séparation des couches avec Hibernate
    Par mclane1 dans le forum Hibernate
    Réponses: 2
    Dernier message: 09/07/2009, 10h48
  4. Réponses: 3
    Dernier message: 26/12/2007, 10h34
  5. [Design] Séparation des couches
    Par brousaille dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 17
    Dernier message: 16/03/2005, 21h34

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