Podstawową ideą jest to, że „pole” (zmienna na poziomie instancji) zadeklarowane jako chronione jest prawdopodobnie bardziej widoczne niż powinno być i mniej „chronione”, niż byś chciał. W C / C ++ / Java / C # nie ma modyfikatora dostępu, który jest odpowiednikiem „dostępnego tylko dla klas podrzędnych w tym samym zestawie”, co daje możliwość definiowania własnych dzieci, które mogą uzyskać dostęp do pola w zestawie, ale nie zezwalanie dzieciom utworzonym w innych zespołach na taki sam dostęp; C # ma modyfikatory wewnętrzne i chronione, ale ich połączenie sprawia, że dostęp jest „wewnętrzny lub chroniony”, a nie „wewnętrzny i chroniony”. Tak więc chronione pole jest dostępne dla każdego dziecka, niezależnie od tego, czy napisałeś to dziecko, czy ktoś inny. Chronione są zatem otwarte drzwi do hakera.
Ponadto pola z ich definicji praktycznie nie mają walidacji związanej z ich zmianą. w C # możesz zrobić tylko do odczytu, co sprawia, że typy wartości są faktycznie stałe, a typy referencyjne nie mogą być ponownie zainicjowane (ale nadal bardzo zmienne), ale o to chodzi. Jako takie, nawet chronione, twoje dzieci (którym nie możesz ufać) mają dostęp do tego pola i mogą ustawić je na coś nieprawidłowego, co powoduje, że stan obiektu jest niespójny (czego należy unikać).
Akceptowanym sposobem pracy z polami jest uczynienie ich prywatnymi i dostęp do nich za pomocą właściwości i / lub metody pobierającej i ustawiającej. Jeśli wszyscy konsumenci klasy potrzebują tej wartości, upublicznij getter (przynajmniej). Jeśli potrzebują tego tylko dzieci, zapewnij getterowi ochronę.
Innym podejściem, które odpowiada na pytanie, jest postawienie sobie pytania; dlaczego kod w metodzie podrzędnej wymaga możliwości bezpośredniej modyfikacji moich danych stanu? Co to mówi o tym kodzie? To argument „pionowej odległości” na jego twarzy. Jeśli w dziecku jest kod, który musi bezpośrednio zmieniać stan rodzica, to może ten kod powinien należeć do rodzica?