10
votes

Quelle est l'importance des conventions de nommage pour les getters en Java?

Je suis un énorme croyant en cohérence et donc des conventions.

Cependant, je développe actuellement un cadre en Java où ces conventions (spécifiquement les obtiennent / définir Convention de préfixe) semblent entrer dans la voie de la lisibilité. Par exemple, certaines classes auront id et nom et à l'aide de o.getid () au lieu de o.id () < / code> semble totalement inutile pour un certain nombre de raisons:

  • Les classes sont immuables, il y a donc (généralement) aucun ensemble correspondant,
  • Il n'y a aucune chance de confusion,
  • Le obtenez dans ce cas ne transmet aucune sémantique supplémentaire et
  • J'utilise ce Obtenez un schéma de nommage sans cohérence sans cohérence tout au long de la bibliothèque.

    Je reçois une certaine assurance de la collection Java Collection CLASSES (et d'autres classes de la bibliothèque de la plate-forme Java) qui enfreint également les conventions JavaBean (par exemple, ils utilisent Taille au lieu de < Code> Getize etc.).

    Pour obtenir cette préoccupation hors de la manière suivante: le composant jamais est utilisé comme JavaBean car ils ne peuvent pas être utilisés de manière significative de cette façon.

    D'autre part, je suis pas un utilisateur java chevronné et je ne sais pas quels autres développeurs Java attendent d'une bibliothèque. Puis-je suivre l'exemple des classes de plate-forme Java dans cette ou est-elle considérée comme un style mauvais? La violation du obtenir / Convention dans les classes de bibliothèque Java a jugé une erreur de rétrospective? Ou est-il complètement normal d'ignorer les conventions javabes lorsqu'elles ne sont pas applicables?

    (le Conventions de code solaire pour Java Ne le mentionnez pas du tout.) < / p>


0 commentaires

6 Réponses :


11
votes

Si vous suivez les conventions de nommage appropriées, les outils de 3ème partie peuvent facilement s'intégrer et utiliser votre bibliothèque. Ils s'attendront à getx () , isx () et et essayez de les trouver par réflexion.

Bien que vous disiez que ceux-ci ne seront pas exposés en tant que Javabeans, je suivrais toujours les conventions. Qui sait ce que vous voudrez peut-être faire plus loin dans la ligne? Ou peut-être à une étape ultérieure, vous voudrez extraire une interface sur cet objet et créer un proxy accessible via d'autres outils?


2 commentaires

Absolument convenu ici - de nombreux cadres (par exemple, JSF) ne parviendront pas à travailler à moins que vous suiviez les conventions. C'est la norme Java Bean, mais elle est devenue une convention commune à de nombreuses couches. La divergence des normes est périlleuse et ne devrait être effectuée que avec une très bonne raison. La signalisation de l'immuabilité ne compte pas.


@Tim: la signalisation de l'immuabilité n'est en réalité pas mon argument contre la suite de la Convention, l'immuabilité n'est qu'une raison de moins de suivre la Convention (la raison même étant que obtenir semble sémantiquement redondant pour le programmateur). Points valides, cependant.



5
votes

La violation de la convention GET / SET dans les classes de la bibliothèque Java est très une erreur. Je vous recommanderais en fait que vous suivez la Convention, pour éviter la complexité de savoir pourquoi / lorsque la convention n'est pas suivie.


2 commentaires

Exactement; Les classes API Java standard ne sont certainement pas parfaites et cohérentes. (Par exemple, certains ont une taille de méthode (), tandis que d'autres ont une longueur de la méthode ()). Ne prenez pas les classes de l'API standard comme des exemples parfaits de la façon de faire des choses.


@Jesper: Certainement, mais les classes de collection neuves sont un exemple de conception exceptionnellement bonne API, développée avec beaucoup de prévoyance et un grand degré de cohérence (ignorant la compatibilité à l'envers pour un instant).



2
votes

Le schéma get-moins utilisé est utilisé dans une langue comme Scala (et autres langues ) , avec le Principe d'accès uniforme :

Scala conserve les noms de champ et de méthode dans la même espace de noms, ce qui signifie que nous ne pouvons pas nommer le nombre de champs si une méthode est nommée compte. De nombreuses langues, telles que Java, n'ont pas cette restriction, car elles gardent les noms de champ et de méthode dans des espaces de noms distincts.

Puisque Java n'est pas destiné à offrir UAP pour "Propriétés", il est préférable de faire référence à ces propriétés avec les conventions Get / Set.

uap signifie:

  • foo.bar et foo.bar () sont identiques et se réfèrent à la propriété de lecture, ou à une méthode de lecture pour la propriété.
  • foo.bar = 5 et foo.bar (5) sont identiques et se réfèrent à la définition de la propriété ou à une méthode d'écriture pour la propriété.

    En Java, vous ne pouvez pas réaliser UAP car foo.bar et foo.bar () sont dans deux espaces de noms différents.
    Cela signifie d'accéder à la méthode de lecture, vous devrez appeler foo.bar () , qui n'est pas différent d'appeler une autre méthode.
    Donc, cette convention Get-Set peut aider à différencier cet appel des autres (non liés aux propriétés), car "Tous les services (ici" (ici ", lisant / définir une valeur, ou l'informatique") proposée par un module ne peut pas être disponible via un module. Notation uniforme ".
    Ce n'est pas obligatoire, mais c'est un moyen de reconnaître un service relatif à obtenir / définir ou à calculer une valeur de propriété, des autres services.
    Si UAP était disponible en Java, cette convention ne serait pas nécessaire du tout.

    Remarque: la taille () au lieu de getize () est probablement un héritage de mauvaise nommage préservé pour le mantra de Java est "compatible vers l'arrière: toujours". / p>


1 commentaires

Je ne comprends pas cela: "Puisque Java ne veut pas offrir uap pour" propriétés ", il est préférable de se référer à ces propriétés avec les conventions Get / Set." - Le contraire est certainement vrai? Scala, contrairement à Java, ne peut pas Noms de surcharge pour les propriétés, seul Java peut, grâce au manque de UAP. Je ne comprends pas comment il s'ensuit que je devrais utiliser obtenir préfixes.



6
votes

Je déteste vraiment cette convention strong>. Je serais très PASSER si elle a été remplacée par un véritable outil java qui fournirait l'accesseur / méthodes modification.

Mais je suivre cette convention dans tout mon code strong>. Nous ne programmons pas seul, et même si toute l'équipe est d'accord sur une convention spéciale en ce moment, vous pouvez être assuré que les nouveaux arrivants futurs, ou une équipe d'avenir qui maintiendra votre projet, auront du mal au début ... Je crois que la gêne occasionnée pour get / set est pas aussi grand que l'inconvénient d'être non-standard p>


Je voudrais soulever une autre préoccupation:. souvent, les logiciels java utilise trop de accesseurs et modificateurs ( se mettre). Nous devons appliquer beaucoup plus la « Dites, ne demandez pas strong> » conseils. Par exemple, remplacer les getters sur B par une méthode "réelle": p>

    class A {
      B b;
      String c;
      void a() {
        b.a(c); // Class B has the algorithm.
      }
    }
  • B peut être immuable (excellent pour thread-safe) li>
  • B peut sous-classes de modifier le calcul, alors B pourrait ne pas exiger une autre propriété à cet effet. Li>
  • La mise en œuvre est plus simple en B, il aurait été en A, parce que vous ne devez pas utiliser le getter et l'accès externe aux données, vous êtes à l'intérieur B et peuvent profiter des détails de mise en œuvre (vérification des erreurs, spéciales cas, en utilisant les valeurs mises en cache ...). li>
  • Étant situé en B à laquelle elle a plus de couplage (deux propriétés au lieu d'un A), il est probable que refactoring A aura pas d'impact de l'algorithme. Pour un B refactoring, il peut être l'occasion d'améliorer l'algorithme. Donc, l'entretien est moins. Li> Ul> p>


0 commentaires


0
votes

Considérez ceci: Beaucoup de cadres peuvent être informés de faire référence à une propriété dans le champ de l'objet tel que «Nom». Sous la capuche, le cadre comprend d'abord "Nom" en "Nom" en "SetName", figurez à partir de son paramètre singulier Quel est le type de retour, puis formant "getName" ou "ISNAME".

Si vous ne fournissez pas de mécanisme d'accesseur / mutateur aussi bien documenté, votre cadre / votre bibliothèque ne fonctionnera tout simplement pas avec la majorité des autres bibliothèques / frameworks.


5 commentaires

@Esko: Oui, c'est le creux de ma question: Quels cadres sont-ils et comptent-ils? J'ai déjà mentionné que mes cours n'ont pas de sens comme haricots et mon expérience de Java limitée n'a jamais traité d'autres bibliothèques. J'adore chèrement si quelqu'un pourrait signaler des exemples pertinents (Tim déjà fait, dans un commentaire à la réponse acceptée).


... (suite) Evidemment, Josh Bloch n'a pas estimé cela un obstacle majeur lors de la conception de la bibliothèque de collections. Ma bibliothèque est similaire à certaines salutations.


À peu près tout cadre sérieusement pris. Le paradigme du point de get / Set est que si vous avez besoin d'accès ou de mutation de l'état interne de votre objet, utilisez-les. Même les collections fonctionnent de cette façon; Cependant, les collections ne sont pas des haricots.


Les JavaBiens sont complètement pertinents pour moi en tant que développeur Android, bien que j'utilise toujours Java. La question concerne Java et pour Pure Java prépendant tous les getters avec obtenez * n'a pas de valeur réelle. Adapter les conventions de code pour la facilité de certains cadres est définitivement une faille.


@Alexi tandis que cette réponse est assez ancienne, elle est toujours debout - JVM n'a pas de vrais propriétés de membre ( Contrairement par exemple CLR ), ce qui signifie que le seul moyen d'obtenir une propriété comme la fonctionnalité est d'utiliser Set / Get méthodes.