Getter e setter sono spesso criticati come non OO corretto. D'altra parte, la maggior parte del codice OO che ho visto ha getter e setter estesi.
Quando sono giustificati getter e setter? Cerchi di evitare di usarli? Sono abusati in generale?
Se la tua lingua preferita ha proprietà (la mia lo è), anche queste cose sono considerate getter e setter per questa domanda. Sono la stessa cosa dal punto di vista della metodologia OO. Hanno solo una sintassi migliore.
Fonti per la critica di Getter / Setter (alcune tratte dai commenti per dare loro una migliore visibilità):
- 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
Per esprimere semplicemente le critiche: Getter e setter consentono di manipolare lo stato interno degli oggetti dall'esterno dell'oggetto. Questo viola l'incapsulamento. Solo l'oggetto stesso dovrebbe preoccuparsi del suo stato interno.
E un esempio di versione procedurale del codice.
struct Fridge
{
int cheese;
}
void go_shopping(Fridge fridge)
{
fridge.cheese += 5;
}
Versione mutatore del codice:
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);
}
Getter e setter hanno reso il codice molto più complicato senza offrire l'incapsulamento corretto. Poiché lo stato interno è accessibile ad altri oggetti, non guadagniamo molto aggiungendo questi getter e setter.
La domanda è stata precedentemente discussa su Stack Overflow:
Getters and setters are often criticized as being not proper OO
- Citazione, per favore.