Esta pregunta sobre cuándo usar el servicio privado y cuándo usarlo Protegido en clases me hizo pensar. (Extenderé esta pregunta también a las clases y métodos finales, ya que está relacionado. Estoy programando en Java, pero creo que esto es relevante para todos los lenguajes OOP)
Una buena regla general es: hacer que todo sea lo más privado posible.
- Haga que todas las clases sean finales, a menos que necesite subclasificarlas de inmediato.
- Haga que todos los métodos sean definitivos a menos que necesite crear una subclase y anularlos de inmediato.
- Haga que todos los parámetros del método sean finales, a menos que necesite cambiarlos dentro del cuerpo del método, lo cual es un poco incómodo para la mayoría de los parámetros. veces de todos modos.
Esto es bastante sencillo y claro, pero ¿qué pasa si escribo bibliotecas (Open Source en GitHub) en lugar de aplicaciones?
Podría nombrar muchas bibliotecas y situaciones, donde
- Una biblioteca se amplió de una forma que los desarrolladores nunca habrían pensado
- Esto se tuvo que hacer con "magia del cargador de clases" y otros hacks debido a restricciones de visibilidad
- Las bibliotecas se utilizaron de una manera en la que no se crearon y la funcionalidad necesaria se "piratea" en
- No se pudieron usar las bibliotecas debido a un pequeño problema (error, funcionalidad faltante, comportamiento "incorrecto") que no se pudo cambiar debido a la menor visibilidad
- Un problema que no pudo solucionarse dio lugar a soluciones enormes, feas y con errores en las que la anulación de una función simple (que fue privada o definitiva) podría haber ayudado
Y en realidad comencé a nombrarlos hasta que la pregunta se hizo demasiado larga y decidí eliminarlos.
Me gusta la idea de no tener más código del necesario, más visibilidad que la necesaria, más abstracción de la necesaria. Y esto podría funcionar al escribir una aplicación para el usuario final, donde el código solo lo usan quienes lo escriben. Pero, ¿cómo se mantiene esto si el código está destinado a ser usado por otros desarrolladores, donde es improbable que el desarrollador original haya pensado de antemano en todos los posibles casos de uso y sea difícil / imposible hacer cambios / refactores?
Dado que las grandes bibliotecas de código abierto no son algo nuevo, ¿cuál es la forma más común de manejar la visibilidad en este tipo de proyectos con lenguajes orientados a objetos?