Bonjour,
Alors, pour répondre à ta première réponse, JavaBeans est une convention toute simple qui vise juste à permettre à des applications de manipuler des objets par introspection. Dans 95% des cas, cette convention est utile pour les EDI qui proposent des designers d'interface. En effet, quand on sélectionne un composant graphique dans un designer, on a toujours une fenêtre qui permet de modifier ses propriétés. Et en général, une propriété correspond à une paire getter/setter (ou seulement getter si elle est en lecture seule) sur l'objet qui représente le composant. Donc, pour permettre aux EDI de manipuler ces composants graphiques, la convention JavaBeans est apparue et dit seulement qu'un objet Java est un JavaBean s'il possède un constructeur par défaut (pour que les EDIs puissent l'instancier facilement) et si, pour une propriété "abc" (toujours en minuscule), son getter est "Type getAbc()", et son setter est "void setAbc(Type abc)".
Cette convention a été largement adoptée au-delà du concept de JavaBean, et il est quasiment de rigueur de nommer ses accesseurs ainsi. Mais dans ton cas, même sans parler de la moindre convention, le nom "getPosition" ne convient vraiment pas pour ta méthode, car il viole un principe universel en programmation : le principe de moindre surprise. Le nom parle de lui-même. Et en l'occurrence, comme je l'ai dit dans ma première réponse, le comportement de la méthode va être une surprise pour quiconque l'utilisera, au vu de son nom.
Ensuite, concernant ta "question subsidiaire", le fait de permettre le chaînage de méthodes est un de ces sujets qui font couler beaucoup d'encre. C'est extrêmement subjectif. En ce qui me concerne, je suis très attaché à la sémantique de ce que j'écris, bien plus qu'à sa "praticité". Pour moi, c'est beau quand c'est logique et simple, quitte à ce que ce soit un peu plus verbeux. Or le chaînage de méthodes est certes simple, mais il oblige à faire une entorse à la sémantique d'une méthode pour obtenir un effet syntaxique. D'autant que cet effet n'est, à mon sens encore une fois, pas très esthétique.
Concernant ta deuxième réponse maintenant, tu poses une question très intéressante. Mais ce qui est bien, c'est que tu y as répondu parfaitement tout seul
. Effectivement, il te faut un setter. Et comme tu le dis, il est bon de toujours appeler un setter, justement pour éviter d'avoir à se poser cette question. Ainsi, ton implémentation peut être quelconque, l'utilisateur voit toujours des positions au travers de Vector3d, aussi bien pour les récupérer que pour les définir.
Ceci soulève un autre point intéressant : tu as deux possibilités pour ton setter :
void setPosition(int i, int x, int y, int z)
ou
void setPosition(int i, Vector3d position)
Les deux possibilités ne sont pas équivalentes. En effet, dans le premier cas, ton setter ne dépend pas de Vector3d (ce qui réduit le couplage entre les deux classes). Par contre, si on imagine qu'un jour une position puisse nécessiter une information supplémentaire (certes l'exemple n'est pas très bon pour ce cas), tu seras obligé d'ajouter un paramètre à ta méthode, et donc de reprendre tous les appels pour les corriger. Avec la deuxième solution, tu introduis une abstraction supplémentaire, ce qui est bénéfique puisque le code qui utilise le setter ne dépend plus de ce en quoi consiste une position.
En espérant t'avoir éclairé
.
Partager