Getters e setters são frequentemente criticados por não serem apropriados OO. Por outro lado, a maioria dos códigos OO que eu tenho possui extensores e setters.
Quando justificadores e setters são justificados? Você tenta evitar usá-los? Eles são usados em geral?
Se seu idioma favorito possui propriedades (a minha possui), essas coisas também são consideradas getters e setters para esta pergunta. Eles são a mesma coisa do ponto de vista da metodologia OO. Eles apenas têm uma sintaxe melhor.
Fontes para a crítica Getter / Setter (algumas tiradas dos comentários para oferecer melhor visibilidade):
- 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
Para declarar a crítica simplesmente: Getters e Setters permitem que você manipule o estado interno dos objetos de fora do objeto. Isso viola o encapsulamento. Somente o próprio objeto deve se preocupar com seu estado interno.
E um exemplo de versão procedural do código.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Versão do código do Mutator:
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);
}
Os getters e setters tornaram o código muito mais complicado sem permitir o encapsulamento adequado. Como o estado interno é acessível a outros objetos, não ganhamos muito adicionando esses getters e setters.
A questão foi discutida anteriormente no Stack Overflow:
Getters and setters are often criticized as being not proper OO
- Citação, por favor.