Getter und Setter werden oft als nicht richtig kritisiert. Andererseits hat der meiste OO-Code, den ich gesehen habe, umfangreiche Getter und Setter.
Wann sind Getter und Setter gerechtfertigt? Versuchen Sie, sie zu vermeiden? Sind sie im Allgemeinen überbeansprucht?
Wenn Ihre Lieblingssprache Eigenschaften hat (meine hat), werden solche Dinge auch als Stärkungsmittel für diese Frage angesehen. Aus Sicht der OO-Methodik sind sie dasselbe. Sie haben nur eine schönere Syntax.
Quellen für Kritik an Gettern / Setzern (einige stammen aus Kommentaren, um die Sichtbarkeit zu verbessern):
- 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
Um die Kritik einfach zu formulieren: Mit Getters und Setters können Sie den internen Zustand von Objekten von außerhalb des Objekts manipulieren. Dies verletzt die Kapselung. Nur das Objekt selbst sollte sich um seinen internen Zustand kümmern.
Und eine Beispielprozedurversion des Codes.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Mutator-Version des Codes:
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);
}
Die Getter und Setter machten den Code viel komplizierter, ohne dass eine ordnungsgemäße Kapselung möglich war. Da der interne Zustand für andere Objekte zugänglich ist, gewinnen wir durch Hinzufügen dieser Getter und Setter nicht viel.
Die Frage wurde bereits zu Stack Overflow erörtert:
Getters and setters are often criticized as being not proper OO
- Bitte zitieren.