Ir al contenido


Foto

Concepto: Visibilidad


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 diciembre 2008 - 01:42

Visibilidad: una cuestión de orden

En todos los ejemplos que hemos visto a lo largo de todo este tiempo hemos estado declarando atributos y métodos "al vuelo" dentro de una clase. Lo correcto sería ordenarlos e indicar una correcta visibilidad o alcance.

La teoría de OO indica que las clases deben seguir el principio de abierto/cerrado. De forma simple lo que establece este principio es que las clases deben permanecer abiertas al público para permitir extender de ella y añadir nuevos atributos y métodos; pero que además permanezcan cerrado a las implementaciones que no sea de verdadero interés al programador final (cliente).

¿Porqué este principio? Para evitarnos dolores de cabezas con implementaciones que no vienen al caso discutir, y alterar. Nos ocultan esa información interna puesto que no hace a los objetivos de los desarrolladores finales: usar los componentes.

¿Cómo es que nos ocultan esos detalles internos?
La respuesta: indicando la visibilidad de los atributos, propiedades y métodos.

Visibilidad privada, pública y protegida

Hay tres tipos de visibilidad:
Privada: Un atributo, propiedad o método privado es invisible fuera de la unidad donde se lo declara. Se establece anteponiendo la sección "private" en la clase:



delphi
  1. TClase = class
  2.  // sección privada
  3.  private
  4.     FNombre: string;
  5.     procedure UnMetodo;
  6.     ...
  7.  end;



Como desarrolladores de la clase tenemos acceso a cualquier elemento de la clase.

Pública: Un atributo, propiedad o método público es visible fuera de clase en cualquier parte. Se nos ocultan otros detalles técnicos.

Como Clientes hacemos uso indirecto de ciertos elementos privados mediante el acceso público. De forma análoga a "private", para dar visibilidad pública debemos anteponer "public":



delphi
  1. TClase = class
  2. // privados
  3.   FNombre: string;
  4.   procedure UnMetodo;
  5. // publicos
  6.   Edad: string;
  7.   procedure OtroMetodo;



Protegida: Un elemento protegido es visible solamente en la unidad donde se declare la clase y en cualquier clase que descienda de ésta.

Es un término intermedio entre el privado y protegido. Como desarrolladores herederos necesitamos conocer algunos detalles técnicos e internos del funcionamiento de la clase base para poder implementar nuestros propios mecanismos y extenderlos en caso de ser necesario. Pero luego, como clientes no tenemos acceso.
La clase base por tanto, debe ofrecer elementos con visibilidad protegida si es que parte del funcionamiento se puede ver afectado o le resulta de interés al programador conocerlos.
Preste atención: dije algunos, no todos.

En este caso hacemos anteponemos "protected":



delphi
  1. TClase = class
  2. // privados
  3.   FNombre: string;
  4.   procedure UnMetodo;
  5.   ...
  6. // publicos
  7.   Edad: string;
  8.   procedure OtroMetodo;
  9.   ...
  10. // protected
  11.   Sexo: TSexo;
  12.   procedure MetodoProtegido;
  13.   ...



No necesariamente debe seguirse el orden privado-publico-protegido. Pueden estar en cualquier orden, incluso mezclarlos:


delphi
  1. private
  2.  Algo: TAlgo;
  3. public
  4.   procedure OtraCosa;
  5. Private
  6.   function SeHacer(Algo: TAlgo);
  7. protected
  8.   FCampo: integer;
  9. protected
  10.   procedure NoSeHacerEsto(Algo: TAlgo); virtual;
  11. end;



La única regla que debemos seguir es primero los campos o atributos y luego los métodos.

Por lo general en protegido no se encuentran campos o atributos, es habitual esperar métodos virtuales, abstractos, y/o sobrecargados para que el desarrollador que hereda la clase pueda, en base a éstos, extenderlos.

Saludos,
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 enero 2009 - 12:45

Published: una visibilidad especial

Me sorprende que alguien no se haya tomado la molestia de no llamar la atención a este tema.
En el post anterior, he dicho que existen tres visibilidades: privado, protegido y público. En realidad en Delphi existe una cuarta: published.

No la he incluído en la lista debido a que en el estándar UML y en forma teórica el paradigma OO no se hace mención a ésta.

Published más que una visibilidad es una sección de la clase. Lo que diferencia a ésta de públic es que permite a las propiedades y eventos estar disponibles en tiempo de diseño. Todas las propiedades y eventos que uno ve en el Inspector de Objetos son publicadas (published).
Este mecanismo es el que ofrece Delphi para poder asignar valores a las propiedades en tiempo de diseño y evitar estar asignando el valor en tiempo de ejecución.
Toda propiedad publicada es también pública.

Pero claro, esta sección es útil solamente cuando la clase es hija o derivada de TPersistent. TPersistent es la clase base de todos los componentes que uno ve en las pestañas; además es la clase que se encarga de manejar el mecanismo de guardado de los valores de las propiedades publicadas en un archivo con extensión dfm.

A todo esto, para declarar la sección published debe hacer lo siguiente:



delphi
  1. type
  2.    TClase = class(Tpersistent)
  3.    ...
  4.    published
  5.       property Nombre: string read ....
  6.    end;



Published y el archivo dfm

¿Para que sirve este archivo?
Básicamente en este archivo queda guardado el valor de las propiedades. Delphi hace todo automático y se basa en este archivo para inicializar y recuperar el valor de dichas propiedades. Después de todo en algún sitio deben quedar guardados los valores que asignamos a nuestros componentes, ¿o no?
Si hace el experimento de diseñar un componente y deja sus propiedades públicas (que no publicadas), notará que no sólo no podrá asignar los valores en tiempo de diseño; sino que no tiene los medios para recuperar el valor desde un medio externo, a menos que implemente su propio método que sea capaz de leer un archivo y asignar valores. Pero claro, todo esto será en tiempo de ejecución. En tiempo de diseño simplemente no podrá hacer nada.


Cambiando la visibilidad

Es posible cambiar la visibilidad de algunos o todos los elementos de una clase base a otra visibilidad de mayor alcance en una clase heredada de ésta. Es decir que dada una clase A y una clase B que hereda de la anterior, cualquier elemento privado de la clase A puede ser cambiado a protegido, público y publicado.

¿Cómo se consigue esto?
Simplemente añadiendo la declaración del atributo, método o evento en la sección correspondiente. Por ejemplo:



delphi
  1. TClaseA = class
  2. private
  3.   FNombre: integer;
  4.   procedure HacerEsto(Esto: integer);
  5. end;
  6.  
  7. TClaseB = class(TClaseA)
  8. public
  9.   procedure HacerEsto(Esto: integer);
  10. end;



La inversa no es posible: no se puede ocultar una visibilidad de mayor alcance a uno de menor. Por ejemplo: de público a protegido o a privado.
En la VCL se usa este "mecanismo" ampliamente para brindar el acceso a las propiedades más comunes. Es muy común encontrarse con que las clases más bajas de la jerarquía (las hojas como quien diría) son en su mayoría clases que publican o hacen público las propiedades, métodos y eventos de una clase superior.
De este modo se protege y se brinda diferentes "niveles de acceso" al comportamiento y diseño desde las clases superiores a las inferiores. Además que brinda un grupo mayor de clases de las que uno puede heredar sin perjudicar el acceso y uso de propiedades, métodos y eventos a los que posiblemente no esté interesado.

Espero que este tutorial les haya sido de mucho agrado.

Saludos,
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.261 mensajes
  • LocationMéxico

Escrito 04 enero 2009 - 12:49

Me sorprende que alguien no se haya tomado la molestia de no llamar la atención a este tema.


Amigo, recuerda que estas entre puro novato :)

Salud OS
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 enero 2009 - 01:03

Amigo, recuerda que estas entre puro novato :)

Salud OS

Pues al único novato que veo es Caral, que es quien tiene la eterna marca registrada y los derechos de autor y explotación ;) :D

Saludos,
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 06 enero 2009 - 11:48

Saludos.

No sé si debes de tomar en cuenta (ya que los ejemplos son con Delphi) las nuevas características del lenguaje entorno a la visibilidad como son: Strict Private, Strict Protected.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 enero 2009 - 12:16

Saludos.

No sé si debes de tomar en cuenta (ya que los ejemplos son con Delphi) las nuevas características del lenguaje entorno a la visibilidad como son: Strict Private, Strict Protected.

Hola nuevamente,
Muy cierto. Debería considerar la visibilidad estricta, pero no hablé de ello debido a que es una característica que se añadió al lenguaje en versiones nuevas. Desconozco formalmente como es el tema debido a que yo uso D6. Leí un artículo que redacta brevemente el tema, pero al no poder ponerlo en práctica no estoy totalmente certero de si es adecuado que "hable".
Si tu estás más instruido y familiarizado en el concepto puedes hablar del tema aquí mismo. Este tutorial está hecho para todos y por todos.

Saludos,
  • 0