uso que publico protegido programacion privados privado metodos entre diferencia oop

oop - que - ¿Cuándo escribes un método privado versus protegido?



que es public en programacion (8)

En otras palabras, ¿cómo puedo saber de antemano que un programador cliente nunca necesitaría anular un método?

No puedes. Y no es necesario. No es su trabajo anticiparse SI un desarrollador puede querer anular un método, y mucho menos cómo . Solo asuma que quiere y habilítelo para hacerlo sin tener que tocar su código. Y por esta razón, no declare métodos private si no es necesario.

Si un desarrollador siente que necesita ajustar alguna funcionalidad de sus clases, puede elegir entre una serie de patrones estructurales y de comportamiento para hacerlo, por ejemplo, decoradores, adaptadores o subclases. Usar estos patrones es bueno, porque encapsula los cambios en la propia clase del desarrollador y deja intacto su propio código. Al declarar los métodos como private , se asegura de que el desarrollador siga con su clase. Y eso es malo.

Un ejemplo perfecto es el adaptador DB de Zend Framework. Desalientan el uso de conexiones persistentes y sus adaptadores no proporcionan ningún medio para este fin. Pero, ¿y si quisieras tener esto de todos modos y el método del adaptador se marcó como private ( no lo es, pero qué pasa si )? Como no hay forma de sobrescribir el método, usted ( sí, lo haría ) cambiaría el código del adaptador directamente dentro de su clase o copiaría y pegaría el código en su propia clase de adaptador, duplicando efectivamente el 99% de la clase solo para cambiar una sola llamada de función. Cada vez que haya una actualización de este adaptador, perderá sus cambios o no lo obtendrá (en caso de que haya c & p''d). Si se hubiera marcado como protected ( tal como está ), podría haber escrito una subclase pConnectAdapter.

Además, al crear subclases, está diciendo efectivamente que subClass es un parentClass. Por lo tanto, puede esperar que la clase derivada tenga la misma funcionalidad que parentClass. Si hay una funcionalidad en parentClass que no debería estar disponible en la subclase, deshabilitarla conceptualmente pertenece a la subclase.

Esta es la razón por la cual me resulta mucho mejor dejar por defecto todos los métodos y propiedades a la visibilidad protected y solo marcar esos métodos (no las propiedades) para permitir que la interacción con mi clase de otra clase o script sea public , pero solo unas pocas cosas private . De esta manera, le doy al desarrollador la opción de usar mi clase como quería que se use y la opción de modificarla. Y si rompe algo en el proceso, es muy probable que sea su culpa, no la mía.

Actualización: desde que escribí esto hace cuatro años, he llegado a la conclusión de que el incumplimiento de las cosas para proteger en lugar de privado a menudo conduce a subclases subóptimas. Esto se debe a que las personas comenzarán a usar lo que haya proporcionado como protegido. Esto a su vez significa que debe considerar todos estos métodos como API y no puede cambiarlos a voluntad. Como tal, es mejor considerar cuidadosamente qué puntos de extensiones desea proporcionar y mantener todo lo demás privado. Consulte http://fabien.potencier.org/article/47/pragmatism-over-theory-protected-vs-private para obtener una vista similar.

Si estoy escribiendo una clase, ¿cuándo hago un método privado, frente a protegido? En otras palabras, ¿cómo puedo saber de antemano que un programador cliente nunca necesitaría anular un método? En un caso en que es algo que tiene consideraciones externas, como una conexión de base de datos?


En otras palabras, ¿cómo puedo saber de antemano que un programador cliente nunca necesitaría anular un método?

Si no sabe, suponga que lo necesitarán. Si eso está bien para ti (es decir, si crees que deberían poder hacerlo), utiliza protected ; de lo contrario, use private .


Los miembros privados se usan para encapsular el funcionamiento interno de su clase. Úselos para almacenar datos a los que solo desea acceder. Por ejemplo, supongamos que tiene un campo llamado _name y un getter / setter llamado GetName () / SetName (name). Tal vez quiera hacer alguna sintaxis comprobando el nombre antes de permitir que SetName tenga éxito; de lo contrario, lanzará una excepción. Al hacer que _name sea privado, usted se asegura de que esta verificación de sintaxis ocurra antes de que ocurra cualquier cambio en el nombre (a menos que usted mismo cambie _name en su propia clase, en su propio código). Al hacerlo protegido, le estás diciendo a cualquier futuro heredero potencial de tu clase, "sigue y juega con mi campo".

En general, protegido se usa con moderación y solo en casos especializados. Por ejemplo, puede tener un constructor protegido que expone algunas funcionalidades de construcción adicionales a las clases secundarias.


No piense en lo privado / protegido / público como si un programador alguna vez "necesitara" un método. Piense en ello como si quisiera permitirles el acceso a él.

Si crees que se les debe permitir cambiar la cadena de conexión DB, hazla pública.


Normalmente comenzaré en el nivel más bajo. Si no está seguro, hágalo en privado. Luego, según sea necesario, puedes hacer que las cosas sean protegidas o públicas.

La idea es que no se trata de un cambio radical para pasar de lo privado a lo protegido, pero podría ser un cambio radical ir en otra dirección.


Por lo general, solo hago todo private y refactorio cuando necesito llamarlo desde una clase base.

Excepto cuando me siento vago y hago todo lo que no es definitivamente peligroso.


Siempre hago que todos los métodos sean private por defecto. Esto es para mantener la interfaz limpia y fácil de mantener.

Es mucho más difícil cambiar u ocultar un método ya visible que hacer que un método privado sea más visible. Al menos si necesita ser compatible con el código de cliente existente.


public métodos public y protected forman la "interfaz" de su objeto, son public para los desarrolladores que usan (delegan) su clase, y están protected para los desarrolladores que desean extender la funcionalidad de su objeto mediante una subclasificación.

Tenga en cuenta que no es necesario proporcionar métodos protected , incluso si su clase será subclasificada.

Tanto public interfaces public como las protected necesitan una reflexión cuidadosa, especialmente si se trata de una API para ser utilizada por desarrolladores que están fuera de su control, ya que los cambios en la interfaz pueden romper programas que hacen suposiciones sobre cómo funciona la interfaz existente.

private métodos private son puramente para el autor del objeto, y pueden refactorizarse, modificarse y eliminarse a voluntad.

Me gustaría ir a lo private de forma predeterminada, y si encuentra que necesita exponer más métodos, tenga una idea cuidadosa sobre cómo se usarán, especialmente si son virtuales, qué sucede si se reemplazan completamente con una función alternativa arbitraria por otro desarrollador: ¿su clase aún funcionará? Luego, diseñe algunas protected apropiadas que sean útiles para los desarrolladores que subclasifiquen su objeto (si es necesario), en lugar de exponer las funciones existentes.