Les Getters et les setters sont souvent critiqués comme étant des OO non appropriés. D'autre part, la plupart du code OO que j'ai vu possède de nombreux accesseurs et régleurs.
Quand les getters et les setters sont-ils justifiés? Essayez-vous d'éviter de les utiliser? Sont-ils surutilisés en général?
Si votre langue préférée a des propriétés (la mienne), de telles choses sont également considérées comme des accesseurs pour la question. Ils sont la même chose du point de vue de la méthodologie OO. Ils ont juste une syntaxe plus agréable.
Sources de critiques Getter / Setter (certaines tirées de commentaires pour leur donner une meilleure visibilité):
- http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html
- http://typicalprogrammer.com/?p=23
- http://c2.com/cgi/wiki?AccessorsAreEvil
- http://www.darronschall.com/weblog/2005/03/no-brain-getter-and-setters.cfm
- http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and
- http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html
Pour énoncer la critique simplement: Les Getters et Setters vous permettent de manipuler l’état interne des objets de l’extérieur. Cela viole l’encapsulation. Seul l'objet lui-même doit se soucier de son état interne.
Et un exemple de version procédurale du code.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Version mutatrice du code:
class Fridge
{
int cheese;
void set_cheese(int _cheese) { cheese = _cheese; }
int get_cheese() { return cheese; }
}
void go_shopping(Fridge fridge)
{
fridge.set_cheese(fridge.get_cheese() + 5);
}
Les getters et les setters ont rendu le code beaucoup plus compliqué sans permettre une encapsulation correcte. Parce que l'état interne est accessible à d'autres objets, nous n'avons pas beaucoup à gagner en ajoutant ces accesseurs et ces setters.
La question a déjà été discutée sur Stack Overflow:
Getters and setters are often criticized as being not proper OO
- Citation, s'il te plaît.