Этот вопрос о том, когда использовать приватный, а когда использовать защищенный в классах, заставил меня задуматься. (Я распространю этот вопрос также на окончательные классы и методы, так как он связан. Я программирую на Java, но я думаю, что это актуально для каждого языка ООП)
Хорошее практическое правило: сделайте все как можно более приватным.
- Сделайте все классы окончательными, если вам не нужно сразу создать их подкласс.
- Сделайте все методы окончательными, если вам не нужно сразу создавать подклассы и переопределять их.
- Сделайте все параметры метода окончательными, если вам не нужно изменять их в теле метода, что в любом случае довольно неудобно.
Это довольно просто и понятно, но что если я в основном пишу библиотеки (с открытым исходным кодом на GitHub) вместо приложений?
Я мог бы назвать много библиотек и ситуаций, где
- Библиотека была расширена таким образом, что разработчики никогда бы не подумали
- Это должно было быть сделано с помощью "магии загрузчика классов" и других хаков из-за ограничений видимости
- Библиотеки привыкли к тому, что они не созданы, а необходимый функционал «взломан» в
- Библиотеки не могут быть использованы из-за небольшой проблемы (ошибка, отсутствие функциональности, «неправильное» поведение), которую нельзя изменить из-за ограниченной видимости
- Проблема, которая не могла быть устранена, привела к огромным, уродливым и ошибочным обходным путям, где могло бы помочь переопределение простой функции (частной или конечной)
И я фактически начал называть их, пока вопрос не стал слишком длинным, и я решил удалить их.
Мне нравится идея не иметь больше кода, чем нужно, больше видимости, чем нужно, больше абстракции, чем нужно. И это может сработать при написании приложения для конечного пользователя, где код используется только теми, кто его пишет. Но как это действует, если код предназначен для использования другими разработчиками, когда маловероятно, что первоначальный разработчик заранее продумал все возможные варианты использования, а изменения / рефакторы трудно / невозможно сделать?
Поскольку большие библиотеки с открытым исходным кодом не являются чем-то новым, каков наиболее распространенный способ обработки видимости в таких проектах с объектно-ориентированными языками?