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

C# Discussion :

Problème d’architecture, pattern d'architecture


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut Problème d’architecture, pattern d'architecture
    Bonjour,

    J'ai un "petit" problème d’architecture (je résume la problématique) et je cherche une solution pour éviter de dupliquer du code (les attributs de classes en C#) :


    J’ai 2 projets P1 et P2 et j’ai 3 classes C1, C2, C3 dans un autre projet (composant partagé) liées les unes aux autres par leurs attributs : C1 contient un attribut de type C2 et C2 contient un attribut de type C3.

    Les projets P1 et P2 utilisent C1, C2, C3 pour leurs attributs, mais les fonctions membres de C1, C2, C3 sont différentes pour P1 et pour P2. Il n’y a que les attributs de C1, C2 et C3 qui sont identiques dans P1 et P2.

    Question : Comment faire pour centraliser uniquement les attributs et éviter de dupliquer C1, C2 et C3 dans P1 et P2 et avoir ainsi les attributs qui seront partagés (et non doublonnés) ?

    Merci d'avance pour vos idées !

    Concrètement : C1, C2 et C3 sont des attributs de tables stockés en base de données. P1 et P2 sont 2 projets différents qui utilisent ces données. Le souhait est de centraliser les attributs C# mais que les opérations membres de C1, C2 et C3 ne soient pas centralisées car elles sont différentes dans P1 et dans P2.
    PS : L'héritage ne convient pas. Peut-être qu’un pattern le permettrait ?

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    D'après ce que je comprends (si j'ai compris) tu veux que des attributs soit communs à deux projets.
    Il suffit de le déclarer publique dans une DLL et de l'utiliser dans tes différents projets.

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Citation Envoyé par popo Voir le message
    D'après ce que je comprends (si j'ai compris) tu veux que des attributs soit communs à deux projets.
    Il suffit de le déclarer publique dans une DLL et de l'utiliser dans tes différents projets.
    Merci popo pour ton aide … mais le problème n’est pas exactement celui-là.
    Le problème est au niveau des opérations de classe pour C1, C2 et C3.
    En mettant C1, C2 et C3 dans un composant partagé, oui, je partage les attributs des classes, mais je partage aussi les opérations de ces classes et ça, je ne le veux pas car chaque projet possède une implémentation différente.
    Je voudrais mettre uniquement les attributs « en partage » mais pas le code (fonctionnel) qui lui est spécifique à chaque projet.

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut

    Par exemple C1, C2, C3 comme classes abstraites dans une bibliothèque, comme ça tu peux y mutualiser les propriétés et les signatures de méthodes. Dans tes projets P1, P2, etc. tu implémentes ces méthodes à ta convenance. Ou alors carrément des interfaces (ça dépend de ce qu'il y a à vraiment écrire dans les classes C)

  5. #5
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Si les méthodes de tes objets n'utilisent pas d'éléments internes (private ou protected) tu peux aussi de contenter des attributs dans les classes elles-mêmes et faire des méthodes d'extensions spécifiques dans chaque projet.

    Par contre pour l'héritage on part en principe de l'idée que la relation entre la classe fille et la classe mère est du type "est une sorte de" ; par exemple un chat est une sorte d'animal, un chien est une sorte d'animal. Si cette relation ne peut être clairement établi il vaut peut-être mieux admettre que ce sont des types différents et que la duplication n'en est pas entièrement une, surtout si un type est susceptible d'évoluer sans l'autre.

    EDIT : une autre option pourrait être de créer des classes qui contiendront les comportements et dont tes classes actuelles constitueront le paramétrage ou les données.

  6. #6
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Si les méthodes de tes objets n'utilisent pas d'éléments internes (private ou protected) tu peux aussi de contenter des attributs dans les classes elles-mêmes et faire des méthodes d'extensions spécifiques dans chaque projet.

    Par contre pour l'héritage on part en principe de l'idée que la relation entre la classe fille et la classe mère est du type "est une sorte de" ; par exemple un chat est une sorte d'animal, un chien est une sorte d'animal. Si cette relation ne peut être clairement établi il vaut peut-être mieux admettre que ce sont des types différents et que la duplication n'en est pas entièrement une, surtout si un type est susceptible d'évoluer sans l'autre.

    EDIT : une autre option pourrait être de créer des classes qui contiendront les comportements et dont tes classes actuelles constitueront le paramétrage ou les données.
    Merci Noxen pour l'idée des méthodes d'extension.

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Citation Envoyé par Max Voir le message
    Salut

    Par exemple C1, C2, C3 comme classes abstraites dans une bibliothèque, comme ça tu peux y mutualiser les propriétés et les signatures de méthodes. Dans tes projets P1, P2, etc. tu implémentes ces méthodes à ta convenance. Ou alors carrément des interfaces (ça dépend de ce qu'il y a à vraiment écrire dans les classes C)
    Merci Max pour ton aide.
    La solution est élégante mais malheureusement, je ne peux pas utiliser de classes abstraites car les données de ces classes ont pour finalité d'être stockées dans une base MongoDB et cela pose un problème au constructeur.

    Par contre en refaisant des tests sur une maquette, cela fonctionne avec un héritage normal (classe de base non abstraite) et je n'ai pas le problème de constructeur que j'avais dans le projet réel. Ta solution m'a fait avancer. Merci !

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par TigreDeau Voir le message
    Merci popo pour ton aide … mais le problème n’est pas exactement celui-là.
    Le problème est au niveau des opérations de classe pour C1, C2 et C3.
    En mettant C1, C2 et C3 dans un composant partagé, oui, je partage les attributs des classes, mais je partage aussi les opérations de ces classes et ça, je ne le veux pas car chaque projet possède une implémentation différente.
    Je voudrais mettre uniquement les attributs « en partage » mais pas le code (fonctionnel) qui lui est spécifique à chaque projet.
    Je ne t'ai jamais dit de mettre C1, C2 et C3 en partage.
    Je t'ai dit de mettre la déclaration de tes attribut en partage.

    Mais je crois que nous n'avons pas la même vision de ce qu'est attribut.
    Un attribut est une "décoration" sur ta classe", il n'a pas vocation à avoir du code fonctionnel.
    Si je déclare ceci dans une DLL partagée je vais créer un attribut.
    Code C# : 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
    [AttributeUsage(AttributeTargets.All)] // <= Ceci est un attribut du framework et je l'utilise en tant que décoration
    // La classe ci-dessous est mon attribut à moi.
    public class MyAttribute : Attribute
    {
        private string internalValue;
     
        public MyAttribute()
        {
            internalValue = String.Empty;
        }
     
        public virtual string Value
        {
            get {return internalValue;}
            set {internalValue = value;}
        }
     
    }


    Je peux l'utiliser dans P1.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [MyAttribute(Value="SomethingInP1"]
    public class MyP1Class { ... }

    Je peux l'utiliser dans P2.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [MyAttribute(Value="SomethingInP2"]
    public class MyP1Class  { ... }

  9. #9
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Citation Envoyé par popo Voir le message
    Je ne t'ai jamais dit de mettre C1, C2 et C3 en partage.
    Je t'ai dit de mettre la déclaration de tes attribut en partage.

    Mais je crois que nous n'avons pas la même vision de ce qu'est attribut.
    Un attribut est une "décoration" sur ta classe", il n'a pas vocation à avoir du code fonctionnel.
    Effectivement, il faut fixer le vocabulaire. Ce dont tu parles est une annotation (meta-données) cf wikipedia
    Sur wikipedia, la définition d'attribut est la même que la mienne :

    En informatique, le terme "attribut" a plusieurs significations :

    - en programmation, les attributs sont des entités qui définissent les propriétés d'objets, d'éléments, ou de fichiers. Les attributs sont habituellement composés d'un identificateur (ou nom ou clé) et d'une valeur,
    - en compilation les attributs sont des valeurs sémantiques assignées aux nœuds de l'arbre syntaxique.


    Merci quand même pour ta contribution

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par TigreDeau Voir le message
    Effectivement, il faut fixer le vocabulaire. Ce dont tu parles est une annotation (meta-données) cf wikipedia
    Sur wikipedia, la définition d'attribut est la même que la mienne :

    En informatique, le terme "attribut" a plusieurs significations :

    - en programmation, les attributs sont des entités qui définissent les propriétés d'objets, d'éléments, ou de fichiers. Les attributs sont habituellement composés d'un identificateur (ou nom ou clé) et d'une valeur,
    - en compilation les attributs sont des valeurs sémantiques assignées aux nœuds de l'arbre syntaxique.


    Merci quand même pour ta contribution
    Règle d'or : ne jamais se fier à Wikipédia dont les informations proviennent de sources diverses et pas toujours convergentes et qui surtout ne fonctionnent pas forcément dans tous les contexte.
    Tu es sur un forum dédié à C#.
    Or en C#, un attribut n'a pas la définition que te donne Wikipedia mais bien celle que je t'ai donné.
    https://docs.microsoft.com/fr-fr/dot...ts/attributes/

Discussions similaires

  1. Talend + iReport : problème de pattern
    Par Bouga74 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 02/02/2011, 09h56
  2. Problème de Pattern Observer
    Par bigram dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2010, 15h23
  3. Problème Display pattern(custom field) + javascript
    Par lightbulb dans le forum SharePoint
    Réponses: 1
    Dernier message: 17/02/2009, 15h49
  4. Pattern d'architecture autre que mvc
    Par jr_maj dans le forum Architecture
    Réponses: 1
    Dernier message: 03/03/2008, 10h48
  5. Problème Design Pattern : Help
    Par donkeyquote dans le forum C++
    Réponses: 5
    Dernier message: 14/01/2008, 09h54

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