miércoles, julio 26, 2006

 

Implementaciones III

Con esta humedad lo único que dan ganas es de escribir sobre programación.
Jajajajajaja.
La verdad es que anduve un poco ocupado y estaba atrasado con darle al teclado.
Pero buen, veamos si puedo ir poniendome al día.
Ya habiamos visto como hacer para que una clase tenga una propiedad, creando una variable y declarandola del tipo Public dentro del código de la clase.
Esa es la forma más sencilla de hacer esta tarea pero, en este caso, lo más sencillo no es lo mejor.
¿Por qué?. Porque cuando un objeto cliente le asigna un valor a la variable no tenemos forma de controlar, validar ni manipular dicho valor.
Pensemos como ejemplo la clase Persona con una variable pública llamada Apellido. Ni bien se le asigna un valor a esa variable no hay manera de operar sobre él. Supongamos por ejemplo que, independientemente de lo que el usuario escriba, deseamos que el apellido esté siempre en mayúscula. En este caso no hay forma de hacerlo.
Veamos entonces una manera más versátil y profesional de escribir el código correspondiente a una propiedad de una clase.
Propiedades de las clases, la forma correcta.
Lo primero que debemos recordar es que lo definido como privado dentro del código de la clase, pertenece exclusivamene a ella y no hay manera que de acceder a ello desde afuera de la misma.
Entonces, para cada propiedad definimos en la sección de declaraciones, para que tenga una visibilidad de módulo, una variable privada.
En el ejemplo planteado anteriormente nos quedaría algo así:
Private m_strApellido As String
Al ser privada no está disponible para el exterior de la clase.
¿Cómo usamos esa variable entonces?.
Tenemos que tener en cuenta que pueden existir dos posibilidades, que necesitemos asignarle un valor a ella o sea, guardar algo en ella o bien, que necesitemos recuperar, leer, el valor que ella contiene.
Entonces debemos definir dos procedimientos especiales para estas dos posibilidades. Estos procedimientos son los Property. Je!! el nombre los vende de que se trata de procedimientos de propiedad no?.
La sintaxis sería algo como lo siguiente:
Public Property Get Apellido() As String
Apellido = m_strApellido
End Property
Public Property Let Apellido(ByVal vNewValue As String)
m_strApellido = vNewValue
End Property
Cosa rara che. Naa.
Primero hay dos porque uno sirve para recuperar el valor y otro para asignarle un valor.
El Get, recupera un valor y usa el mismo nombre de la propiedad como contenedor, si nos fijamos en el código pone en Apellido el contenido de m_strApellido.
El Let, asigna el valor. ¿Cuál?. El que recibe en vNewValue.
Un cliente que use la clase persona, para asignarle un valor al apellido, escribir un código como el siguiente:
Dim objPers As Persona
Set objPers = New Persona
objPers.Apellido = "Perez"
Muy sencillo.
Para usar tal valor, en un cuadro de mensajes por ejemplo deberá escribir un código mas sencillo todavía.
MsgBox objPers.Apellido
Una ganga.
¿Si quisieramos que el apellido esté siempre en mayúscula?.
Solamente debemos modificar el procedimiento Property Let de la siguiente manera:
Public Property Let Apellido(ByVal vNewValue As String)
m_strApellido = UCase(vNewValue)
End Property
Nada y además el cliente ni se entera.
Como pueden ver el tema de las propiedades se pone bueno así que la seguimos en la próxima.
Nos vemos.

sábado, julio 01, 2006

 

Implementaciones II

Bueno es sábado a la tarde, hay solcito y no hace tanto frío.
La verdad me dieron ganas de escribir, entonces que mejor que avanzar un poco más en la manera de hacer objetos con Visual BASIC.
Ya habíamos visto una manera precaria de implementar atributos o propiedades, obviamente el decir que es precaria implica que hay otras mejores. Si si y ya las vamos a ver.
Lo que hoy vamos a ver son los métodos.
¿Qué son los métodos?.
Los métodos son las implementaciones de las operaciones. Mmmmm dificil che.
No tanto, conceptualmente, se separa las operaciones o sea, la definición de su signatura (su nombre, el nombre y tipo de los argumentos de entrada y el nombre y tipo de valores devueltos) de sus métodos o sea, el código que permite que la operación haga algo.
Así por ejemplo si defino un procedimiento de la siguiente manera:
Public Sub BuscarCliente(IDCliente As Long)
Esa es una operación de la clase, el código dentro del procedimiento, que es el que en realidad hace algo, será el método.
No era tan difícil. Pero, ¿para qué la complican tanto?.
Ya lo vamos a ir viendo.
Una vez que defino ese procedimiento, cuando instancio un objeto de la manera que ya expliqué mediante una variable, al poner el operador punto aparece BuscarCliente entre la lista de miembros desplegable o sea puede ser usado por cualquier código cliente que use el objeto.
Esto explica el motivo de separar las operaciones de los métodos, un cliente solamente ve la signatura de la función o sea la operación y podemos cambiar, mejorar o corregir el método sin que el cliente se entere. La verdad que está polenta.
Este es otro ejemplo de encapsulamiento todo lo que sea interno de la clase, los clientes no lo ven.
Hablando de interno.
¿Qué ocurre si necesitamos hacer alguna función o algún método y no queremos que los clientes lo usen?.
Muy sencillo lo declaramos como Private en lugar de Public. Debemos recordar que todo lo que sea Private podrá ser usado solamente dentro de la clase.
Es muy normal definir funciones o procedimientos privados que hacen algún trabajo de soporte al trabajo principal que se espera de la clase.
Como norma solamente se debe dejar público aquellas funcionalidades que el sentido común dice que nuestra clase debe tener, técnicamente esto se expresa que las clases deben ser cohesivas o sea que sus operaciones y atributos deben estar fuertemente relacionados.

This page is powered by Blogger. Isn't yours?