Fast alles zeigt ein grundlegendes Missverständnis der Kapselung und ihrer Anwendung.
Die anfängliche Antwort, dass Sie die Kapselung unterbrochen haben, ist einfach falsch. Bei Ihrer Anwendung muss möglicherweise einfach der Wert des Käses im Kühlschrank eingestellt werden, anstatt ihn zu erhöhen / verringern oder hinzuzufügen / zu entfernen. Es ist auch keine Semantik, egal wie Sie es nennen. Wenn Sie auf Attribute zugreifen und / oder diese ändern müssen, unterbrechen Sie die Kapselung nicht, indem Sie sie bereitstellen. Schließlich geht es bei der Kapselung nicht wirklich darum, sich zu "verstecken", sondern darum, den Zugriff auf Status und Werte zu steuern, die außerhalb der Klasse nicht öffentlich sein oder manipuliert werden müssen, während sie denjenigen gewährt werden, die die intern zur Verfügung gestellte Aufgabe ausführen sollen.
Ein Getter oder Setter unterbricht die Kapselung nicht, wenn ein legitimer Bedarf besteht, einen Wert abzurufen oder festzulegen. Deshalb können Methoden veröffentlicht werden.
Bei der Kapselung geht es darum, Daten und die Methoden, mit denen diese Daten direkt geändert werden, an einem logischen Ort, der Klasse, zusammenzuhalten.
In diesem speziellen Fall besteht eindeutig die Notwendigkeit, den Wert von Käse in der Anwendung zu ändern. Unabhängig davon, wie dies erfolgt, über get / set oder add / remove, solange die Methoden in der Klasse gekapselt sind, folgen Sie dem objektorientierten Stil.
Zur Verdeutlichung werde ich ein Beispiel geben, wie die Kapselung durch Bereitstellung des Zugriffs unabhängig vom Methodennamen oder der logischen Ausführung unterbrochen wird.
Angenommen, Ihr Kühlschrank hat eine "Lebensdauer", nur einige Zecken, bevor der Kühlschrank nicht mehr betriebsbereit ist (aus Gründen der Argumentation kann der Kühlschrank nicht repariert werden). Logischerweise kann ein Benutzer (oder der Rest Ihrer Anwendung) diesen Wert auf keinen Fall ändern. Es sollte privat sein. Es wäre nur durch ein anderes öffentliches Attribut sichtbar, das als "isWorking" bekannt ist. Wenn die Lebensdauer abläuft, ist der Kühlschrank intern auf false eingestellt.
Die Ausführung des Countdowns für die Lebensdauer und das Umlegen des isWorking-Schalters erfolgt vollständig im Kühlschrank. Nichts außerhalb könnte / sollte den Prozess beeinflussen können. isWorking sollte nur sichtbar sein, damit ein Getter die Kapselung nicht unterbricht. Das Hinzufügen von Accessoren für Elemente des Lebensdauerprozesses würde jedoch Ihre Kapselung beschädigen.
Wie die meisten Dinge ist die Definition der Kapselung nicht wörtlich, sondern relativ. Sollten Sie X außerhalb der Klasse sehen können? Sollten Sie in der Lage sein, Y zu ändern? Ist alles, was für Ihr Objekt hier in dieser Klasse gilt, oder ist die Funktionalität auf mehrere Klassen verteilt?
putCheese
würde dem Kühlschrank Käse hinzufügen undtakeCheese
ihn entfernen - dies sind (übergeordnete) domänenorientierte Abstraktionen und keine Objektfeld-Getter und -Setter (die (untergeordnete) Computerprogrammierungsabstraktionen sind).