Un champ public n'est pas pire qu'un getter/setter paire qui ne fait que retourner le terrain et en lui attribuant. Tout d'abord, il est clair que (dans la plupart des langues) il n'y a pas de différence fonctionnelle. Toute différence doit être dans d'autres facteurs, comme la maintenabilité ou la lisibilité.
Un souvent mentionné avantage de getter/setter paires, n'est-ce pas. Il y a cette demande, vous pouvez changer la mise en œuvre et vos clients n'ont pas à être recompilé. Soi-disant, les poseurs vous permettent d'ajouter des fonctionnalités comme la validation plus tard et vos clients n'ont même pas besoin de le savoir. Cependant, l'ajout d'une validation à un setter est un changement de ses conditions préalables, une violation du contrat précédent, qui a été, tout simplement, "vous pouvez mettre n'importe quoi ici, et vous pouvez obtenir la même chose plus tard à partir de la lecture".
Donc, maintenant que vous avez cassé le contrat, la modification de chaque fichier dans la base de code est quelque chose que vous devriez vous voulez à faire, ne pas éviter. Si vous éviter cela, vous êtes en faisant l'hypothèse que tout le code suppose que le contrat de ces méthodes est différent.
Si cela ne devrait pas avoir été le contrat, l'interface a été permettant aux clients de mettre l'objet dans des états non valides. C'est l'exact opposé de l'encapsulation Si ce champ n'a pas vraiment pu être réglé à n'importe quoi depuis le début, pourquoi n'était-ce pas la validation depuis le début?
Ce même argument s'applique à d'autres avantages supposés de ces pass-through getter/setter paires: si plus tard vous décidez de changer la valeur en cours de jeu, vous êtes de rompre le contrat. Si vous remplacez la valeur par défaut de la fonctionnalité dans une classe dérivée, de façon au-delà de quelques modifications inoffensifs (comme l'exploitation forestière ou à d'autres comportements observables), vous êtes de rompre le contrat de la classe de base. C'est une violation de la Liskov Substituabilité Principe, qui est considéré comme l'un des principes de OO.
Si une classe a muettes getters et setters pour chaque champ, il est une classe qui n'a pas d'invariants que ce soit, pas de contrat. Est-ce vraiment une conception orientée objet? Si l'ensemble de la classe a, c'est ceux des getters et setters, c'est juste un idiot de données de titulaire, et de la muette que les détenteurs de données devrait ressembler muette que les détenteurs de données:
class Foo {
public:
int DaysLeft;
int ContestantNumber;
}
L'ajout de passage-à travers les getter/setter paires à une telle classe n'ajoute pas de valeur. D'autres classes devraient fournir des activités, et pas seulement les opérations que les champs fournissent déjà. C'est la façon dont vous pouvez définir et maintenir utile invariants.
Client: "Que puis-je faire avec un objet de cette classe?"
Designer: "Vous pouvez lire et écrire plusieurs variables."
Client: "Oh... cool, je suppose?"
Il y a des raisons d'utiliser les accesseurs et mutateurs, mais si ces raisons n'existent pas, faire des getter/setter paires dans le nom de faux encapsulation des dieux n'est pas une bonne chose. Des raisons valables de le faire getters ou setters comprennent les choses est souvent mentionné comme le potentiel de changements que vous pouvez faire plus tard, comme la validation ou différentes représentations internes. Ou peut-être la valeur doit être lisible par les clients, mais pas en écriture (par exemple, la lecture de la taille d'un dictionnaire), de sorte qu'un simple getter est un bon choix. Mais ces raisons devraient être là quand vous faites le choix, et pas seulement comme un potentiel de chose que vous souhaitez peut-être plus tard. C'est une instance de YAGNI (you Ain't Gonna Besoin).