Jedną z pierwszych rzeczy, które robię, gdy podklasuję klasę, jest zmiana szeregu prywatnych metod na chronione
Niektóre rozumowanie o private
vs. protected
metod :
private
metody zapobiegają ponownemu użyciu kodu. Podklasa nie może użyć kodu w metodzie prywatnej i może wymagać ponownego zaimplementowania go - lub ponownej implementacji metod, które pierwotnie zależą od metody prywatnej & c.
Z drugiej strony każdą metodę, która nie private
jest postrzegana jako interfejs API dostarczony przez klasę do „świata zewnętrznego”, w tym sensie, że podklasy innych firm również są uważane za „świat zewnętrzny”, jak ktoś inny sugerował w swojej odpowiedzi już.
Czy to źle? - Nie wydaje mi się.
Oczywiście (pseudo-) publiczny interfejs API blokuje pierwotnego programistę i utrudnia refaktoryzację tych interfejsów. Ale patrząc na drugą stronę, dlaczego programista nie powinien projektować własnych „szczegółów implementacji” w sposób tak czysty i stabilny jak jego publiczny interfejs API? Czy powinien to private
zrobić, aby nie był niechętny do konstruowania swojego „prywatnego” kodu? Myślisz, że może to później posprząta, bo nikt tego nie zauważy? - Nie.
Programiści powinni również przemyśleć trochę swój „prywatny” kod, aby ustrukturyzować go w sposób, który pozwala, a nawet promuje ponowne wykorzystanie jego jak największej liczby. Wówczas części nieprywatne mogą nie stać się tak dużym obciążeniem w przyszłości, jak niektórzy się obawiają.
Wiele (ramowej) kodu widzę przyjmuje niespójne stosowanie private
: protected
metody non-końcowe, które ledwo robić nic więcej niż delegowanie do prywatnej metody jest powszechnie spotykane. protected
, nie ostateczne metody, których umowa może zostać zrealizowana jedynie poprzez bezpośredni dostęp do pól prywatnych.
Te metody nie mogą być logicznie zastąpione / ulepszone, chociaż technicznie nie ma nic, co by uczyniło to (kompilatorem) oczywistym.
Chcesz możliwości rozszerzenia i dziedziczenia? Nie twórzcie swoich metod private
.
Nie chcesz zmienić niektórych zachowań twojej klasy? Twórz swoje metody final
.
Czy naprawdę nie można wywołać metody poza określonym, dobrze określonym kontekstem? Udostępnij swoją metodę private
i / lub zastanów się, jak udostępnić wymagany, dobrze zdefiniowany kontekst do ponownego użycia za pomocą innej protected
metody opakowania.
Dlatego private
zalecam oszczędne używanie . I nie mylić private
z final
. - Jeśli implementacja metody jest istotna dla ogólnego kontraktu klasy i dlatego nie może być zastąpiona / zastąpiona, zrób to final
!
Dla pól private
nie jest naprawdę źle. Tak długo, jak pole (pola) można rozsądnie „wykorzystać” za pomocą odpowiednich metod (to nie jest getXX()
lub setXX()
!).