viernes, febrero 16, 2007

 

Implementaciones IV

Holaaaaaa. Si ya sé pensaban que había abandonado el blog. Naa.
Anduve un poco ocupado y además, los chicos de Arnet me tuvieron más de un mes sin servicio, y eso que contrate el servicio más grande que ofrecen. Estos chicos... Deberían poner una verdulería en lugar de dedicarse a la tecnología. Mmmmmm, ¿podrán manejar una verdulería?.
Bueno pero vamos al tema de este post. Repasemos un poco, estabamos con las propiedades.
Habíamos visto que básicamente teníamos dos formas de codificar una propiedad para una clase.
La primera, y la más fácil y precaria, era a través de una variable pública cuyo nombre se transformaba directamente en la propiedad del objeto.
La segunda, un poco menos fácil pero más seria, era mediante la definición previa de una variable privada y las definiciones posteriores de dos métodos Property; uno para leer el valor de la propiedad (GET) y otro para poner un valor en la propiedad (LET).
Bien, los que ya han tenido algunas horas de desvelo programando, habrán observado que hay algunos objetos que tienen propiedades que solamente pueden leerse y otros propiedades que solamente pueden escribirse.
Oops y esto ¿cómo se hace?.
Es muy sencillo, si queremos hacer una propiedad de sólo lectura debemos definir solamente el procedimiento Property GET así el cliente que use nuestra clase, verá la propiedad en la lista automática de miembros pero solamente podrá leerla.
Mmmmmmmm veamos un ejemplo. Supongamos que a la clase Persona que ya habíamos mencionado en otro post le queremos agregar la propiedad FechaDeNacimiento obviamente se tratará de una propiedad que el cliente debe poder usarla tanto para leer (consultar la fecha de nacimiento de la persona) como para escribir (asignar la fecha de nacimiento de la persona). Bárbaro eso ya sabemos como hacerlo.
Que linda nos está quedando nuestra clase Persona. Nos queda tan linda que podríamos mejorla un poco más, por ejemplo podríamos darle un servicio extra al cliente indicando la edad de la persona.
Bien, pensemos un poco. La fecha de nacimiento es algo que no cambia, para cada persona, permanece fija. La edad es un valor dinámico, cambia a cada momento.
Ahora bien, sabiendo la fecha de nacimiento de una persona y teniendo algunas funciones de manejo de fechas, no resultaría difícil hacer alguna rutinita, algún algoritmo, que permita calcular la edad.
Uhhhhhhhhhh que bien venimos.
Sigamos pensando, la edad la calculamos a partir de la fecha de nacimiento entonces, ¿debe implementarse como una propiedad de escritura/lectura?.
No, porque el valor no debe ser ingresado sino que como dijimos se calcula. Esto se conoce como valor derivado.
Ya que no hace falta ingresarlo solamente necesitamos escribir el código de una propiedad de sólo lectura. Algo así:

Public Property Get Edad() As Integer
Edad = m_intEdad
End Property

Obviamente a m_intEdad se le habrá calculado el valor apropiado, previamente.
Cómo no existe el procedimiento Property Let el cliente no podrá acceder a Edad para ponerle un valor, nuestro amigo VisualBASIC le hará notar el error.
Menos frecuente pero también posible es hacer propiedades de sólo escritura. Sería bastante parecido a lo que hicimos pero en lugar de implementar el procedimiento Property Get solamente implementaríamos el procedimiento Property Let.
Bueno ya vimos algo más de las propiedades pero la seguimos en la próxima.
Prometo no colgarme y postear mas seguido. Chauuuuu.

Nota: En la implementación de la propiedad Edad que puse anteriormente, se supone que el valor de la edad ya fue calculado. ¿Donde se debe calcular?. Uno de los patrones de diseño que se aplica es el Patrón Experto, el mismo dice que cada quién se debe encargar de lo que le corresponde (dicho de entrecasa). Mmmmmm si aplicamos esto, la edad debería calcularse entonces cuando se necesita o sea, cuando es requerida o sea, en el mismo código de la propiedad y en todo caso buscar la manera que una vez calculada no vuelva a hacerse el cálculo.
Si ya sé que también la puedo calcular al ingresar la fecha de nacimiento y vaya uno a saber en que otras partes del código pero bue, son detalles que van mejorando el diseño. La verdad no escribí el código para calcular el valor de m_intEdad dentro del Property Get por fiaca. Jajajaja, nos vemos la próxima

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