Zastanawiałem się nad tym, kiedy używać prywatnie, a kiedy chronione w klasach. (Rozszerzę to pytanie również na końcowe klasy i metody, ponieważ jest ono powiązane. Programuję w Javie, ale myślę, że dotyczy to każdego języka OOP)
Dobrą zasadą jest: uczyń wszystko tak prywatnym, jak to możliwe.
- Spraw, by wszystkie klasy były ostateczne, chyba że musisz je natychmiast podzielić na klasy.
- Spraw, by wszystkie metody były ostateczne, chyba że musisz od razu je podklasować i zastąpić.
- Spraw, aby wszystkie parametry metody były ostateczne, chyba że musisz je zmienić w ciele metody, co w większości przypadków jest dość niewygodne.
Jest to dość proste i jasne, ale co jeśli głównie piszę biblioteki (Open Source na GitHub) zamiast aplikacji?
Mógłbym wymienić wiele bibliotek i sytuacji, w których
- Biblioteka została rozbudowana w sposób, jakiego twórcy nigdy nie pomyśleli
- Musiało to zostać zrobione z „magią ładującą klasy” i innymi hackami z powodu ograniczeń widoczności
- Biblioteki wykorzystano w sposób, w jaki nie zostały zbudowane, a potrzebną funkcjonalność „włamano się”
- Nie można użyć bibliotek z powodu małego problemu (błąd, brak funkcjonalności, „niewłaściwe” zachowanie), którego nie można zmienić z powodu ograniczonej widoczności
- Problem, którego nie można naprawić, doprowadził do ogromnych, brzydkich i błędnych obejść, w których zastąpienie prostej funkcji (prywatnej lub ostatecznej) mogło pomóc
Zacząłem je nazywać, dopóki pytanie nie stało się zbyt długie, i postanowiłem je usunąć.
Podoba mi się pomysł, aby nie mieć więcej kodu niż potrzeba, więcej widoczności niż potrzeba, więcej abstrakcji niż potrzeba. Może to działać podczas pisania aplikacji dla użytkownika końcowego, gdzie kod jest używany tylko przez tych, którzy go piszą. Ale jak to się utrzymuje, jeśli kod ma być używany przez innych programistów, gdzie jest nieprawdopodobne, aby pierwotny programista z góry pomyślał o każdym możliwym przypadku użycia, a zmiany / refaktory są trudne / niemożliwe do wprowadzenia?
Ponieważ duże biblioteki open source nie są niczym nowym, jaki jest najczęstszy sposób obsługi widoczności w takich projektach z językami obiektowymi?