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 :

[C#]Comment gérer une régle de gestion sur une propriété ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut [C#]Comment gérer une régle de gestion sur une propriété ?
    Salut,
    dans le code suivant je code une régle de gestion :
    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
    private byte mAge;
    /// Age d'une personne
    public byte Age
    {
      get
      {
        return (mAge);
      }
      set
     {
        if ((value==0) || (value<=AgeMaximum))
          mAge = value;
        else throw new AgeIncorrectException();
     }
    }
    Selon certains (*) cette approche, déclencher une exception dans un accesseur, n'est pas recommandé.

    J'aimerais donc savoir s'il existe une autre solution que celle-ci pour coder une régle de gestion sur une propriété ?

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Selon certains (*) cette approche, déclencher une exception dans un accesseur, n'est pas recommandé.
    Ben vu qu'il n'y a pas 36 000 façons de définir une variable, il devrait préférer un truc du genre
    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
     
    byte age = 0;
    public byte Age
    {
      get { return age; }
    }
     
    public virtual bool DéfinirAge(byte n_age)
    {
      if(n_age >= 0 && n_age <= AgeMaximum)
      {
        age = n_age;
        return true;
      }
      else
        return false;
    }

    (ceci dit, je fait tout le temps des exceptions dans les accesseurs et bon )

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Bonjour,

    Dans le Framework .NET, y'a beaucoup d'accesseurs qui retournent des exceptions, je vois pas vraiment où est le problème. C'est clair qu'il vaut mieux toujours vérifier les variables dans le code appellant, mais ce n'est pas forcément possible quand on écrit des bibliothèque et l'exception reste le mécanisme principal pour remonter une erreur.

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    ...
    Je suis entièrement d'accord avec toi mais en fait j'ai pas eu la foi de lire le document cité par Laurent ... ce serai bien s'il nous citait le passage dans lequel il est question de cette "proscription"

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kaidan
    je vois pas vraiment où est le problème.
    Débutant sous C# j'essaie de suivre des régles de développement ou tout du moins de prendre de bonnes habitudes.
    Les autres régles que j'ai pu trouvées dans l'ouvrage indiqué ne me posent pas de pb particulier.

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Débutant sous C#
    ça fait bizarre, avant c'était Delphi non ?

    Citation Envoyé par Laurent Dardenne Voir le message
    j'essaie de suivre des régles de développement ou tout du moins de prendre de bonnes habitudes.
    Les autres régles que j'ai pu trouvées dans l'ouvrage indiqué ne me posent pas de pb particulier.
    Non mais en fait une des principales règles avec les exceptions c'est qu'il ne faut pas en abuser ou s'en servir quand c'est pas franchement nécéssaire car le procéssus de lancement d'une exception est gourmand en ressources et que de plus, le code résultant d'une utilisation massive des exceptions sera probablement obscur et difficil à maintenir. Cependant lorsque c'est pour signaler une erreur de valeur ( même si on vérifie avant la valeur entrée par l'utilisateur ) les exceptions sont très efficaces ( même dans un accesseur ). Au moin on est sur de cours circuiter toute donnée invalide ( par exemple dans ton cas, il n'y aura aucun moyen de se balader avec des ages négatifs ) et, pour moi, mettre la vérification dans l'accesseur est une méthode simple et élégante, en éssayant de faire autre chose on se complique la vie .

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par smyley
    ce serai bien s'il nous citait le passage dans lequel il est question de cette "proscription"
    page 69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    14. Throw the InvalidOperationException exception if a call to a property set accessor or method is not appropriate given the object's current state.
    Voir aussi le livre "Pratique de .NET 2 et C#2" de Patrick Smacchia, page 409
    "Il est conseillé de ne pas lancer d'exception à partir d'un accesseur, à moins quelle soit rattrapée dans l'accesseur même. En effet syntaxiquement le client n'a pas nécessairement conscience d'appeler un accesseur lors de l'accés à une propriété. Le client peut donc être surpris par une exception."

    Citation Envoyé par smyley
    ça fait bizarre, avant c'était Delphi non ?
    Oui mais je ne suis pas trop perdu
    Et puis je continuerai d'utiliser Delphi sous Win32.
    Citation Envoyé par smyley
    en essayant de faire autre chose on se complique la vie
    C'est pas mon objectif. J'essaie de trouver une implémentation simple pour cette recommendation.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    je n'ai pas trouvé le passage en question dans le livre (pas mal btw), mais je pense que ce qu'ils ont voulu dire, c'est que, theoriquement, une propriété 'simple' (le cas general) n'est pas sensé lever une exception, contrairement à une methode. Cependant, si cette levée est indiquée, (par un comment intellisense par exemple, comme le fait le framework), je ne vois pas ou est le probleme, c'est meme preferable, AMHA, de lever l'exception à l'initialisation de la variable en question, plutot que de lancer une InvalidOperationException, par exemple, plus tard (qui perdra de son sens).

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par smyley
    ceci dit, je fait tout le temps des exceptions dans les accesseurs
    C'est vrai que cette approche facilite le codage. De plus cette régle de développement me semble difficile à respecter

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 03/02/2009, 10h52
  2. Réponses: 0
    Dernier message: 03/04/2008, 15h14
  3. Réponses: 0
    Dernier message: 07/12/2007, 13h12
  4. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  5. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07

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