Геттерів та сетерів часто критикують як неналежне ОО. З іншого боку, більшість кодів, що я бачив, мають великі геттери та сетери.
Коли виправдані геттери та сетери? Ви намагаєтесь уникати їх використання? Чи загалом вони зловживають?
Якщо ваша улюблена мова має властивості (мої), то такі речі також вважаються геттерами та сетерами для цього питання. Це те саме з точки зору методології ОО. У них просто приємніший синтаксис.
Джерела критики щодо геттера / сетера (деякі з коментарів, щоб покращити видимість):
- 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
Висловити критику просто: Геттери та сетери дозволяють маніпулювати внутрішнім станом об'єктів ззовні об'єкта. Це порушує інкапсуляцію. Тільки сам об’єкт повинен дбати про свій внутрішній стан.
І приклад Процедурна версія коду.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Версія коду мутатора:
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);
}
Геттери та сетери ускладнили код набагато складніше, не надаючи належної інкапсуляції. Оскільки внутрішній стан доступний для інших об'єктів, ми не отримуємо багато, додаючи ці геттери та сетери.
Питання раніше обговорювалося в "Переповнення стека":
Getters and setters are often criticized as being not proper OO
- Цитування, будь ласка.