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

Langage Java Discussion :

Je trouve la convention de présentation de code source proposée par Sun criticable.


Sujet :

Langage Java

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut Je trouve la convention de présentation de code source proposée par Sun criticable.
    Mon compte sur www.developpez.net est encore très jeune, que déjà je veux me livrer à une agression en règle. De la convention de présentation des codes sources, comme l'a proposée Sun il y a quelques années de cela.

    Elle me gêne sur deux points particuliers. L'un est prompt à déclencher des querelles dans les équipes, l'autre me semble appeler les erreurs.


    1) Pour déclencher une guerre en une minute? Les accolades ouvrantes de fonction...
    50% des développeurs de langages à accolades de la planète écrivent leur code ainsi:

    et l'autre:
    Chacun a des arguments à faire valoir qui se respectent ou se discutent.
    L'inconvénient, c'est quand ces considérations normatives viennent à prendre le pas sur d'autres nettement plus importantes telles que la présence de javadoc, de commentaires (différent d'une javadoc!), et d'assertions dans le code source.
    Ce principe d'accolades ouvrantes de fonctions proposé par Sun me semble parasitant, et surtout peu fondé.


    2) this.mavariable, un voeu pieu qui ne dure jamais bien longtemps
    Sun propose que les variables membres de classes soient préfixées par this. là où d'autres suggèrent _ ou m_

    Ce code-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (age > ageLimite)
       throw(new IllegalStateException("Ce fromage ne doit vraiment plus valoir grand-chose, vous savez."));
    est-il correct? Ou bien le développeur réalise en fait concrètement cela, mais a oublié le préfixe this. ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (this.age > ageLimite)
       throw(new IllegalStateException("Ce fromage ne doit vraiment plus valoir grand-chose, vous savez."));
    ou bien même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (this.age > this.ageLimite)
       throw(new IllegalStateException("Ce fromage ne doit vraiment plus valoir grand-chose, vous savez."));
    Un seul moyen de le savoir: se balader dans le reste du code source afin de trouver la trace de possibles variables membres porteuses de ces noms. Et alors, on saura...

    Sous Eclipse, je fais brancher le warning "une variable locale cache une variable membre" et "nous avertir sur les variables inutilisées" dès qu'un développeur désire utiliser cette norme. Et ça ne rate jamais. Le warning se déclenche quinze fois par millier d'instructions. Il a cru affecter sa variable membre, mais n'ayant pas fait attention et ayant oublié de placer this. il ne l'a pas fait et a affecté à sa place une variable locale utilisée dans la fonction à d'autres fins.

    Ce point de norme là est, à mes yeux, contreproductif. Il pré-suppose qu'on n'oubliera jamais this. mais n'avertit pas dans le cas contraire. Il est l'origine de nombreuses anomalies. Mais par chance, de moins en moins appliqué (au profit de _ et m_) là où j'observe des codes sources.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Jia,

    Puisque agression (et pas aggression) tu veux :

    Une solution pour ne plus avoir de problème : n'utilise pas Java.

    - D'une part, ce ne sont que des recommandations, pas une obligation.

    Que je sache, il n'y a personne derrière toi avec un fusil pour t'obliger à utiliser leurs conventions.

    - Et d'autre part, Sun étant le créateur du Java, ils ont quand même leur mot à dire, non ?

    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Histoire de polémiquer moi aussi :
    1) j'utilise la première version. Pourquoi : parse que dès que je vois une fermante, il me suffit de tirer un tait vertical vers le haut pour connaitre de suite là quelle instruction/block elle appartient, ça m'évite de remonter une ligne au dessus de l'accolade ouvrante. Donc, sur ce point, c'est une question de point de vue personnel, étant un grand fainéant, cette méthode m'arrange.

    2)
    j'utilise TOUJOURS le this dans mes classes, la raison : c'est que par habitude et pour plus de clareté, dans tous mes setters, la variable passée en argument porte le même nom que la variable de classe que ça va affecter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setAge(int age){
       this.age=age;
    }
    Si le this n'était pas employé, ça poserait problème car on aurais deux variable de même nom, d'ailleurs ça ne compilerait pas. La solution pour ne pas utiliser le this : nommé l'argument "a" par exemple, mais "a" ça veut dire quoi ? dans mon exemple c'est simple, mais que dire d'une méthode dont le nom possède plusieurs notions ( plusieurs majuscules en respectant la norme ) ?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    moi, je suis plutôt partisan de cette solution là:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setAge(int age){
       m_age=age;
    }

    car ce qui pose problème, c'est que quand le développeur oublie le this et écrit cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void rectifierAge(int age){
       age = age
    }
    cela compile très bien. Bien-sûr, l'erreur n'apparaît pas d'une manière aussi crue, aussi visible, mais son principe c'est qu'au moment où l'on suppose affecter la variable membre (où notre intention est de l'affecter...), on affecte en fait une variable locale.

    this.age = age
    pose le problème dès que l'on oublie this ou que par paresse on pense pouvoir s'en passer. Allez, sur les trois quarts des lignes sources des développeurs qui prétendent utiliser this, on ne le trouve en fait pas.

    Le premier source, au pif, que je prends chez sourceforge: MemoryResourceLoader.java de XDoclet,


    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
    public class MemoryResourceLoader extends ResourceLoader {
            private Map scripts = new HashMap();
     
            public void init(ExtendedProperties extendedProperties) {
            }
     
            public InputStream getResourceStream(String id) throws ResourceNotFoundException {
                String script = (String) scripts.get(id);
                if( script == null ) {
                    throw new ResourceNotFoundException("No registered script for id = " + id);
                }
                return new ByteArrayInputStream(script.getBytes());
            }
     
            public boolean isSourceModified(Resource resource) {
                return false;
            }
     
            public long getLastModified(Resource resource) {
                return Long.MAX_VALUE;
            }
     
            public void addScript(String id, String script) {
                scripts.put(id,script);
            }
        }
    au lieu de:

    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
    public class MemoryResourceLoader extends ResourceLoader {
            private Map scripts = new HashMap();
        
            public void init(ExtendedProperties extendedProperties) {
            }
        
            public InputStream getResourceStream(String id) throws ResourceNotFoundException {
                String script = (String)this.scripts.get(id);
                if( script == null ) {
                    throw new ResourceNotFoundException("No registered script for id = " + id);
                }
                return new ByteArrayInputStream(script.getBytes());
            }
        
            public boolean isSourceModified(Resource resource) {
                return false;
            }
        
            public long getLastModified(Resource resource) {
                return Long.MAX_VALUE;
            }
        
            public void addScript(String id, String script) {
                this.scripts.put(id,script);
            }
        }
    et je passe sur n'importe quel autre code source,
    de n'importe quel projet, même ceux d'Apache ou de n'importe qui, tous ceux qui disent suivre cette norme le font imparfaitement.



    m_age = age
    ne posera jamais le problème, si toutes les variables membres sont préfixées par m_, impossible qu'il y ait ambiguïté.

  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    Citation Envoyé par grunt2000
    age=age
    :
    :
    cela compile très bien ...
    Je ne sais pas quelle EDI et quel JDK tu utilises, mais chez moi, avec eclipse 3.2 et la JDK 6, il la considère comme une erreur !

    Citation Envoyé par grunt2000
    m_age = age;
    Ah non, pitié, pas de ça en Java ! le tiret-bas est vraiment moche je trouve, et même déconseillé en Java. On l'utilise plutôt en C/C++, mais pas en Java où on utilise la différenciation de la casse : exemple mAge, monAge, etc., mais pas le m_age, mon_age, etc.

    Bref, pour en avoir le coeur net, voici un lien vers les conventions officielles de nommage en Java.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Goa,

    Pour le problème du this, il n'est tout de même pas difficile de donner un nom de paramètre différent du nom de la variable de la classe.

    Vous vous créez vous-même les difficulté.

    Citation Envoyé par iohack
    j'utilise TOUJOURS le this dans mes classes, la raison : c'est que par habitude et pour plus de clareté, dans tous mes setters, la variable passée en argument porte le même nom que la variable de classe que ça va affecter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      public void setAge(int age){ this.age=age; }
    Si le this n'était pas employé, ça poserait problème car on aurais deux variable de même nom, d'ailleurs ça ne compilerait pas. La solution pour ne pas utiliser le this : nommé l'argument "a" par exemple, mais "a" ça veut dire quoi ? dans mon exemple c'est simple, mais que dire d'une méthode dont le nom possède plusieurs notions ( plusieurs majuscules en respectant la norme ) ?
    Tes choix de nom de variable/paramètres me semblent bien limités.

    Tu peux choisir par exemple la solution de grunt2000, déjà bien répandue, ou mettre un préfixe/suffixe au nom du paramètre de la fonction, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      public void setAge(int UN_age){ this.age=UN_age; }
    etc...

    L'imagination au pouvoir !
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Peut-être mais ta méthode est moins claire lorsque l'on génère la javadoc, faut penser au utilisateur/développeur suivants.
    Si ( j'extrapole, hein c'est pas sérieux ) je vois UN_age, pour moi ça veut dire que j'en mets un au pif ? alors que si je vois age tout cours, là c'est précis, de plus dans "public void setAge(int age)" le terme est redondant ( ça va peut-être pas plaire à certains mais tant pis ), ça appuie la signifaction de la méthode. Faire un "public void setAge(int nombreDeCarottes)" c'est induire le futur utilisateur en erreur.

    Bon j'arrête avec la polémique, c'est un débas sans fin. L'une et l'autre méthode on chacune aventages et inconvénients.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 81
    Points : 90
    Points
    90
    Par défaut
    Pour ma part, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public void procedure()
        {
     
        }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public constructeur(int age)
        {
           this.age = age ;
        }

    Mais franchement, il existe 50 000 façon de noter. nous pourrions noter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        public constructeur(int agEs)
        { this.mAge = agEs ; }
    le code n'est pas lisible mais :
    - Il compile.
    - Et qu'un autre programmeur puisse modifier le code.

    Alors c'est le plus important je pense. Un chef d'entreprise ou l'utilisateur d'une application veut un code qui fonctionne peu importe la manière de coder.

    J'en est fait l'expérience, le plus important quand tu programme est de mettre des commentaires. Si tu ne met pas de commentaires :
    - Personne ne pourra modifier ton programme ou très lentement.
    - Si tu reviens sur ton code ( un jour ) tu auras beaucoup de mal pour comprendre ton programme.

  9. #9
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    D'où l'intérêt d'une javadoc claire

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/03/2013, 10h52
  2. Intégrer balise H1 ,H2, H3 dans le code source génére par Webaccapela
    Par radmax dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/06/2011, 10h54
  3. Codes sources pollués par lignes vides
    Par MilaP dans le forum EDI
    Réponses: 4
    Dernier message: 04/02/2011, 19h44
  4. présentation du code HTML
    Par cristolb dans le forum ASP
    Réponses: 8
    Dernier message: 26/08/2005, 15h11

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