Getters i setery są często krytykowane jako nieodpowiednie OO. Z drugiej strony większość kodu OO, który widziałem, zawiera rozległe programy pobierające i ustawiające.
Kiedy pobierający i ustawiający są uzasadnieni? Czy starasz się ich nie używać? Czy są ogólnie nadużywane?
Jeśli twój ulubiony język ma właściwości (mój ma), wówczas takie rzeczy są również uważane za pobierające i ustawiające dla tego pytania. Są to samo z perspektywy metodologii OO. Po prostu mają ładniejszą składnię.
Źródła krytyki Gettera / Settera (niektóre wzięto z komentarzy, aby poprawić ich widoczność):
- 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
Aby wyrazić krytykę po prostu: Getters and Setters pozwalają manipulować stanem wewnętrznym obiektów spoza obiektu. To narusza enkapsulację. Tylko sam obiekt powinien dbać o swój stan wewnętrzny.
I przykładowa wersja proceduralna kodu.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Wersja kodu mutatora:
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);
}
Programy pobierające i ustawiające znacznie skomplikowały kod bez zapewnienia odpowiedniego hermetyzacji. Ponieważ stan wewnętrzny jest dostępny dla innych obiektów, niewiele zyskujemy przez dodanie tych pobierających i ustawiających.
Pytanie zostało wcześniej omówione na temat przepełnienia stosu:
Getters and setters are often criticized as being not proper OO
- Proszę o cytowanie.