Una de las primeras cosas que hago cuando hago una subclase de una clase es cambiar una
manojo de métodos privados para proteger
Algunos razonamientos acerca de private
vs. protected
métodos :
Los métodos
private
evitan la reutilización del código. Una subclase no puede usar el código en el método privado y es posible que tenga que implementarlo de nuevo, o volver a implementar el método o los métodos que originalmente dependen del método privado & c.
Por otra parte, cualquier método que sea no private
puede verse como una API proporcionada por la clase al "mundo exterior", en el sentido de que se consideran subclases de terceros "mundo exterior" también, como alguien más sugirió en su respuesta ya.
¿Eso es algo malo? - No lo creo.
Por supuesto, una API (pseudo) pública bloquea al programador original y dificulta la refactorización de esas interfaces. Pero visto al revés, ¿por qué un programador no debe diseñar sus propios "detalles de implementación" de una manera tan limpia y estable como su API pública? ¿Debería usar private
para que pueda ser descuidado en la estructuración de su código "privado"? ¿Pensando que tal vez podría limpiarlo más tarde, porque nadie lo notará? - No.
El programador también debe pensar un poco en su código "privado", para estructurarlo de una manera que permita o incluso promueva la reutilización de la mayor cantidad posible en primer lugar. Entonces, las partes no privadas pueden no convertirse en una carga tan grande en el futuro como algunos temen.
Una gran cantidad de código (marco) que veo adopta un uso incoherente de private
: protected
, los métodos no finales que apenas hacen algo más que delegar a un método privado se encuentran comúnmente. protected
, métodos no finales cuyo contrato solo se puede cumplir a través del acceso directo a campos privados también.
Estos métodos no pueden ser anulados / mejorados lógicamente, aunque técnicamente no hay nada para hacer que (compilador-) sea obvio.
¿Quieres extensibilidad y herencia? No hagas tus métodos private
.
¿No quieres que se altere cierto comportamiento de tu clase? Haz tus métodos final
.
¿Realmente no se puede llamar a su método fuera de un contexto determinado y bien definido? Haga que su método private
y / o piense en cómo puede hacer que el contexto requerido bien definido esté disponible para su reutilización a través de otro método de envoltorio protected
.
Es por eso que recomiendo usar private
con moderación. Y no confundir private
con final
. - Si la implementación de un método es vital para el contrato general de la clase y, por lo tanto, no debe ser reemplazada / anulada, ¡hágalo final
!
Para los campos, private
no es realmente malo. Siempre que el (los) campo (s) puedan ser "usados" razonablemente a través de los métodos apropiados (eso es no getXX()
o setXX()
!).