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

Servlets/JSP Java Discussion :

Modélisation : où faire les contrôles métiers


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut Modélisation : où faire les contrôles métiers
    Bonjour,
    Je ne sais pas trop où posté ce post... alors n'hésitez pas à le déplacer.
    voici le contexte :
    une table avec 2 colonnes :
    - id (integer, auto-increment, pk, unique)
    - libelle (varchar2(100), unique, not-null)
    comme vous le voyez, la colonne "libelle" est unique.
    Je préfère ajouter une clé primaire "id" pour les relations futures de cette table avec les autres tables.

    je dois implémenter avec Struts/hibernate l'IHM de gestion de cette table :
    create, read, update et delete

    j'ai les class et package suivantes :
    xxx.model.Table : objet de persistance mappé avec hibernate

    <Interface>xxx.dao.TableDao : (couche DAO)
    Table create(Table);
    void update(Table)
    void delete(Table);
    Table find(id);
    List<Table> search();
    boolean isLibelleExiste(libelle);

    xxx.dao.impl.TableDaoImpl implements TableDao


    <Interface>xxx.service.TableService (couche service utilisée par le Controller)
    Table create(Table);
    void update(Table)
    void delete(Table);
    Table find(id);
    List<Table> search();

    xxx.service.impl.TableServiceImpl implements TableService


    xxx.form.TableForm extends ActionForm: formulaire Struts
    xxx.action.TableCreerAction extends Action : Controller de création

    La question que je me pose est la suivante :
    où coder le fait qu'un libellé doit être unique lors de la création/modification?
    1) Je fais un service "boolean isLibelleExiste(libelle);" qui est appelé dans la méthode validate du formulaire
    2) Dans les méthodes create et update du service, je fais appel à la méthode "getDao.isLibelleExiste(libelle)"
    3) c'est dans la couche DAO que je fais le contrôle?
    3) faire 1) et 2) et 3).

    La solution 1 ne me convient pas.... car le service est alors dépendant de l'IHM...
    Je trouve que le faire dans la couche DAO... c'est trop bas... et ça enlève le rôle de la couche service
    en fait, la question est : à qui puis-je faire confiance?
    qu'en pensez-vous?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Personnellement je le ferai dans la couche de service parce que :

    IHM : Si tu modifies l'IHM tu auras vite fait de cour-circuiter ton contrôle (+ quel est l'intérêt de la couche service si tout est dans l'IHM)

    DAO : Les DAO ne servent qu'à représenter les accès à la base de donnée, ils ne sont pas sensés apporter de la valeur ajoutée telle que les contrôles métier

  3. #3
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    Si tu veux être conforme aux design patterns J2EE, il manque un intervenant entre ta couche service et ta couche DAO : une couche métier (constituée de Business Objects ou BO).

    En fait, la différence entre ta couche service et cette couche métier est que la couche service ne doit être constituée que de façades.
    De plus, un même service peut faire appel à plusieurs BO (ce qui ne sera pas vrai dans ton exemple).

    Dans ton cas, tu aurais donc "TableCreerAction" <-> "TableService" <-> "TableBO" <-> "TableDao", "TableService" n'étant qu'une façade faisant appel à "TableBO".
    Pour répondre à ta question, les règles métiers (comme celle que tu veux implémenter) doivent être placées dans la couche métier.

    J'espère que mes explications sont claires...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    bonjour,
    si j'ai bien compris :
    l'action fait appel aux interfaces de la couche Service....
    la couche Service est composée d'une interface et d'une implémentation et l'implémentation fait appel aux interfaces de la couche BO
    La couche BO contient une interface et une implémentation et l'implémentation fait appel à la couche DAO via les interfaces de la couche DAO

    donc, au lieu de mettre mes régles métiers dans la couche service, je dois les mettre dans la couche BO : oki, ça me convient...

    tu dis qu'un service peut faire appel à plusieurs BO.... peux-tu me donner un exemple où c'est le cas?
    car sinon, quelle est la plus-value de la couche service?

  5. #5
    Membre expérimenté Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Par défaut
    Un service peut non seulement utiliser plusieurs BO différents mais également faire appel à plusieurs méthodes d'un même BO.

    Pour reprendre un exemple qui est disponible dans les tutoriaux de Developpez.com, suppose que tu développes une application permettant de gérer un forum.
    Considèrons la fonctionnalité "Déplacer un thread" (un thread étant simplement une série de messages).
    Lorsqu'un utilisateur désire déplacer un thread, ton application doit, entre autre,
    1. trouver tous les messages qui constituent le thread à déplacer
    2. déplacer chacun de ces messages

    Pour implémenter cela, tu pourrais créer un "ThreadManagementService" possèdant une méthode "move(...)" permettant de déplacer un thread.
    Cette méthode appelerait à son tour les méthodes "findMessagesByThread(...)" et "moveMessage(...)" d'un "MessageBO".

    Autrement dit, les façades représentent les fonctionnalités "globales" de ton application tout en cachant les détails d'implémentation de ces fonctionnalités.

    Pour information, les façades sont généralement implémentées comme des stateless session beans (EJB).

Discussions similaires

  1. [DAO] Faire le lien entre les VO et les Objets Métiers
    Par mauvais_karma dans le forum Hibernate
    Réponses: 12
    Dernier message: 25/11/2005, 15h19
  2. Réponses: 2
    Dernier message: 04/02/2005, 11h03
  3. Réponses: 1
    Dernier message: 27/10/2004, 15h36
  4. Mettre en relation les contrôles DBLookUpComboBox et DBGrid
    Par Gendarmette dans le forum Bases de données
    Réponses: 7
    Dernier message: 19/01/2004, 13h16

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