Prawie wszystko to pokazuje fundamentalne nieporozumienie dotyczące enkapsulacji i jej zastosowania.
Początkowa odpowiedź, że łamałeś enkapsulację, jest po prostu zła. Twoja aplikacja może wymagać jedynie ustawienia wartości sera w lodówce zamiast zwiększania / zmniejszania lub dodawania / usuwania. Ponadto nie jest to semantyka, bez względu na to, jak ją nazwiesz, jeśli musisz uzyskać dostęp i / lub zmienić atrybuty, nie przerywasz enkapsulacji, zapewniając je. Wreszcie, enkapsulacja tak naprawdę nie polega na „ukrywaniu się”, ale na kontrolowaniu dostępu do stanu i wartości, które nie powinny być publiczne ani manipulowane poza klasą, przy jednoczesnym przyznaniu go tym, którzy powinni, i wykonaniu zadania udostępnionego wewnętrznie.
Narzędzie pobierające lub ustawiające nie przerywa enkapsulacji, gdy istnieje uzasadniona potrzeba uzyskania lub ustawienia wartości. Właśnie dlatego metody można upublicznić.
Hermetyzacja polega na przechowywaniu danych i metodach, które modyfikują te dane bezpośrednio razem w jednym logicznym miejscu, klasie.
W tym szczególnym przypadku istnieje wyraźna potrzeba zmiany wartości sera we wniosku. Niezależnie od tego, jak to się robi, poprzez get / set lub add / remove, o ile metody są zawarte w klasie, postępujesz zgodnie ze stylem obiektowym.
Dla wyjaśnienia podam przykład złamania enkapsulacji poprzez zapewnienie dostępu bez względu na nazwę metody lub logiczne wykonanie.
Powiedzmy, że lodówka ma „żywotność”, wystarczy kilka tyknięć, zanim lodówka przestanie działać (ze względu na argument, lodówki nie można naprawić). Logicznie rzecz biorąc, nie ma możliwości, aby użytkownik (lub reszta aplikacji) mógł zmienić tę wartość. To powinno być prywatne. Byłoby to widoczne tylko poprzez powiedzenie innego publicznego atrybutu znanego jako „isWorking”. Po upływie okresu żywotności, wewnętrzne zestawy lodówek działają na fałsz.
Odliczanie czasu życia i przestawianie przełącznika isWorking jest wewnętrzne dla lodówki, nic na zewnątrz nie może / powinno mieć wpływu na proces. isWorking powinien być widoczny tylko dlatego getter nie przerywa enkapsulacji. Jednak dodanie akcesoriów dla elementów całego cyklu życia spowodowałoby uszkodzenie enkapsulacji.
Jak większość rzeczy, definicja enkapsulacji nie jest dosłowna, jest względna. Czy powinieneś widzieć X poza klasą? Czy powinieneś być w stanie zmienić Y? Czy wszystko, co dotyczy twojego obiektu tutaj w tej klasie, czy też funkcjonalność jest rozłożona na wiele klas?
putCheese
dodaje ser do lodówki itakeCheese
usuwa go - są to abstrakcje zorientowane na domenę (wyższy poziom), a nie obiekty pobierające i ustawiające pola obiektowe (które są (niskopoziomowymi) abstrakcjami programowania komputerowego).