2010-08-06 2 views
4

Je vois assez souvent la convention de nommage suivante utilisée dans le code java.Pourquoi Java utilise-t-il la convention de this.member?

class SomeClass { 
    private final String name; 

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

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

class SomeClass { 
    private final String name; 

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

Compile fine. Peut-être que les drapeaux ne sont pas utilisés comme variable inutilisée mais l'assignation (qui devient une auto-affectation) se compile silencieusement.

je trouve moi-même vouloir utiliser « m » pour les variables membres en tant que telles ...

class SomeClass { 
    private final String mName; 

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

Il est plus courte que la variante de .ce et attrape l'erreur faute d'orthographe étrange précédemment montré.

Cependant un de mes collègues m'a donné toutes sortes de pare-balles quand j'ai apporté ceci comme une convention sur notre nouveau projet en indiquant que « en Java, nous ne le faisons pas. ».

curieux de savoir pourquoi?

+1

Ce n'est pas spécifique à Java. La même discussion s'applique à un certain nombre de langues, par ex. C#. – Cumbayah

+0

J'ai vu le mot-clé 'this' utilisé pour éviter de choisir des noms de variables différentiables, par ex. en passant dans les paramètres comme vu ci-dessus. J'essaie généralement de trouver un meilleur nom de variable, mais là où je travaille actuellement, 'this' est utilisé partout. – Feanor

+0

À quelle fréquence faites-vous des erreurs comme ça? Je devine presque jamais. Pendant une courte période, j'ai été forcé d'utiliser un préfixe et j'ai fait quelques erreurs avec ça. –

Répondre

15

Personnellement, je n'aime pas utiliser préfixes - il rend le code plus difficile à lire, l'OMI. Je crois que différentes personnes lisent de différentes façons - je finis par lire «à voix haute dans ma tête» et les préfixes interrompent ce processus. Évidemment, vous pouvez vous y habituer, mais je préfère ne pas le faire.

Cependant, ce serait une erreur de prétendre que personne ne préférait comme ceci. J'ai travaillé dans différentes entreprises utilisant Java - certains préfixes utilisés, d'autres non.

Je signale également que la plupart des environnements de développement vous donnera un avertissement au sujet d'une affectation no-op dans votre exemple typo. Par exemple, dans Eclipse je reçois:

The assignment to variable name has no effect 

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

+3

Trop souvent, je rencontre des bogues qui sont facilement résolus en faisant simplement attention à ce que l'EDI me dit. –

2

IDEs modernes tels que Eclipse peuvent générer automatiquement des accesseurs pour vous si ce problèmes de façon peuvent être évités.

+1

Et un constructeur aussi, comme dans ce cas. –

9

Je préfère utiliser this que dans les rares endroits où besoin pour effacer l'ambiguïté, faites glisser avec moi les préfixes partout dans le code.

1

Dans le premier exemple, le qualificatif this est nécessaire de faire référence explicitement l'élément d'instance name par opposition à la variable locale (paramètre de procédé) name.

Vous avez raison lorsque vous mentionnez la possibilité de fautes d'orthographe du nom du paramètre, et cela a été la source de quelques bugs frustrant. Par le passé, j'ai également utilisé une convention de dénomination de préfixe pour les champs, mais comme java se base de plus en plus sur la réflexion, cela introduit un certain niveau de douleur, alors dernièrement je m'en suis éloigné. La probabilité de bugs due à une faute d'orthographe peut être réduite en utilisant des tests unitaires, et aussi en utilisant un IDE qui analyse le code avant de s'enregistrer et signale ces erreurs d'enfants pour vous.

5

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

Comme vous l'avez noté, un bon IDE vous avertira de la variable inutilisée (et vous permettra probablement de transformer cet avertissement en erreur). La coloration syntaxique distinguera également les variables locales et les variables membres. Pourquoi proposer des conventions de code moche pour faire le travail de l'EDI de rendre un type très spécifique d'erreur programmeur moins probable?

0

J'ai eu en fait une conférence où un prof de mes nous a donné la classe java suivante dans une mission:

public class Person { 
    private String name; 
    private int age; 

    public Foo(String __name, int __age) { 
     name = __name; 
     age = __age; 
    } 

    public String sayHello() { 
     return "Hello, my name is " + name + " and I am " + age + " years old"; 
    } 
} 

j'ai parlé au Java Coding Conventions et lui a demandé de bien vouloir si je peux factoriser son code. Fondamentalement this est pour écrire des constructeurs et des setters beautyful. Et bien sûr pour tous les autres cas pour lesquels je aurais autrement besoin de renommer les paramètres de la méthode à underunder + nom du paramètre ou encore mieux p + nom du paramètre comme je l'ai vu si souvent.

1

Il me semble étrange que votre question fait l'hypothèse que

Java utilise la convention de this.member

En moyenne n'est-ce vrai, parce que les gens ont différentes conventions. Dans mon code, il y a beaucoup de membres, mais c'est seulement parce que mon EDI (netbeans) génère ça, et je me fous de réécrire.

1

this.member n'est pas une convention mais il est nécessaire, par exemple, de faire explicitement référence à une variable d'instance ayant le même nom qu'une variable locale dans une méthode.

Dans d'autres cas non obligatoires, vous pouvez l'omettre car il est implicite et choisir la convention souhaitée.