Casi todo esto muestra un malentendido fundamental de la encapsulación y cómo se aplica.
La respuesta inicial de que estaba rompiendo la encapsulación es incorrecta. Es posible que su aplicación necesite simplemente establecer el valor del queso en el refrigerador en lugar de aumentar / disminuir o agregar / eliminar. Además, no es semántica, no importa cómo lo llame, si necesita acceder y / o cambiar atributos, no interrumpe la encapsulación al proporcionarlos. Finalmente, la encapsulación no se trata realmente de "esconderse", se trata de controlar el acceso al estado y los valores que no deberían ser públicos o manipulados fuera de la clase, al tiempo que se los otorga a aquellos que deberían hacerlo y realizar la tarea disponible internamente.
Un getter o setter no rompe la encapsulación cuando existe una necesidad legítima de obtener o establecer un valor. Es por eso que los métodos pueden hacerse públicos.
La encapsulación se trata de mantener los datos y los métodos que modifican esos datos directamente juntos en un lugar lógico, la clase.
En este caso particular, existe claramente la necesidad de cambiar el valor del queso en la aplicación. Independientemente de cómo se haga esto, a través de get / set o add / remove, siempre que los métodos estén encapsulados en la clase, está siguiendo el estilo orientado a objetos.
Para aclarar, daré un ejemplo de cómo se rompe la encapsulación al proporcionar acceso independientemente del nombre del método o la ejecución lógica.
Digamos que su refrigerador tiene una "vida útil", solo una serie de tics antes de que el refrigerador deje de estar operativo (por el argumento, el refrigerador no puede repararse). Lógicamente, no hay forma de que un usuario (o el resto de su aplicación) pueda cambiar este valor. Debería ser privado. Solo sería visible a través de decir un atributo público diferente conocido como "isWorking". Cuando expira la vida útil, internamente el refrigerador se pone a trabajar en falso.
La ejecución de la cuenta regresiva de por vida y su activación del interruptor isWorking es todo interno en el refrigerador, nada afuera podría / debería ser capaz de afectar el proceso. isWorking solo debe ser visible, por lo tanto, un captador no rompe la encapsulación. Sin embargo, agregar accesores para elementos del proceso de por vida rompería su encapsulación.
Como la mayoría de las cosas, la definición de encapsulación no es literal, es relativa. ¿Deberías poder ver X fuera de la clase? ¿Deberías poder cambiar Y? ¿Es todo lo que se aplica a su objeto aquí en esta clase o la funcionalidad se extiende a través de múltiples clases?
putCheese
agregaría queso al refrigerador ytakeCheese
lo eliminaría: estas son abstracciones orientadas al dominio (de nivel superior), en lugar de captadores y establecedores de campos de objetos (que son abstracciones de programación de computadora (de bajo nivel)).