Quelle est la meilleure pratique pour utiliser «get» dans les noms de méthodes?

StackOverflow https://stackoverflow.com/questions/261387

  •  06-07-2019
  •  | 
  •  

Question

J'ai remarqué à de nombreux endroits en Java (C # inclus) que beaucoup de "getter". les méthodes sont précédées de "get". alors que beaucoup d'autres ne le sont pas. Je n'ai jamais remarqué le moindre motif que Sun semble suivre. Quelles sont les règles ou règles d'utilisation de & get; get " dans les noms de méthodes getter?

Était-ce utile?

La solution

Cela revient à la sémantique. Oui, C # a " propriétés " qui vous donnent un module de méthode get / set ... mais des fonctions (... "méthodes" ...) dans le .NET Framework commençant par "Get". est censé indiquer au développeur qu’une opération est en cours dans le seul but d’obtenir des résultats.

Vous pensez peut-être que c'est étrange et vous dites "pourquoi ne pas utiliser simplement le type de retour pour indiquer des personnes dans?", et la réponse est simple. Pensez aux méthodes suivantes:

public Person CreatePerson(string firstName, string lastName) {...}

Rien que par le nom de cette méthode, vous pouvez probablement penser qu’il y aura une activité dans la base de données, puis une "personne" nouvellement créée. sera retourné.

mais qu'en est-il de cela:

public Person GetPerson(string firstName, string lastName) {...}

Juste par le nom de cette méthode , vous pouvez probablement supposer qu'un "100%" " Safe " la récupération d'une personne d'une base de données est en cours.

Vous n’appelez jamais le " CreatePerson " plusieurs fois ... mais vous devriez pouvoir appeler "GetPerson". tout le temps. (cela ne devrait pas affecter l'état de l'application).

Autres conseils

" obtenez " et " set " La paire de préfixes en Java est utilisée à l'origine comme convention pour désigner le bean java. Cela deviendra plus tard une simple convention d’encapsulation, car Java, contrairement à C #, n’a pas les propriétés appropriées.

Dans Java , la meilleure pratique consiste à utiliser les préfixes get et set pour les propriétés.

Les frameworks, bibliothèques de balises, etc. rechercheront des méthodes avec ces préfixes et les utiliseront comme propriétés.

Donc, si vous avez une classe Java comme celle-ci ...

public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}

.. avec struts-tags (ou toute autre bibliothèque de balises basée sur ognl), vous accéderez à la propriété name avec user.name .

Le framework Spring utilise également cette convention dans les fichiers de configuration XML.

Java ne supporte pas (encore) les propriétés. Getters et setters sont un bodge pour contourner cela. D'autres langues, y compris C #, prennent en charge les propriétés et vous devez les utiliser à la place. Ce n'est pas simplement une "meilleure pratique" chose non plus: la sérialisation en C # dépendra des propriétés, pas des accesseurs & amp; Si vous ne souhaitez pas utiliser les propriétés, vous risquez de rencontrer de nombreux problèmes si vous devez sérialiser vos classes.

L'avantage des propriétés est qu'elles rendent le code plus lisible. Quelque chose comme

obj.setX(10);

en Java, devient

obj.X = 10;

Pourtant, en coulisse, X est une méthode plutôt qu'une variable et peut donc effectuer une vérification des entrées incorrectes, etc.

J'aime personnellement la règle suivante:

  • Utilisez le préfixe get chaque fois que la valeur est directement modifiable avec une méthode set correspondante
  • Supprimez le préfixe get dans les cas où la valeur est quelque chose que vous ne pouvez pas définir directement en tant que propriété (c'est-à-dire qu'il n'existe pas de méthode setXXX équivalente)

La seconde raison est que si la valeur n'est pas vraiment une propriété configurable par l'utilisateur, en tant que tel, alors il ne devrait pas avoir besoin d'une paire de méthodes get / set. Cela implique que si cette convention est suivie et que vous voyez une méthode getXXX, vous pouvez également supposer l’existence d’une méthode setXXX.

Exemples:

  • String.length () - les chaînes étant immuables, la longueur est une valeur en lecture seule
  • ArrayList.size () - la taille change lorsque des éléments sont ajoutés ou supprimés, mais vous ne pouvez pas le définir directement

Autrefois, les API exposaient souvent des propriétés en lecture seule sans le préfixe get : String.length () et même le plus récent Buffer.capacity () être des exemples raisonnables.

L'avantage de ceci est qu'il y a moins de duvet impliqué. L'inconvénient est que tout ce qui tente de déterminer automatiquement les propriétés en fonction des conventions ne les découvre pas. Personnellement, j'ai tendance à préférer inclure le préfixe.

Bien sûr, en C #, il est généralement hors de propos car il y a des "vrais". propriétés quand même:)

Cela dépend. Ce sont souvent des informations redondantes, même dans des langues sans propriétés.

En C ++, au lieu d’une paire getAttr () / setAttr (), il est courant de fournir deux surcharges d’une fonction Attr (): vide Attr (Foo f); // Le passeur Foo Attr (); // Le getter

En Java, il est courant de préfixer get / set. Je dois dire que la meilleure pratique consiste à respecter la norme dans votre langue. En Java, les gens s’attendent à voir les préfixes get / set. Par conséquent, les omettre peut les décontenancer, même s’ils ne sont pas strictement nécessaires.

Objective C 2.0 utilise également des propriétés, utilisant la même syntaxe que les points.

Auparavant, il utilisait un schéma de dénomination légèrement différent pour les accesseurs (getters) et les setters (qui, bien sûr, peut toujours être utilisé avec des propriétés ou pour de simples attributs anciens).

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

C'est-à-dire que get est utilisé d'une manière différente. Il ne renvoie pas de valeur, mais stocke le résultat dans la variable transmise.

Le getter typique a le même nom que l'attribut, le setter est l'attribut préfixé par set (selon la convention de Java). Ces conventions sont utilisées par le système KVO (Key-Value Observation) et doivent donc être respectées.

Juste un petit addenda: une autre convention consiste à préfixer les getters de champs booléens par "is est". au lieu de "get", par ex. bool isEnabled () {return enabled; }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top