Esta pregunta sobre cuándo usar privado y cuándo usar protegido en clases me hizo pensar. (Extenderé esta pregunta también a las clases y métodos finales, ya que está relacionada. Estoy programando en Java, pero creo que esto es relevante para cada lenguaje 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 finales a menos que necesite subclasificarlos 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 la mayoría de las veces.
Esto es bastante sencillo y claro, pero ¿qué sucede si escribo principalmente bibliotecas (Open Source en GitHub) en lugar de aplicaciones?
Podría nombrar muchas bibliotecas y situaciones, donde
- Una biblioteca se extendió de una manera que los desarrolladores nunca habrían pensado
- Esto tuvo que hacerse con la "magia del cargador de clases" y otros hacks debido a restricciones de visibilidad
- Las bibliotecas se utilizaron de una manera para la que no fueron creadas y la forma necesaria de funcionalidad "pirateada" en
- Las bibliotecas no se pudieron utilizar debido a un pequeño problema (error, falta de funcionalidad, comportamiento "incorrecto") que no se pudo cambiar debido a la visibilidad reducida
- Un problema que no se pudo solucionar condujo a soluciones alternativas enormes, feas y con errores en las que anular una función simple (que era privada o final) 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 de 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 sostiene esto si el código está destinado a ser utilizado por otros desarrolladores, donde es improbable que el desarrollador original haya pensado de antemano en todos los posibles casos de uso y que los cambios / refactores sean difíciles / imposibles de hacer?
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 tales proyectos con lenguajes orientados a objetos?