Pozwólcie, że poprzedzę to stwierdzeniem, że mówię tutaj przede wszystkim o dostępie do metod oraz w nieco mniejszym stopniu o oznaczaniu klas jako końcowych, a nie dostępie do elementów członkowskich.
Stara mądrość
„oznacz to jako prywatne, chyba że masz dobry powód, aby tego nie robić”
miało sens w czasach, gdy zostało napisane, zanim open source zdominowało przestrzeń bibliotek programistów i zarządzanie VCS / zależnościami. stał się hiperwspółpracujący dzięki Githubowi, Mavenowi itp. W tamtych czasach można było również zarobić pieniądze, ograniczając sposób (-y) wykorzystania biblioteki. Prawdopodobnie pierwsze 8 lub 9 lat mojej kariery spędziłem na ścisłym przestrzeganiu tej „najlepszej praktyki”.
Dziś uważam, że to zła rada. Czasami istnieje rozsądny argument, aby oznaczyć metodę jako prywatną lub jako finał klasy, ale jest to niezwykle rzadkie, a nawet wtedy prawdopodobnie niczego nie poprawia.
Czy kiedykolwiek:
- Czy byłeś rozczarowany, zaskoczony lub zraniony przez bibliotekę itp., Która miała błąd, który można było naprawić za pomocą dziedziczenia i kilku wierszy kodu, ale z powodu prywatnych / ostatecznych metod i klas byli zmuszeni czekać na oficjalną łatkę, która może nigdy nie nadejść? Mam.
- Chciałeś użyć biblioteki do nieco innego przypadku użycia niż wyobrażali sobie autorzy, ale nie byli w stanie tego zrobić z powodu prywatnych / ostatecznych metod i klas? Mam.
- Byłeś rozczarowany, zaskoczony lub zraniony przez bibliotekę itp., Która była zbyt liberalna w swojej rozszerzalności? Nie mam.
Oto trzy największe usprawiedliwienia, jakie słyszałem, dotyczące domyślnego oznaczania metod jako prywatnych:
Racjonalizacja nr 1: To niebezpieczne i nie ma powodu, aby zastępować określoną metodę
Nie mogę zliczyć, ile razy myliłem się co do tego, czy kiedykolwiek będzie potrzeba zastąpienia określonej metody, którą napisałem. Pracując nad kilkoma popularnymi bibliotekami open source, na własnej skórze poznałem prawdziwy koszt oznaczania rzeczy jako prywatnych. Często eliminuje jedyne praktyczne rozwiązanie nieprzewidzianych problemów lub przypadków użycia. I odwrotnie, nigdy od ponad 16 lat rozwoju zawodowego nie żałowałem oznaczenia metody chronionej zamiast prywatnej z powodów związanych z bezpieczeństwem API. Gdy programista decyduje się na rozszerzenie klasy i zastąpienie metody, świadomie mówi „Wiem, co robię”. a ze względu na produktywność powinno to wystarczyć. Kropka. Jeśli jest to niebezpieczne, zanotuj to w klasie / metodzie Javadocs, nie tylko na ślepo zatrzaskuj drzwi.
Metody znakowania chronione domyślnie są złagodzeniem dla jednego z głównych problemów współczesnego rozwoju oprogramowania: porażki wyobraźni.
Racjonalizacja nr 2: Utrzymuje publiczny interfejs API / Javadocs w czystości
Ten jest bardziej rozsądny iw zależności od grupy docelowej może być nawet właściwym rozwiązaniem, ale warto rozważyć, jaki jest koszt utrzymania „czystego” API: rozszerzalność. Z powodów wymienionych powyżej prawdopodobnie bardziej sensowne jest oznaczanie rzeczy chronionych domyślnie na wszelki wypadek.
Racjonalizacja # 3: Moje oprogramowanie jest komercyjne i muszę ograniczyć jego użycie.
Jest to również rozsądne, ale jako konsument wybrałbym za każdym razem mniej restrykcyjnego konkurenta (zakładając, że nie ma znaczących różnic w jakości).
Nigdy nie mów nigdy
Nie mówię, że nigdy nie oznaczaj metod jako prywatnych. Mówię, że lepszą praktyczną zasadą jest „ochrona metod, chyba że jest dobry powód, aby tego nie robić”.
Ta rada jest najbardziej odpowiednia dla osób pracujących nad bibliotekami lub projektami na większą skalę, które zostały podzielone na moduły. W przypadku mniejszych lub bardziej monolitycznych projektów nie ma to większego znaczenia, ponieważ i tak kontrolujesz cały kod i łatwo jest zmienić poziom dostępu do kodu, jeśli / kiedy go potrzebujesz. Mimo wszystko dałbym tę samą radę :-)