Je suis un énorme croyant en cohérence et donc des conventions. P>
Cependant, je développe actuellement un cadre en Java où ces conventions (spécifiquement les Je reçois une certaine assurance de la collection Java Pour obtenir cette préoccupation hors de la manière suivante: le composant jamais em> est utilisé comme JavaBean car ils ne peuvent pas être utilisés de manière significative de cette façon. P>
D'autre part, je suis pas em> 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 (le Conventions de code solaire pour Java Ne le mentionnez pas du tout.) < / p> obtiennent code> /
définir code> Convention de préfixe) semblent entrer dans la voie de la lisibilité. Par exemple, certaines classes auront
id code> et
nom code> et à l'aide de
o.getid () code> au lieu de
o.id () < / code> semble totalement inutile pour un certain nombre de raisons: p>
obtenez code> dans ce cas ne transmet aucune sémantique supplémentaire et li>
Obtenez un schéma de nommage sans cohérence sans cohérence tout au long de la bibliothèque. Li>
ul>
Collection CODE> 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 Code> au lieu de < Code> Getize code> etc.). P>
obtenir
/
Convention code> 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? P>
6 Réponses :
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 à 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? P> getx () code>,
isx () code> et et essayez de les trouver par réflexion. P>
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 code> semble sémantiquement redondant pour le programmateur). Points valides, cependant.
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
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 i> sont un exemple de conception exceptionnellement bonne i> API, développée avec beaucoup de prévoyance et un grand degré de cohérence (ignorant la compatibilité à l'envers pour un instant).
Le schéma get-moins utilisé est utilisé dans une langue comme Scala (et autres langues ) , avec le Principe d'accès uniforme : P>
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. P> blockQuote>
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. P>
uap signifie: p>
foo.bar code> et
foo.bar () code> sont identiques et se réfèrent à la propriété de lecture, ou à une méthode de lecture pour la propriété. LI>
foo.bar = 5 code> et
foo.bar (5) code> sont identiques et se réfèrent à la définition de la propriété ou à une méthode d'écriture pour la propriété. li> ul>
En Java, vous ne pouvez pas réaliser UAP car
foo.bar code> et
foo.bar () code> sont dans deux espaces de noms différents.
Cela signifie d'accéder à la méthode de lecture, vous devrez appelerfoo.bar () code>, 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. P>Remarque: la taille
() code> au lieu de
getize () code> est probablement un héritage de mauvaise nommage préservé pour le mantra de Java est "compatible vers l'arrière: toujours". / p>
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 i> 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 code> préfixes.
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.
}
}
C'est exactement mon point, cependant: Malheureusement, je ne peux tout simplement pas décider si iigni, manque d'expérience. Pour l'instant, je vais avaler la pilule amère et utiliser getxxx code>. Mais merci d'avoir mentionné la vue de Bloch à ce sujet, je respecte énormément ce type de gens.
Juste comme un post mortem: j'aurais dû partir sans le préfixe code> code>, il est totalement inutile dans mon cas. Haricots? Jamais utilisé.
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". P>
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. P>
@Esko: Oui, c'est le creux de ma question: Quels cadres i> 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 * code> 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 i>), ce qui signifie que le seul moyen d'obtenir une propriété comme la fonctionnalité est d'utiliser Set / Get méthodes.