Programación Orientada a Objetos – Ámbito, Public, Private, Protected, Local

Este post es parte de una serie de artículos sobre POO y viene a continuación de Sub Clases (II)

Bien, los temas que vamos a tratar en esta ocasión son tan básicos que posiblemente alguno piense ¿y por qué no hablamos de esto al principio? Y la respuesta lógica es: porque no lo habríamos entendido correctamente.
El tema que vamos a tratar ahora es uno de los mayores dolores de cabeza cuando se comienza con la programación -y más aún con la programación orientada a objetos-, muchos problemas en el código suelen estar asociados con algún error a nivel de ámbito, así que comencemos por allí:

¿Qué es el Ámbito y Cómo Afecta mi Vida Sexual?

Cuando hablamos de ámbito o alcance nos estamos refiriendo principalmente al área de influencia de una variable o función, a la zona donde ésta tiene sentido.

Toda variable/función tiene un rango de acción, se encuentra en un sitio, tiene un contexto, fuera del cual pierde significado y valor. Un ejemplo que puede ilustrar esto puede ser un lámpara. La lámpara, al encenderla, ilumina un área específica, pero no tiene influencia fuera de esa área. Por ejemplo: si necesito buscar algo en mi cuarto, que la luz de la sala o de la cocina estén encendidas sería irrelevante para mí porque mi cuarto está fuera del área que ellas iluminan, pero si enciendo la luz de mi cuarto puedo buscar lo que necesito más claramente, aunque no tendría ninguna influencia fuera de él, él ámbito (alcance) de esa luz se limita a mi cuarto.

De acuerdo con su ámbito una variable/función puede ser:

  • Pública
  • Privada
  • Protegida
  • Local

Vamos a hablar de estos ámbitos desde el punto de vista de la clase.

Public:

Una variable/función pública puede ser accedida desde fuera de la clase. Es decir, puedo acceder desde la instancia de la clase y no sólo desde el código interno de la clase. Ejemplo de funciones públicas son los métodos de una clase. También es posible crear variables públicas, para que puedan ser manejadas desde la instancia, pero no es algo común o recomendable, entre otras cosas porque deja un hueco de seguridad en la clase, acabando con la idea de la «encapsulación». Para declarar una variable/función como pública, se le antepone la palabra clave «public».

Private:

Al contrario que las públicas, las variables/funciones privadas sólo pueden ser accedidas desde dentro de la misma clase. Todo intento de llamarlas desde la una instancia de la misma es en vano. Mantener variables/funciones privadas permiten tener un mayor control sobre la clase, sobre el modo como procesa sus métodos, como maneja sus variables, etc. Para declarar una variable/función como privada, se le antepone la palabra clave «private».

Protected:

Existe un tipo intermedio de ámbito, llamado «protegido». Es un punto medio entre público y privado, porque -como ocurre con las privadas- no se puede acceder a ella desde una instancia de la clase, pero -como ocurre con las públicas- puede ser accedido desde las subclases de ésta, no importa si se encuentran o no en el mismo paquete. Básicamente significa que, si una clase hereda de otra, tendrá acceso a las variables/funciones protegidas de la super-clase, de lo contrario, no podrá acceder a ellas. Para declarar una variable como protegida, se le antepone la palabra clave «protected».

Local:

Una variable «local» sólo es accesible desde dentro de la función donde se declara; esto es válido tanto para los parámetros de la función como para las variables declaradas dentro de ella. Una vez terminada la función, la variable es destruida hasta que la función vuelve a ser invocada. No hay palabras clave para las variables locales.

¿Cómo Afecta esto mi Vida Sexual?

Como dije, una buena parte de los problemas que la gente suele tener al trabajar con clases es comprender cómo funcionan los ámbitos, cómo acceder a funciones/propiedades/variables y como permitir a otros que accedan a las nuestras; por lo tanto, entender esto significa perder menos horas depurando código, lo que significa menos tiempo programando, lo que es igual a menos frustración por falta de tiempo para el sexo. Además a las chicas les encantan los buenos programadadores 😉

Tags Technorati: , , , ,


21 respuestas a “Programación Orientada a Objetos – Ámbito, Public, Private, Protected, Local

  1. Error, al final de PRIVATE, donde dice…

    «Para declarar una variable/función como pública, se le antepone la palabra clave “private”»

    …debería decir:
    «para declarar una variable/función como privada» 😛

    (me hago el groso porque soy un perro en programación, pero me obligan a sacarme 4 o más para pasar de cuatrimestre, en Diseño de Videojuegos).

    Muy buenas las explicaciones, aunque Public y Private ya las sabía.

  2. @kyron: Muchas gracias, tanto por los comentarios como por la corrección. De no habérmelo dicho no me habría enterado nunca, así que gracias.
    Si ya has estudiado programación, es posible que muchas de las cosas dichas aquí ya las sepas o al menos las hayas escuchado, en cualquier caso, eres libre de revisarlas, comentarlas e incluso corregirme si ves que me equivoco en algo (como aquí). Muchas gracias.

  3. En realidad no estudio programación, me enseñan… eso no quiere decir que lo estudie (y si estudio solo entiendo el 30%) 😛

    Además, en la carrera de diseño de videojuegos existen 4 tipos de personas:
    – Los que se dedican al diseño y no entienden programación (como mucho entendemos la teoría pero a la hora de hacer algo podemos estar viendo el monitor como si fuera un televisor).
    – Los que se dedican a programar y no saben nada de diseño.
    – Los que no saben hacer nada (son solo viciosos de los videojuegos que quieren seguir viciando en los estudios).
    – Y los que saben hacer bien ambas cosas. Estos últimos no suelen ser humanos, además porque no les entendés ni jota lo que hablan.

  4. sabes me enrede, ahora desde el inicio, si tu dices que las variables o atributos no deberian ser publicos, entonces que sentido tiene crear clases con atributos, sino puedo utizarlos segun esta afirmacion????

    y lo otro para que veas lo enredada que estoy, es para que utilizar clases, si puedo ingresar los datos perfectamente del formulario a la base de datos antes validarlos, y no tener que usar en ningun momento clases me refiero a las clases creadas por uno, no las que ya tiene .net.

    por ejemplo tener la clase estudiantes, con sus atributos y metodos, pero si yo ingreso datos del estudiante, los valido y despues los ingreso a la base de datos, nunca tuve que ocupar la clase, aunque ahora escribiendolo se esta esfumando la neblina en mi cabeza, y segun lo que entiendo yo paso los datos ingresados a los atributos de la clase y despues utilizo los metodos para que el metodo ingresar_alumno(), tome los atributos de la clase y sean esos datos, los que envie a la base.

    esta bien lo que yo entiendo ????, gracias de antemano por leerme.

  5. @lilia: Hola lilia, gracias por pasearte por aquí y tomarte el tiempo de leer estas tonterías que escribo.
    Creo que hay un malentendido. Si bien es cierto que las variables públicas no son recomendadas (porque violan el principio de encapsulación de la POO y no pueden ser controladas/validadas por la clase, creando un riesgo de seguridad) no es lo mismo con los atributos (asumiendo que con atributo te refieres a lo que otros conocen como propiedades).
    No sólo es posible tener propiedades públicas sino que es necesario en la mayoría de los casos. El malentendido puede provenir de algo que suelo decir mucho: Las propiedades, en último término, son variables (como los métodos son funciones), sólo que un atributo es susceptible de ser validado y/o controlado por la clase, dando seguridad a la misma. Quizá te aclare más leer este artículo, del mismo curso: Programación Orientada a Objetos – Cómo Escribir una Clase

    Respecto al tema de si vale la pena o no crear clases, vas por buen camino. Crear una clase alumnos te permitirá varias cosas: reutilizar la misma clase en cuantos proyectos requieras sin tener que escribir más código, o copiar/pegar, crear sub-clases que hagan trabajo más espcializado sin tener que reescribir todo el código, hacer cambios a la clase sin tener que volver a actualizar todo el proyecto, etc.)
    Hay muchas razones para trabajar con POO, aunque debo decir que entiendo tus dudas iniciales porque son exactamente las mismas que yo tuve antes de pasarme de la programación funcional a la programación orientada a objetos, pero créeme, vale la pena 😉

  6. Gracias por tu respuesta, sabes lo que me esta ayudando mucho y que antes miraba en menos, es los video tutoriales, vas como de la manito y despues uno puede experimentar.

    Espero que pronto el UML y los casos de uso con los diagramas de clases los cuales pasan a ser una aplicacion «Afecte tu vida sexual», para que puedas escribir de ello aqui, en tu forma tan familiar y sencilla, se me enredan los diagramas y la perspectiva que tienes que usar para
    hacer estos dos tipos de diagramas.Sabes leer mucho a veces confunde demasiadas explicaciones diferentes.
    espero tus comentarios.

  7. Jajajajaja. No sé si a mi esposa va a hacerle mucha gracia tu comentario, pero veré qué puedo hacer para eso. No te prometo hacer videotutoriales porque realmente me gusta escribir, pero si sé de algo o puedo incluir eso en el programa de artículos que llevo (sí, es que tengo una larga lista de cosas de las que quiero hablar), con gusto lo haré.

  8. Yo apoyo la idea de que hagas más artículos. Y si fuera de C++ mejor. Sino consigo acostumbrarme al C++ para el cuatrimestre que viene (el 80% será programación) me haré cartonero o «venderé» panfletos en la calle (si re groso, los voy a vender) 😛

  9. Pura gratitud para ti, no sabes lo mucho que me han ayudado tus explicaciones. Que bueno que puedes explicar con analogías sencillas temas tan complejos. Imagina que llevo tres cuatrimestres de programación y ningún maestro me ha aclarado con sencillez estos temas como tú.

    Gracias por compatir tus conocimientos

  10. Hola creo que es un poco tarde para dejar un comentario, pero pues es que apenas por ahora me intereza la Poo, mira como son las cosas en la Universidad no le preste ni poca atencion a estos temas tan utiles y ahora muero por aprenderlos todos, es que ademas estoy aprendiendo a programar en flex 3.0 y segun mi percepcion hay que empezar por el principìo y creo que si aprendo primero la Poo y luego ActionScript 3.0 entonces lo de manejar etiquetas MXML de flex ira mas facil.

    bueno por lo demas eres un buen maestro y quisiera tenerte cerca para preguntarte todo lo que se me dificulta, pero aun asi gracias creo que con este tutorial estare a punto para poder entender mas y mas cosas.

    de corazon Gracias por tu aporte

    1. Hola
      No te preocupes, nunca es tarde para aprender, comentar o engordar un poco mi ego! 😀

      No, en serio, me alegra mucho que te sirva de ayuda este pequeño curso introductorio. Si tienes alguna duda no tengas problema en plantearla, quizá podamos encontrarle solución.
      Buena suerte!

  11. Ingeniosa manera de plantear el tema, lo leí todo no por el desconocimiento de lo que mencionas sino por la curiosidad que me carcomía al pensar que el titulo estaba mal escrito… >_<

Deja un comentario