4 votes

Pourquoi Java utilise-t-il la convention this.member ?

Je vois assez souvent la convention de nommage suivante utilisée dans le code Java.

class SomeClass {
    private final String name;

    public SomeClass(final String name) {
        this.name = name;
    }
}

Cela me semble un peu étrange. Tout d'abord, si la variable est mal orthographiée dans la signature de la méthode, elle sera quand même compilée...

class SomeClass {
    private final String name;

    public SomeClass(final String nane) {
        this.name = name;
    }
}

Compile bien. Il est possible que nane soit considéré comme une variable inutilisée, mais l'affectation (qui devient juste une affectation de soi) se compile silencieusement.

Je me retrouve à vouloir utiliser "m" pour les variables membres en tant que telles...

class SomeClass {
    private final String mName;

    public SomeClass(final String name) {
        mName = name;
    }
}

Elle est plus courte que la variante .this et corrige l'étrange erreur d'orthographe montrée précédemment.

Cependant, un de mes collègues m'a fait toutes sortes de reproches lorsque j'ai évoqué cette convention dans le cadre de notre nouveau projet, en déclarant que "en Java, on ne fait pas ça".

Je suis curieux de savoir pourquoi.

15voto

Jon Skeet Points 692016

Personnellement, je n'aime pas utiliser des préfixes - cela rend le code plus difficile à lire, IMO. Je pense que chaque personne lit de manière différente - je finis par lire "à haute voix dans ma tête" et les préfixes interrompent ce processus. Il est évident que l'on peut s'y habituer, mais je préfère ne pas avoir à le faire.

Cependant, il serait erroné de prétendre que personne a utilisé des préfixes comme celui-ci. J'ai travaillé dans différentes entreprises utilisant Java - certaines utilisaient des préfixes, d'autres non.

Je voudrais également souligner que la plupart des IDE vous donneront un avertissement à propos d'une affectation no-op dans votre exemple de faute de frappe. Par exemple, dans Eclipse, j'obtiens :

The assignment to variable name has no effect

Si vous ignorez régulièrement les avertissements, je dirais que vous avez de plus gros problèmes :)

9voto

bakkal Points 13449

Je préfère utiliser this uniquement dans le quelques endroits où cela est nécessaire pour lever l'ambiguïté, que de traîner avec moi les préfixes partout dans le code.

5voto

Michael Borgwardt Points 181658

L'utilisation de préfixes spécifiques pour les variables membres est une sorte de notation hongroise - la mauvaise technique. L'information (ce qui est et n'est pas une variable membre) est déjà dans le code, il n'est pas nécessaire de la dupliquer.

Comme vous l'avez noté, un bon IDE vous avertira de l'existence d'une variable inutilisée (et vous permettra probablement de transformer cet avertissement en erreur). La coloration syntaxique fera également la distinction entre les variables locales et les variables membres. Pourquoi inventer de vilaines conventions de code pour permettre à l'IDE de réduire la probabilité d'un type très spécifique d'erreur de la part du programmeur ?

2voto

thelost Points 4691

Les IDE modernes tels qu'Eclipse peuvent générer automatiquement des getters et setters pour vous, ce qui permet d'éviter les problèmes.

1voto

mdma Points 33973

Dans le premier exemple, le this est nécessaire pour référencer explicitement le membre de l'instance name par opposition à la variable locale (paramètre de la méthode) name .

Vous avez raison de mentionner la possibilité de fautes d'orthographe dans le nom du paramètre, et cela a été la source de quelques bogues frustrants. Dans le passé, j'ai également utilisé une convention de dénomination par préfixe pour les champs, mais comme Java s'appuie de plus en plus sur la réflexion, cela introduit un certain niveau de douleur, et je m'en suis donc éloigné dernièrement.

La probabilité de bogues dus à des fautes d'orthographe peut être réduite par l'utilisation de tests unitaires, ainsi que par l'utilisation d'un IDE qui analyse le code avant l'archivage et signale ces types d'erreurs pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X