2010-04-12 14 views
33

Entiendo que es un concepto muy básico en el ¡Uy! Pero todavía no puedo entender. Entendí por qué las variables de los miembros son privadas, por lo que el usuario de la clase no puede abusar de ellas configurando valores no válidos.¿Por qué los métodos "privados" en el objeto orientado?

Pero, ¿cómo se puede aplicar esto a los métodos?

+2

Para evitar que el programador escriba métodos públicos que se desplazan para siempre en la dirección vertical. Necesita métodos privados para dividir las implementaciones de su método público en fragmentos legibles/mantenibles/cohesivos/reutilizables (DRY): cada fragmento es idealmente un método privado con un nombre revelador de intención. – Gishu

+1

Gracias por todos sus comentarios .. Recibí la respuesta, que estaba en mi cabeza desde hace mucho tiempo. Stackoverflow es realmente útil. – pointlesspolitics

+0

Es importante señalar que la mayoría de las veces probablemente no desee realmente un método 'privado', sino un método' protected'. ([Diferencia] (https://stackoverflow.com/questions/224966/private-and-protected-members-c)) – rinogo

Respuesta

80

montón de buenas respuestas, pero tal vez uno más de un programador autodidacta Java como pasé por todo eso por mí con mucho dolor;)

pensar en una clase como algo visto desde el exterior , no como algo que ves internamente. Si miras a una Clase desde el exterior, ¿qué ves?

Tomando de nuevo el reloj como un ejemplo, un reloj puede le dan información sobre la hora actual y puede ser configurar para mostrar el momento adecuado.

Mirando las cosas desde el exterior, un reloj es una máquina que puede hacer esas dos cosas; métodos públicos los llamamos.

Pero nosotros como constructores de este reloj sabemos que antes de cualquier operación de tiempo tenemos que cambiar de 23 a 11 en nuestra pantalla (es ese tipo de reloj), así que tenemos que reorganizar un poco las cosas internamente. Cambiar de 23 a 11 funciona bien para nosotros en ambos casos - configurar el reloj y mostrar la hora actual - pero lo hacemos "en el lado" ya que el usuario no tiene que saber acerca de todas las matemáticas complicadas. ¡Estos son métodos privados!

Así que nuestra clase Clock podría tener dos métodos públicos (showTime y setTime), que son todo lo que el usuario quiere a ver, y un método privado (recountTime) que proporciona funcionalidad para estos métodos públicos y es algo que el usuario no quiere para ver.

Por un lado, debe tener en cuenta que lo privado no se volverá a implementar y los futuros programadores accederán utilizando su código (como se señaló en las respuestas anteriores). Pero privado también significa cosas hechas en el lateral, por lo que el usuario no lo ve. Es por eso que llamamos a los métodos públicos una interfaz pública - es todo lo que el usuario verá desde el exterior.

Para mí es útil (soy autodidacta, así que quizás no es una metodología muy popular ...) anotar todo lo que los usuarios (usuarios reales y otras clases) harán con mi Clase (interfaz pública) con solo las firmas de métodos públicos), luego escriba las firmas de los métodos privados que I-the-implementador utilizará para lograr los objetivos públicos que prometió proporcionar a mis usuarios y luego simplemente cumplir con el código.

Puede ser útil tener en cuenta que la regla C anterior sigue siendo válida (como se expresó en 97 Things Every Programmer Should Know): una función/método debería tener solo unas pocas líneas, realmente !!

5

Por exactamente el mismo motivo: algunos métodos solo están pensados ​​para su uso dentro de la clase, y el uso por parte de objetos no pertenecientes a la clase sería abuso. Piense en los métodos que incrementan y disminuyen el recuento de objetos para la clase; estos solo deben invocarse desde los constructores o el destructor de una clase, y por lo tanto deben ser privados.

26

Los métodos privados son útiles para dividir tareas en partes más pequeñas, o para evitar la duplicación de código que a menudo se necesita con otros métodos en una clase, pero no se debe llamar fuera de esa clase.

+0

No estoy muy seguro de cómo los métodos privados tienen alguna correlación directa con las tareas de última hora o la prevención de la duplicación de código. De lo que estamos hablando aquí es el alcance del método. –

+0

Supongamos que tiene un grupo de precondiciones que debe validar antes de llamar a varios métodos en su clase, o un bloqueo que debe adquirirse, o realmente cualquier bloque de código que se repite en múltiples métodos, pero que no tiene sentido fuera de la clase. Este código es un candidato perfecto para ser puesto en un método privado, exactamente porque se repite y no tiene sentido fuera de la clase. Esta última razón es sobre el alcance del método. – uckelman

3

Los métodos que son privados solo se pueden llamar por métodos dentro de la misma clase o dentro del mismo "módulo". Los métodos generalmente no se hacen privados; generalmente se protegen para que los niños puedan llamarlos, o de manera pública para que otros códigos puedan llamarlos.

+0

"para que los niños puedan llamarlos" - la mejor respuesta IMO. El modificador de acceso "privado" hace que la clase hija no herede el método/variable. Esta es la principal diferencia entre privado y protegido. – l00k

8

Los métodos también se usan para estructurar el código, y no quiero que la estructura interna de mi implementación se filtre a través de la interfaz. A menudo tengo un método que para el exterior parece hacer una sola tarea, pero en realidad tiene que realizar un par de tareas más pequeñas. En tales casos, hago un pequeño método privado para cada una de las subtareas y las llamo desde el método públicamente visible.

+0

Estoy de acuerdo, y yo diría que esta es también la razón principal para tener variables de miembros privados también. El hecho de que pueda validar cualquier cambio en ellos para evitar valores no válidos que veo como un subproducto de esto. –

+0

La visibilidad no es una característica principal de "privado" de este modificador de acceso. "protegido" también está oculto al acceso público. – l00k

2

Bueno, en algunos casos, usted quiere solo esa clase específica para usar un método, y protegerlo de ser utilizado por cualquier otra clase.

Sólo un ejemplo para mostrar cómo se puede utilizar:

Usted tener un reloj de clase, se ejecuta y se ejecuta el seguimiento de la hora y la fecha. Puede obtener la hora o fecha a través de métodos públicos. Pero el reloj tiene que estar bien. por lo que no puede ajustar la hora o la fecha desde fuera de la clase. Pero el reloj en sí necesita poder ajustar el tiempo (por ejemplo, el horario de ahorro de energía)

En este caso, el reloj tendrá un método privado para ajustar la hora.

Luego, también tiene un profesional adicional, que es que estructura el código. Puede dividir su código en métodos privados más pequeños que estructuran el código pero evitan que se utilicen fuera de su clase.

1

Teniendo todas las otras respuestas en mente. Vale la pena recordar que el método privado es solo un consejo para un programador en varios idiomas. En la mayoría de los casos, aún es posible usar el método privado. Por ejemplo, al crear un objeto que hereda de un objeto con método privado y anula su método con el nuevo método público.

En algunos lenguajes modernos altamente orientados a objetos, los métodos privados existen solo por convención. El método con '_' al comienzo se considera privado.

Cuestiones relacionadas