Getters y setters a menudo son criticados por no ser OO adecuados. Por otro lado, la mayoría del código OO que he visto tiene extensores captadores y establecedores.
¿Cuándo se justifican getters y setters? ¿Intentas evitar usarlos? ¿Se usan en exceso en general?
Si su idioma favorito tiene propiedades (el mío), entonces esas cosas también se consideran captadores y establecedores para esta pregunta. Son lo mismo desde una perspectiva de metodología OO. Simplemente tienen una sintaxis más agradable.
Fuentes de crítica de Getter / Setter (algunas tomadas de comentarios para darles una mejor visibilidad):
- 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 expresar la crítica simplemente: Getters y Setters le permiten manipular el estado interno de los objetos desde el exterior del objeto. Esto viola la encapsulación. Solo el objeto mismo debe preocuparse por su estado interno.
Y un ejemplo Versión procesal de código.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Versión del código del mutador:
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);
}
Los captadores y definidores hicieron el código mucho más complicado sin permitir una encapsulación adecuada. Debido a que el estado interno es accesible para otros objetos, no ganamos mucho al agregar estos captadores y establecedores.
La pregunta se ha discutido previamente en Stack Overflow:
Getters and setters are often criticized as being not proper OO
- Cita, por favor.