Quasi tutto ciò mostra un fraintendimento fondamentale dell'incapsulamento e di come si applica.
La risposta iniziale che stavi interrompendo l'incapsulamento è semplicemente sbagliata. La tua applicazione potrebbe aver bisogno di impostare semplicemente il valore del formaggio nel frigorifero invece di incrementare / decrementare o aggiungere / rimuovere. Inoltre, non si tratta di semantica, indipendentemente da come la chiami, se hai bisogno di accedere e / o modificare attributi non rompi l'incapsulamento fornendoli. Infine, l'incapsulamento non riguarda in realtà il "nascondersi", si tratta di controllare l'accesso allo stato e ai valori che non dovrebbero essere pubblici o manipolati al di fuori della classe, concedendoli a quelli che dovrebbero ed eseguendo l'attività resa disponibile internamente.
Un getter o setter non rompe l'incapsulamento quando vi è una legittima necessità di ottenere o impostare un valore. Ecco perché i metodi possono essere resi pubblici.
L'incapsulamento riguarda il mantenimento dei dati e dei metodi che modificano i dati direttamente insieme in un posto logico, la classe.
In questo caso particolare, è chiaramente necessario modificare il valore del formaggio nell'applicazione. Indipendentemente da come ciò avviene, tramite get / set o aggiungi / remove, purché i metodi siano incapsulati nella classe, segui lo stile orientato agli oggetti.
Per chiarimenti, fornirò un esempio di come l'incapsulamento viene interrotto fornendo l'accesso indipendentemente dal nome del metodo o dall'esecuzione logica.
Supponiamo che il tuo frigorifero abbia una "durata", solo un numero di tick prima che il frigorifero non sia più operativo (per ragioni di discussione, il frigorifero non può essere riparato). Logicamente non è possibile che un utente (o il resto dell'applicazione) sia in grado di modificare questo valore. Dovrebbe essere privato. Sarebbe visibile solo attraverso un diverso attributo pubblico noto come "isWorking". Allo scadere della vita, internamente il set di frigoriferi sta funzionando su falso.
L'esecuzione del conto alla rovescia della durata e il suo lancio dell'interruttore isWorking è tutto interno al frigorifero, nulla al di fuori potrebbe / dovrebbe essere in grado di effettuare il processo. isWorking dovrebbe essere visibile, quindi un getter non rompe l'incapsulamento. Tuttavia l'aggiunta di accessori per gli elementi del processo di durata interromperebbe l'incapsulamento.
Come la maggior parte delle cose, la definizione di incapsulamento non è letterale, è relativa. Dovresti essere in grado di vedere X al di fuori della classe? Dovresti essere in grado di cambiare Y? Tutto ciò che si applica al tuo oggetto qui in questa classe o la funzionalità è distribuita su più classi?
putCheese
aggiungerebbe il formaggio al frigorifero etakeCheese
lo rimuoverebbe - si tratta di astrazioni (di livello superiore) orientate al dominio, piuttosto che getter e setter (che sono astrazioni di programmazione del computer) del campo oggetto).