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 :

Test de pointeur a null


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Par défaut Test de pointeur a null
    Salut

    Y a t il moyen d'eviter/alleger ce genre de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (a != null && a.b != null && a.b.c != null && a.b.c.d != null)
    {
         a.b.c.d.Test();
    }
    Thx

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    A ma connaissance, non.
    Je mets une baffe au premier qui propose ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{ a.b.c.d.Test(); } catch {}
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    c'est très laid comme code quand même

    "Ne parlez pas aux inconnus - ne parlez qu'à vos amis immédiats"

    Il faut être attentif pour chaque objet au nombre de classes avec lesquelles il interagit. Ce principe évitela création de classes fortement couplées.

    Concrétement, si tu considères un objet; à partir de n'importe quelle méthode de cet objet tu ne dois appeler que des méthodes qui appartiennent:
    • à cet objet
    • aux objets transmis en arguments à la méthode
    • aux objets que la méthode crée
    • aux composants de l'objet
    Il faut éviter les a.GetObjet.GetObjet.GetObjet etc.


    Ici ton objet n'a des référence qu'à "a". Il ne doit donc pas connaitre b, c ou d. Si tu veux executer la méthode Test, demande le à "a" c'est tout. Et c'est "a" qui se chargera d'appeler b etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (a != null)
    {
         a.AppelerTest();
    }
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Le Null object pattern est ce dont tu as besoin Google !
    Exemple : (attention, bidouille, mais jolie bidouille )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Address
       {
           private static Address Empty = new Address();
           public string StreetName = null;
    
           public static Address operator +(Address address)
           {
              return address ?? Empty;
           }
        }
      
        Console.WriteLine("The street name is "+ (+address).StreetName ?? "n/a" + ".");
    J'avais trouvé ça sur le net, je sais plus où. Sur CodeProject probablement.

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return address ?? Empty;
    Encore un fana de ce genre de code, faut savoir que tout le monde ne comprends pas
    Je ne comprends pas
    Peux tu s'il te plait m'expliquer ce que font les ??

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return address ?? Empty;
    Encore un fana de ce genre de code, faut savoir que tout le monde ne comprends pas
    Je ne comprends pas
    Peux tu s'il te plait m'expliquer ce que font les ??

    Si adress est null, il retourne Empty. Sinon, il retourne la valeur d'address

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Le Null object pattern est ce dont tu as besoin Google !
    Exemple : (attention, bidouille, mais jolie bidouille )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Console.WriteLine("The street name is "+ (+address).StreetName ?? "n/a" + ".");
    Personnellement, je trouve cela particuliérement inélégant (pas tant la définition que la syntaxe d'appel (+address), mais on a le droit de le qualifier de "jolie bidouille"; en premiére lecture, et, en imaginant que je trouve cela dans un code, je le qualifierais plutôt d'inutilement abscon.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 167
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Il faut éviter les a.GetObjet.GetObjet.GetObjet etc.
    Ce qui ne veut pas dire qu'il faut éradiquer cet usage au détriment du sens.
    Ici ton objet n'a des référence qu'à "a". Il ne doit donc pas connaitre b, c ou d. Si tu veux executer la méthode Test, demande le à "a" c'est tout. Et c'est "a" qui se chargera d'appeler b etc.
    C'est incohérent, parce que selon ton raisonnement si tu veux appeler a.b.c.d.méthode tu dois implémenter a.appelMéthode->b.appelMéthode->c.appelMéthode->d.méthode, ce qui implique que c fait tout ce que fait d, b tout ce que fait c, et a fait tout ce que fait b, donc a connait le comportement de b, c et d ! Et d'un point de vue sémantique c'est une erreur car cela ajoute un comportement dans a qui n'a pas lieu d'être.

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Franckintosh Voir le message
    C'est incohérent, parce que selon ton raisonnement si tu veux appeler a.b.c.d.méthode tu dois implémenter a.appelMéthode->b.appelMéthode->c.appelMéthode->d.méthode, ce qui implique que c fait tout ce que fait d, b tout ce que fait c, et a fait tout ce que fait b, donc a connait le comportement de b, c et d ! Et d'un point de vue sémantique c'est une erreur car cela ajoute un comportement dans a qui n'a pas lieu d'être.
    C'est au contraire très cohérent. En fait, si on prend un exemple de la vraie vie, c'est plus simple à comprendre. Prenons une entreprise de peinture en batiment. Cette entreprise sait faire de la peinture en batiment parce que ses employés savent faire de la peinture en batiment.
    Un client va embaucher la société car il sait que celle-ci dans sa globalité sait faire de la peinture en batiment. Ce client se fiche de savoir si c'est Néness ou Dédé qui sait peindre. Il ne voit que la société.

    Pour revenir à notre exemple, la société de peinture serait la classe A qui contient/emploie des peintres B qui savent peindre (méthode appelée).
    Au final, la classe utilisatrice (celle qui fait le if) ne devrait faire que A.méthode(). Après, peu lui importe que ce soit B ou C ou D qui peigne (appelle la méthode).
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Pour revenir à notre exemple, la société de peinture serait la classe A qui contient/emploie des peintres B qui savent peindre (méthode appelée).
    Au final, la classe utilisatrice (celle qui fait le if) ne devrait faire que A.méthode(). Après, peu lui importe que ce soit B ou C ou D qui peigne (appelle la méthode).
    Euh... ok pour ton exemple, mais quand une classe Facture contient un référence vers une classe Client, on rajoute des propriétés ClientId, ClientName, ClientAddress pour encapsuler Client.Id, Client.Name et Client.Address ?

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Je vais quand même donner mon avis sur ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (a != null && a.b != null && a.b.c != null && a.b.c.d != null)
    {
         a.b.c.d.Test();
    }
    C'est pas très beau certes, mais en plus ça ne devrait pas exister.

    Soit b, c et d sont passés en paramètres dans le constructeur de a, et dans ce cas si il y a un null, tu ne peux t'en prendre qu'à toi-même. Sous-entendu que c'est bien avant que le test doit s'effectuer, pas sur l'appel.

    Soit b, c et d sont entièrement à la charge de a, et tu devrais te manger une exception directement à l'instanciation de a si quelque chose cloche pour charger b, c et d !

    Devoir tester un tel arbre d'appel ça a une bonne tête d'anti-pattern quand même

  13. #13
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Je suis d'accord avec tout ce qui viens de ce dire.
    D'ailleurs un exemple simple l'utilisation du patron de conception état pour un langage de programmation objet.
    Lorsque tu veux gérer les états de ta classe, tu vas créer une classe d'état abstraite et faire faire plein de classe dérivé de celle-ci qui représente les états.
    Ta classe de départ se fou royalement de savoir s'il elle va appellé la méthode de telle ou telle état, après il y une variable et une méthode qui s'occupe de gérer l'état courant.
    Ta classe de départ appel la méthode de la classe abstraite.

    Ce genre d'encapsulation te permet de faire des choses beaucoup plus fine, c'est plus lisible, et plus facilement maintenable.

    @ Guulh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Machin machin = GetMachinInCache(42) ?? GetMachinSurUnServeur(42);
     
    est plus simple et plus lisible que
     
    Machin machin = GetMachinInCache(42);
    if (machin == null)
    machin = GetMachinSurUnServeur(42);
    je ne vois aps en koi c plus simple et plus lisible, je dirais même l'inverse.

    C'est comme tout ce qui est hérité du langage c++, les i++ i+=3, ...
    C'est moins lisible, on si fait à force car on les rencontre tout le temps et on les utilise.
    Mais ce genre de syntaxe n'est pas utilisé de la même façon partout, alors n'est pas facilement maintenable partout.
    Et puis désolé mais : i = i +1 -> clair et compréhensible dès la première fois que tu le vois.
    i++ -> lorsque tu le vois pour la première fois tu ne le comprends qu'après que l'on t'ai dit ue c'est la même chose que i = i + 1 !!!!!

  14. #14
    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
    Citation Envoyé par ced600 Voir le message
    @ Guulh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Machin machin = GetMachinInCache(42) ?? GetMachinSurUnServeur(42);
     
    est plus simple et plus lisible que
     
    Machin machin = GetMachinInCache(42);
    if (machin == null)
    machin = GetMachinSurUnServeur(42);
    je ne vois aps en koi c plus simple et plus lisible, je dirais même l'inverse.

    C'est comme tout ce qui est hérité du langage c++, les i++ i+=3, ...
    C'est moins lisible, on si fait à force car on les rencontre tout le temps et on les utilise.
    Mais ce genre de syntaxe n'est pas utilisé de la même façon partout, alors n'est pas facilement maintenable partout.
    Et puis désolé mais : i = i +1 -> clair et compréhensible dès la première fois que tu le vois.
    i++ -> lorsque tu le vois pour la première fois tu ne le comprends qu'après que l'on t'ai dit ue c'est la même chose que i = i + 1 !!!!!
    AMHA, c'est comme beaucoup de choses produisant in fine le meme effet, à savoir une question de gout. ??, ca reste quand meme tres 'Geek-code', j'ai du le rencontrer une fois dans une source, alors que les operateurs d'incrementation, c'est quand meme globalement tres utilisé. C'est un peu pareil pour les operateurs ternaires, les methodes anonymes etc , certains trouvent ca clair, d'autres pas, toujours la meme chose, affaire de gout. =)

  15. #15
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par ced600 Voir le message
    i++ -> lorsque tu le vois pour la première fois tu ne le comprends qu'après que l'on t'ai dit ue c'est la même chose que i = i + 1 !!!!!
    1) C'est pas la même chose d'un point de vue processeur, incrémenter va nettement plus vite, même si nous on s'en fout parce que les compilos unpoil optimisés remplacent automatiquement i = i+1 en i++.
    2) T'abuses quand même, tu le vois une fois, tu l'apprends et c'est bon... C'est dans les 3/4 des langages. Je sais pas si t'as déjà fait du C++, mais avec les surcharges d'opérateurs de partout, tu prendrais peur
    3) monIcone = estContent ? "Content.ico" : "pasContent.ico", je trouve ça clair et élégant. Les blocs if then else sont tellement courants qu'il se conçoit très bien d'en simplifier la syntaxe pour les cas les plus simples.

  16. #16
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    2) T'abuses quand même, tu le vois une fois, tu l'apprends et c'est bon... C'est dans les 3/4 des langages. Je sais pas si t'as déjà fait du C++, mais avec les surcharges d'opérateurs de partout, tu prendrais peur
    J'ai commencé par apprendre le c, puis le c++ (ensuite java et .net)
    J'ai comemencer à avoir peur en c lorsque certain faisait tenir en une ligne de code 5 lignes de code.
    En c++ je n'ai jamais trop fait de la surcharge d'opérateurs, mais je conçoit qu'en abuser peut être inquiétant.
    Bref tout cela rend la maintenance difficile.
    Vous allez me dire que c'est comme les noms de variables : Certain prèfère V1, V2, V3, ... un choix comme un autre et d'autre des nom clair pour chaque variable, et certain des phrases comme nom de variable (ils abusent de la complétion propose par l'editeur)
    Mais bon qu'en tu arrives à V50 en nom de variable, tu ne comprends plus rien au code. Je ne l'ai pas vécu mais quelqu'un qui l'a vécu me l'a raconté. Il était très enchanté de maintenir un tel code .... Il n'a rien compris a code et à tout réécrit, cela prenais moins de temps.

    3) monIcone = estContent ? "Content.ico" : "pasContent.ico", je trouve ça clair et élégant. Les blocs if then else sont tellement courants qu'il se conçoit très bien d'en simplifier la syntaxe pour les cas les plus simples.
    je reprendrai cette phrase :
    C'est un peu pareil pour les operateurs ternaires, les methodes anonymes etc , certains trouvent ca clair, d'autres pas, toujours la meme chose, affaire de gout. =)
    Néanmoins si l'on veut être profesionnelle, il vaut mieux penser à la maintenance du code, que l'on ne fera pas forcement nous même.

    C'est comme pour les tests, beaucoup de boite ne font pas bcp de test, faute de temps. Cela alourdi la maintenance qui revient très couteuse.
    Je peux vous dire que lorsqu'elles ont décrochés le contrat pour se soft avec inclus dedans la phase de maintenance, elles peuvent perdre de l'argent.
    Celles qui ont compris cela effectue des tests plus appronfondis pour limiter cette maintenance.

  17. #17
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Les structs en c# exitent uniquement pour jouer le rôle d'instance de classe dont nous n'avons pas besoin de conserver les données des arguments jusqu'à l'arret de l'application.
    Cela évite de gacher de la mémoire pour des objets qui ne sont utilisés que sur une phase précise de l'application.

  18. #18
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Je suis d'accord avec toi que des lignes comme "while (*p++ = *q++);"(si je me souviens bien) sont trop cryptiques. Je suis d'accord aussi que chaque développeur a ses goûts, et c'est pour cela qu'il est possible de faire la même chose de n façons différentes toutes aussi valables les unes que les autres (en C++ notamment ).
    Mais je ne pense pas que ce soit une raison suffisante pour niveller par le bas son code. A la limite si il doit être maintenu ponctuellement par quelqu'un dont le C# n'est pas la spécialité. Mais bon quand on choisit un outil (en l'occurence un langage de programmation), c'est aussi pour tirer profit de ses caractéristiques. Je n'ai pas de position rigide sur le sujet, ça se discute et ça dépend entièrement des projets (mais on s'éloigne un chouïa du sujet initial du thread là, désolé Seth77 )

Discussions similaires

  1. [AC-2007] Test sur une Date nulle
    Par fredo6951 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/09/2014, 00h37
  2. Test d'une valeur nulle
    Par Z4ng3tsu dans le forum Débuter
    Réponses: 5
    Dernier message: 29/12/2011, 10h18
  3. test de pointeur non null
    Par czezko dans le forum Delphi
    Réponses: 24
    Dernier message: 06/04/2007, 17h04
  4. Pointeur sur NULL par défaut en parametre.
    Par KernelControl dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2005, 10h09
  5. Réponses: 4
    Dernier message: 06/04/2004, 21h57

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