L'interfaccia non include i dettagli di implementazione, per definizione. È il modo in cui interagisci con la 'cosa', così si potrebbe creare un'altra 'cosa' che fa la stessa cosa, anche se le sue interiora sono completamente diverse.
Il problema con i metodi get e set è che ti dicono cosa stanno facendo alle interiora della cosa. Un metodo chiamato .getZebra()
mi dice che c'è una variabile chiamata zebra
in quella cosa; altrimenti sarebbe stato chiamato .zebra()
, e non sapresti se è memorizzato o calcolato o cosa.
Se qualcuno vuole venire avanti e reimplementare la tua cosa in modo diverso (eventualmente tu, più avanti), e la tua interfaccia è cosparsa di getter e setter, allora c'è una scelta di a) rompere l'interfaccia, b) usando le stesse variabili per rappresentarlo, vincolando il disegno inutilmente, o c) simulando la presenza di quelle variabili nel nuovo codice, complicando inutilmente il disegno. È possibile che tu possa essere fortunato e che la tua interfaccia sia carina e non dovrai fare quelle cose, ma se usi nomi come getX()
e setY()
, stai pensando in termini di variabili x e y che tu hai, non ciò che rappresentano astrattamente.
I setter costringono anche il tuo oggetto a essere mutabile, e il significato di ciò che stai cercando di fare potrebbe non essere necessario.
L'implementazione di getter e setter non è garantita dalle parole 'get' o 'set', quindi tecnicamente puoi dire che fanno parte dell'interfaccia di classe e che quindi non c'è violazione di incapsulamento, ma in realtà non c'è. I programmatori usano le parole per dire qualcosa, e quando mettono 'get' o 'set' all'inizio del nome di un metodo, dicono "questo è implementato come variabile".
L'interno e l'esterno di una classe (o di un oggetto) si trovano a diversi livelli di astrazione; l'interno è tutto su come è fatto, l'esterno è tutto su ciò che può essere fatto. La denominazione dovrebbe riflettere la distinzione.
Se ti ritrovi a scrivere un oggetto che ha molti getter e setter e non riesci a trovare un modo ragionevole per rinominarli, probabilmente hai una struttura dati, non un oggetto.