Permítanme comenzar esto diciendo que estoy hablando principalmente sobre el acceso a métodos aquí, y en menor medida, marcando las clases como final, no como acceso de miembros.
La vieja sabiduria
"márquelo como privado a menos que tenga una buena razón para no hacerlo"
tenía sentido en los días en que se escribió, antes de que el código abierto dominara el espacio de la biblioteca del desarrollador y la gestión de VCS / dependencia. se convirtió en hiper colaborativo gracias a Github, Maven, etc. En aquel entonces también se podía ganar dinero restringiendo las formas en que se podía utilizar una biblioteca. Probablemente pasé los primeros 8 o 9 años de mi carrera siguiendo estrictamente esta "mejor práctica".
Hoy, creo que es un mal consejo. A veces hay un argumento razonable para marcar un método privado o una clase final, pero es extremadamente raro, e incluso entonces probablemente no esté mejorando nada.
Alguna vez has:
- ¿Se sintió decepcionado, sorprendido o herido por una biblioteca, etc. que tenía un error que podría haberse solucionado con herencia y pocas líneas de código, pero debido a métodos privados / finales y las clases se vieron obligados a esperar un parche oficial que podría no llegar? Yo tengo.
- ¿Deseaba usar una biblioteca para un caso de uso ligeramente diferente al imaginado por los autores, pero no pudo hacerlo debido a métodos y clases privados / finales? Yo tengo.
- ¿Te decepcionó, sorprendió o lastimó una biblioteca, etc. que era demasiado permisiva en cuanto a su extensibilidad? Yo no he.
Estas son las tres racionalizaciones más importantes que he escuchado para marcar métodos privados por defecto:
Racionalización # 1: no es seguro y no hay razón para anular un método específico
No puedo contar la cantidad de veces que me he equivocado acerca de si alguna vez será necesario anular un método específico que he escrito. Después de haber trabajado en varias librerías de código abierto populares, aprendí por las malas el costo real de marcar las cosas como privadas. A menudo elimina la única solución práctica para problemas imprevistos o casos de uso. Por el contrario, nunca en más de 16 años de desarrollo profesional me arrepiento de haber marcado un método protegido en lugar de privado por razones relacionadas con la seguridad API. Cuando un desarrollador elige extender una clase y anular un método, conscientemente dice "Sé lo que estoy haciendo". y por el bien de la productividad, eso debería ser suficiente. período. Si es peligroso, anótelo en la clase / método Javadocs, no solo cierre la puerta a ciegas.
Los métodos de marcado protegidos por defecto son una mitigación para uno de los principales problemas en el desarrollo moderno de SW: falta de imaginación.
Racionalización # 2: mantiene limpias las API públicas / Javadocs
Este es más razonable y, dependiendo del público objetivo, incluso podría ser lo correcto, pero vale la pena considerar cuál es el costo de mantener la API "limpia": la extensibilidad. Por las razones mencionadas anteriormente, probablemente tenga más sentido marcar cosas protegidas por defecto por si acaso.
Racionalización # 3: mi software es comercial y necesito restringir su uso.
Esto también es razonable, pero como consumidor iría con el competidor menos restrictivo (suponiendo que no existan diferencias de calidad significativas) cada vez.
Nunca digas nunca
No digo que nunca marques los métodos como privados. Estoy diciendo que la mejor regla general es "proteger los métodos a menos que haya una buena razón para no hacerlo".
Este consejo es el más adecuado para quienes trabajan en bibliotecas o proyectos de mayor escala que se han dividido en módulos. Para proyectos más pequeños o más monolíticos, no tiende a importar tanto ya que usted controla todo el código de todos modos y es fácil cambiar el nivel de acceso de su código si lo necesita. Aun así, todavía daría el mismo consejo :-)