Геттеры и сеттеры часто критикуются за то, что они не являются правильными. С другой стороны, большая часть кода OO, который я видел, содержит обширные методы получения и установки.
Когда получатели и установщики оправданы? Вы пытаетесь избежать их использования? Они чрезмерно используются в целом?
Если у вашего любимого языка есть свойства (у моего есть), то такие вопросы также считаются получателями и установщиками для этого вопроса. Это одно и то же с точки зрения методологии ОО. У них просто более приятный синтаксис.
Источники для Критики Геттера / Сеттера (некоторые взяты из комментариев, чтобы дать им лучшую видимость):
- 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
- Цитировать, пожалуйста.