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 de conception


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 12
    Par défaut Problème de conception
    Bonjour à tous.

    Je voudrais faire quelque chose comme ça :
    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
     
    public abstract class Vehicule {
      public abstract bool peutRouler();
    }
    public class Voiture : Vehicule {
      public bool peutRouler(bool feuVert) {
        if (feuVert == true) return true;
        else return false;
      }
    }
    public class Train : Vehicule {
      public bool peutRouler(bool conducteurABord, bool passagersABord) {
        if ((conducteurABord == true) && (passagersABord == true)) return true;
        else return false;
      }
    }
    En français :
    J'ai une classe de base qui impose certaines méthodes comme par exemple ici est-ce que le véhicule peut rouler.
    Le problème, c'est que la réponse à cette question varie selon la classe fille. Donc, la méthode qui répond à la question est susceptible de prendre diverses valeurs en paramètre... et ne respecte du coup plus la signature de la classe de base...

    Comment implémenter ce genre de chose de manière élégante ?

    Je crois que mon exemple est clair... même s'il est assez simpliste (donc pas de remarques sur l'algorithmie svp )

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Par défaut
    je ne vois pas trop...
    que tu utilise une classe abstraite ou une interface le problème reste le meme...

    a tu envisager de modifier tes classes plus en profondeur?

    exemple
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public abstract class Vehicule
    {
       public abstract bool peutRouler();
     
       public bool conducteurABord;
       public bool passagerABord;
    }
     
    public class Voiture : Vehicule
    {
       public Voiture()
       {
          passagerNecessaire = false;
       }
     
       public bool feuVert;
     
       public bool peutRouler()
       {
          return feuVert;
       }
    }
     
    public class Train : Vehicule
    {
       public bool peutRouler()
       {
          return ((conducteurABord == true) && (passagersABord == true));
       }
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 12
    Par défaut
    Citation Envoyé par TheBlackReverand Voir le message
    je ne vois pas trop...
    que tu utilise une classe abstraite ou une interface le problème reste le meme...
    Nous sommes bien d'accord...

    a tu envisager de modifier tes classes plus en profondeur?

    exemple
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public abstract class Vehicule
    {
       public abstract bool peutRouler();
     
       public bool conducteurABord;
       public bool passagerABord;
    }
     
    public class Voiture : Vehicule
    {
       public Voiture()
       {
          passagerNecessaire = false;
       }
     
       public bool feuVert;
     
       public bool peutRouler()
       {
          return feuVert;
       }
    }
     
    public class Train : Vehicule
    {
       public bool peutRouler()
       {
          return ((conducteurABord == true) && (passagersABord == true));
       }
    }
    Ben je ne veux pas faire ça justement... Mon exemple est simpliste mais dans mon projet, les critères manipulés dans les classes filles n'ont aucun lien entre eux. Ils n'ont rien à faire dans la classe mère (ni même dans la classe fille d'ailleurs...) Il me semble évident que ces critères doivent rester des paramètres d'une méthode qui calcule si mon objet est "éligible" à un certain traitement ou non. C'est une sorte de filtrage... Mon but est d'avoir ces critères d'éligibilité DANS la classe fille et nulle part ailleurs. C'est de sa responsabilité de répondre à cette question...

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    Je ne vois pas trop ton problème
    Au pire regarde le pattern Machine à Etat mais pour moi tu dois n'utiliser que ton stub de base et suivant propriétés interne et spécifique à ton objet hérité, le comportement sera différent

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    Tu peux faire un truc comme ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public bool peutRouler(ContextUtilisation oCtx)
    {
    }
     
     
    public class ContextUtilisationVehicule
    {
    }
     
    public class ContextUtilisationVoiture : ContextUtilisationVehicule
    {
    bool conducteur;
    }
    Et là on s'approche un peu d'une machine à état

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 12
    Par défaut
    Citation Envoyé par GSXRider Voir le message
    Je ne vois pas trop ton problème
    Au pire regarde le pattern Machine à Etat mais pour moi tu dois n'utiliser que ton stub de base et suivant propriétés interne et spécifique à ton objet hérité, le comportement sera différent
    Oui je sais, je ne suis pas forcément très clair. Je vais donc refaire une tentative :

    Je veux que tout ce qui hérite de Véhicule implémente obligatoirement une méthode qui dit si l'objet peut ou non rouler... (car j'ai un algo qui mouline tous les véhicules en général...)

    Or savoir si un certain type de véhicule peut avancer ou non dépend de son environnement et ces données d'environnement n'ont rien à faire dans une classe Voiture ou Train ou Bateau... Néanmoins, c'est la classe Voiture ou Train ou Bateau qui sait quelles sont les conditions de l'environnement à tester pour savoir s'il peut rouler ou non... Je voudrais éviter d'avoir à passer l'objet Environnement à la méthode...

  7. #7
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 76
    Par défaut
    Salut,

    Pour ton problème, tu peux peut-être utiliser le pattern appelé "Stratégie".

    Tu défini une arborescence de classe qui définit tes rêgles
    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
    20
    21
    22
    23
     
    public Abstract Class CheckStrategie
    {
    virtual bool peutRouler(Object objToCheck);
    }
     
    public class CheckVoiture : CheckStrategie
    {
    public override bool peutRouler(Object objToCheck)
    {
       var voiture = (Voiture) objToCheck;
       ... code de test ici ...
    }
    }
     
    public class CheckTrain : CheckStrategie
    {
    public override bool peutRouler(Object objToCheck)
    {
       var train = (Train) objToCheck;
       ... code de test ici ...
    }
    }
    Eventuellement dans le constructeur des strategies, tu inclus une référence sur l'environnement comme ça ce ne sont pas les objets Vehicule qui sont liés à l'environnement, mais les strategies de test.

    Ensuite dans le constructeur de tes objets, tu transmets une instance de la bonne stratégie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Voiture : Vehicule {
     
      private CheckStrategie _strategy;
     
      public Voiture(CheckStrategie strat)
      {
        _startegie = strat;
      }
     
      public bool peutRouler() {
        return _strategy.PeutRouler(this);  }
    }
    Quand tu créé les objets tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var newVoiture = new Voiture(new CheckVoiture());
    J'espère que je n'ai pas été trop brumeux (et pas trop compliqué dans ma solution).

    En espérant avoir aidé un peu.

  8. #8
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    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
    class Vehicule
    {
    public virtual bool peutRouler()
    {
    return true;
    }
    }
     
    class Voiture : Vehicule
    {
    public override bool peutRouler()
    {
    return true;
    }
    }

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

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 11h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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