jueves, 16 de marzo de 2017

Programación Orientada a Objetos - Parte II

Encapsulación

Proceso de Encapsulamiento


Cuando se desarrollan clases, para poder hacerlas reutilizables y portables, es necesario encapsularlas. El proceso de encapsulación permite al desarrollador de la clase, construir su propia librería de objetos y que puede ser reutilizada más tarde por otros desarrolladores. Dentro de la encapsulación, se construye el objeto clase y todas sus funciones específicas. Ud., puede desear que sus clientes que utilicen su paquete encapsulado de clases tan solo accedan a los atributos y operaciones que considere adecuados, descartando así, el resto de los atributos y operaciones que no deben ser públicos o accedidos por el cliente consumidor del paquete. La encapsulación le garantiza un uso más racional, sencillo y eficaz desde el punto de vista del cliente consumidor de dicha clase. Ud., tan solo deberá proporcionar la información suficiente como para que sus clientes puedan y sepan aprovechar el producto de forma eficiente y eficaz.
Como se aprecia en la figura, sus clientes tan solo pueden acceder a los elementos que son ofrecidos en caridad de Interfaz Pública. Tanto la Información Interna como la Implementación, ambas, resultan exclusivamente interna y sus clientes no podrán acceder a ellas desde el exterior. Se dice que pertenece al objeto y no al cliente.
Veamos un ejemplo más cercano. Suponga que tenemos un radio. Cuando operamos el radio, nosotros tan solo hacemos uso de sus componentes externos, tal como la sintonía, el botón de volumen, encendido, etc. Cuando presionamos el botón de sintonía del radio (Interfaz Pública), el equipo utiliza un mecanismo electrónico para ubicar la estación de radio (Implementación) para luego dar con la estación donde se transmite una audición (Información Interna). Los detalles de cómo se produce el proceso de sintonía y ubicación de la estación radial quedan ocultos mientras que el botón de sintonía resulta visible para nosotros.

Convención de Diagramas de Clases

La diagramación de clases sigue una regla de convenciones que forman parte del moderno estándar del software. Es necesario sujetarse a un estándar por varias razones. En los diseños de ingeniería y de sistemas, resulta ser crucial la interpretación de todos los procesos sistemáticos a los efectos de facilitar los desarrollos en general. La convención, no solo propone un estándar sino que permite a otros desarrolladores comprender el diseño e implementarlo de forma conveniente durante los procesos de creación del software. Por ejemplo, el modelado de lenguaje UML hace énfasis en este concepto. El diseñador del software puede utilizar las convenciones para crear el software modelo mediante la convención y le permite pasar a los desarrolladores el proyecto de desarrollo del sistema de forma directa sin las necesidades de tipos de intérpretes de por medio. Esto, no solo abarata los costos de los procesos sino que los agiliza también.

Crear o Instanciar Objetos

Cuando se procede a dibujar un componente, llámese botón, etiqueta, cuadro de texto, etc., sobre un for-mulario se crea un objeto nuevo sobre el formulario. Sin embargo, el verdadero proceso es que se genera una instancia de clase. Por ejemplo, cuando se dibuja un botón en pantalla, lo que se está haciendo es creando un objeto botón de instancia de clase botón. Por tanto, decir “un coche” es hablar de una clase y “mi coche” es un objeto. Para poder crear instancias de clases, se debe escribir el código como sugiere la siguiente línea.

ClaseObjeto variableObjeto = new ClaseObjeto();

El código lo que hace es crear una instancia de clase llamada ClaseObjeto sobre una variable de objeto tipo ClaseObjeto llamada variableObjeto. La variable variableObjeto asume las propiedades y los métodos de la clase ClaseObjeto. Por tanto, la variable es una referencia a la clase ClaseObjeto.
Una vez creado el objeto como referencia de la clase, este puede reutilizarse en el programa durante el período de tiempo de ejecución de dicha aplicación. Una vez que el programa deja de tener efecto, el objeto es quitado de la memoria a través del GC (Garbage Collector). Sin embargo, es posible quitar la referencia del objeto hacia la clase de modo de optimizar el uso de la memoria del sistema a través del uso de la palabra clave null. A continuación, se declara el uso de esta palabra clave para proceder con la quita de la referencia hacia la clase.
variableObjeto = null;

Un Ejemplo Práctico

En el siguiente ejemplo, vamos a construir un botón utilizando pura y exclusivamente desarrollo de clases. Notará que el siguiente ejercicio práctico, no hará falta dibujar el componente sobre el formulario. Este mismo se creará de forma dinámica cuando proceda a ejecutar su aplicación. Este tipo de desarrollos se los conoce como el nombre de “programación al vuelo”. El código es el siguiente.

public partial class Form1 Form
{
   public Form1()
   {
      InitializeComponent();
   }

   private void Form1_Load(object sender, EventArgs e)
   {
      Button boton = new Button();
      boton.Click += new EventHandler(botonClick);
      boton.Name = "Boton1";
      boton.Size = new Size(100, 25);
      boton.Location = new Point(100, 100);
      boton.Text = "Hola Mundo";
      this.Controls.Add(boton);
   }

   private void botonClick(object sender, EventArgs e)
   {
      MessageBox.Show("Hola a los Programadores de Visual C#""Visual C#",
          MessageBoxButtons.OK,
          MessageBoxIcon.Information
      );
   }
}

Descripción del Código

Si observa el encabezado, notará que empieza con la palabra clave public. Esto significa que la clase Form1 resulta pública, es decir, puede ser accedida desde el exterior. Además, hereda de la clase Form. La clase Form1 es parcial, obsérvese el uso de la palabra clave partial, porque parte de su implementación se encuentra contenida en otra parte de la clase y es controlada por el método InitializeComponent(). La otra parte de la clase la he omitido por cuestiones de espacio y pedagógicas.
Ahora bien, dentro del cuerpo de la clase Form1, encontramos más código. Encontramos un método lla-mado private void botonClick(). Este método dispara un cartel en pantalla a través de la función clásica de llamada usando la clase MessageBox con el método estático sobrecargado Show().
El siguiente método, se trata en realidad del método de control del evento. El manejador se encuentra declarado dentro del código del evento load de carga del formulario. Si lee el código, notará que el nombre del evento es Form1_Load. Este evento o acción se ejecutará en el momento en que el formulario se cargue en la memoria durante el proceso de ejecución. No se preocupe por los detalles internos que se encuentran encerrados entre paréntesis. Eso lo verá más adelante, ahora Ud., simplemente, concéntrese en el cuerpo de este evento.
Notará que se crea en la primera línea una instancia de clase Button llamada boton. Notará que tiene una palabra clave new que es el constructor de la clase y de referencia hacia el objeto boton. Luego, se continua con una línea que utiliza un evento llamado Click y se sobrecarga el operador de instancia con una clase EventHandler, que es el manejador del evento y entre sus paréntesis, se coloca el nombre del método vinculado con el evento Click del botón. Esto es conocido con el nombre de Delegados.
Bien para que entienda, esto crea un evento en forma dinámica. Por tanto, el método botonClick(), durante la ejecución de esta aplicación, se convertirá en un evento tal como el Form1_Load. Cuando el usuario haga clic sobre el nuevo botón que aparece en pantalla durante la ejecución del programa, se disparará el método botonClick() y emergerá un cartel en pantalla exhibiendo el contenido del mensaje que se lee en el código.
El resto de las líneas, si lee detenidamente, simplemente hace referencia a los atributos o propiedades de nombre de objeto Name, tamaño del botón Size, ubicación en pantalla Location y Point, una descripción Text, y por último, la ubicación en el contenedor interno del formulario declarado como this.Controls.Add(boton). Si observa bien, notará que algunas propiedades tienen el constructor new declarado y otras no. La respuesta a esta pregunta significa, donde hay un new, hay una referencia hacia una clase y por tanto estamos instanciando o creando un nuevo objeto. En la mayoría de estos casos para este ejemplo, simplemente, se pasan las referencias más el objeto. Por ejemplo, Size le pasa el tamaño en valores más el objeto Size.

Extracto de mi Libro - Capítulo 9 - Programación en C#
Autor: Wagner, Ariel Alejandro.
21-02-2014 - (Última actualización)
Muchas gracias por leer. 
Si encuentra interesante este material, puede donar lo que desee. Con su aporte, por más pequeño que sea, será suficiente para mentener este blog operacional. Nuevamente, muchas gracias. Que Dios lo bendiga.
- Ariel.

No hay comentarios:

Publicar un comentario