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

Architecture Discussion :

Architecture en couches : façades et factory


Sujet :

Architecture

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut Architecture en couches : façades et factory
    Bonjour,

    J'ai une architecture avec une couche façade dans laquelle on trouve les modules :
    * facade : contenant les interfaces (java) des façades. Il est indépendant du module services de la couche métier ;
    * facadeImpl : contenant les implémentations des interfaces des façades. Il a une dépendance vers le module services de la couche métier.

    Je veux ajouter une factory pour permettre au client d'accéder aux interfaces. Cette factory permettra au client d'instancier les classes de facadeImpl sans qu'il ait accès à ce module. Le client ne connaît que le module facade.

    Je voudrais savoir où mettre la factory dans le découpage de mon application.

    Est-ce que je le met dans le module facade ou je le met dans un module à part ? Sachant qu'il devra être accessible par le client.

    A quoi sert vraiment le fait d'avoir facade et facadeImpl ? Quelle est la valeur ajoutée d'avoir des interfaces et ensuite une implémentation de ces interfaces dans la couche facade ?

    Cordialement.

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 561
    Points : 7 260
    Points
    7 260
    Par défaut
    Bonjour,

    Tu pourrais mettre ta factory dans le module facade; ça n'est pas très important (tu peux regarder la hiérarchie du package java.net par exemple).

    L'intérêt des interfaces est multiple; parmi les plus intéressants:
    • cela permet d'avoir un couplage faible entre tes classes, très utile par exemple si tu dois écrire des tests unitaires. (tu passe alors par des objets factices ou mock objects)
    • cela permet à des équipes différentes de travailler en même temps sur des parties différentes d'un même projet, et de pouvoir connecter ces parties entre elles à la fin (programmation par contrat)
    • cela permet de pouvoir changer/tester des implémentations de tes interfaces à la volée, et c'est particulièrement puissant quand tu utilise des patterns tels que l'IoC
    • l'héritage multiple n'existant pas pour les classes en Java, cela permet de pouvoir l'émuler: une classe peut implémenter autant d'interfaces qu'elle veut, et donc peut être de différents types (typage, polymorphisme, ...)
    • enfin, cela permet de s'assurer (ça rejoint le point 2) que les personnes qui développeront de nouvelles facades respecteront les signatures des méthodes définies dans l'interface (c'est du typage en fait)
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Je te remercie kain_tn pour ta réponse.
    1. Le mieux est mettre des interfaces ou des classes génériques ?
    2. Si je mets factory dans facade j'aurai facade qui dépend de facadeImpl et facadeImpl qui dépend de facade. Est-ce normal d'avoir deux modules avec une dépendance dans les deux sens ?

  4. #4
    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 081
    Points
    16 081
    Par défaut
    Personnellement, je ferais cela ainsi:

    Facade.java
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    package com.myapp.facade;
    public interface Facade { /* ... */ }

    FacadeImpl.java
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    package com.myapp.facade;
    class FacadeImpl implements Facade { /*... */ } // classe en visibilité "package"

    Factory.java
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    package com.myapp.facade;
    public class Factory {
    	public Facade getFacade() { return new FacadeImpl(); }
    }


    Utilisation en dehors du pacakge:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import com.myapp.facade.*;
    public static void main(String[] args) {
    	Facade f = new Factory().getFacade();
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Je te remercie Xavier pour ta proposition.

  6. #6
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 561
    Points : 7 260
    Points
    7 260
    Par défaut
    Citation Envoyé par yo_haha Voir le message
    1. Le mieux est mettre des interfaces ou des classes génériques ?
    ?
    Personnellement je privilégie les interfaces au reste. Je passe par des classes abstraites (je pense que c'est ce que tu voulais dire, car les classes génériques sont les classes paramétrées) si j'ai besoin de définir du code à hériter.

    Citation Envoyé par yo_haha Voir le message
    2. Si je mets factory dans facade j'aurai facade qui dépend de facadeImpl et facadeImpl qui dépend de facade. Est-ce normal d'avoir deux modules avec une dépendance dans les deux sens ?
    Non, ce n'est pas terrible en effet, mais pseudocode t'as déjà donné une bonne solution
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

Discussions similaires

  1. Développement en architecture 3 couches ?
    Par dinbougre dans le forum Architecture
    Réponses: 18
    Dernier message: 30/06/2011, 15h35
  2. [N-Tier] Architecture en couches - Recherche tutoriels
    Par elmoustamide dans le forum Autres
    Réponses: 2
    Dernier message: 03/09/2007, 11h14
  3. [MAVEN2] vérification d'architecture en couche
    Par coco62 dans le forum Qualimétrie
    Réponses: 7
    Dernier message: 15/05/2007, 10h42
  4. question : architecture en couches
    Par Spacy_green dans le forum Développement
    Réponses: 10
    Dernier message: 25/05/2006, 19h08
  5. Architecture multi couches avec librairie borland?
    Par seb_asm dans le forum JBuilder
    Réponses: 4
    Dernier message: 08/06/2005, 11h14

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