Precondiciones en las Propiedades
Las propiedades como vimos, es una forma de acceder a los atributos de una clase, en la que no necesariamente se especifican si los campos son públicos, privados o protegidos, sino el nombre con el cual son accedidos, siendo Boo un lenguaje con la posibilidad de anexar ciertas condiciones sobre las propiedades que nos permiten validar de cierta forma los valores asignados a estos campos, como ejemplo veamos la clase siguiente:
class ClasePrueba: [property(Name)] _name = "Wtf?" instancia = ClasePrueba(Name: "Texto nuevo") print instancia.Name
Al ver el ejemplo vemos que la clase tiene el campo _name, que puede ser accedida mediante la propiedad Name; En Boo al momento de crear la instancia (el objeto), podemos que en la definición nombramos (o redefinimos) además la propiedad que luego escribimos con print, hasta aquí nada nuevo, ahora veamos como agregamos un precondición a la declaración de la propiedad.
class ClasePrueba: [property(Name, value is not null)] _name = "Wtf?" instancia1 = ClasePrueba(Name: "Hola") print instancia1.Name instancia2 = ClasePrueba(Name: "") print instancia2.Name instancia3 = ClasePrueba(Name: null)
El ejemplo permite instanciar las dos primeras veces, con un texto no nulo (la cadena “Hola”) incluyendo el texto vacío, pero para la tercera instancia cuando tratamos de instanciar la clase con una propiedad nula, el interprete nos manda una excepción acerca de la declaración de la propiedad que nos indica que no debe ser nula, pero que pasa si no queremos ni nulos ni cadenas vacías, podemos concatenar varias precondiciones con el conector lógico AND, como vemos en la siguiente clase:
class CPrueba: [property(Name, value is not null and len(value) > 0)] _name = "aloha" iObjeto = CPrueba(Name: "Adieu") print iObjeto.Name iObjet2 = CPrueba(Name: "") // Manda la excepción.
Este medio de establecer una precondición no es para nada una forma de simplificar código ya que pueden ser expresadas por medio de condiciones o excepciones, no es una forma de ahorrarse líneas de código, sino por el contrario clarificar en el lugar adecuado el comportamiento y tratamiento de ciertas variables.
Introspección o mirar dentro mío.
Cuando uno se encuentra dentro del booish, se puede hacer uso de dos herramientas de mucha ayuda (complementarias a la reflección del framework .Net). Una de ellas nos permite averiguar datos acerca de las clases implementadas (e importadas) es decir que podemos obtener los atributos y métodos de una clase con solo preguntarle adecuadamente por ello; algunos dirán que eso es irrelevante, ya que con los editores de programación (IDE) con capacidad de predicción de código, ese aspecto está cubierto, pero algunas veces no se dispone de ellos, esto sin embargo es un idea para esos momentos donde no los tenemos a la mano. Uno de ellos es el método dir() y el otro es help(), si bien ambos realizan la misma tarea aunque, las diferencias son más en apariencia y legibilidad.
import System.Console dir(System.Console) help(System.Console)
Al preguntarse por uno u otro, la información que nos devuelve es relevante para clases cuya documentación es nula (raro pero existe la posibilidad), cuya documentación es inaccesible por motivos de conexión, etc. Además que es una forma heredada de python, pero que se agradece que se haya heredado a Boo.
Cómo puedo saber el tipo exacto de una variable?
Al ser .Net una plataforma que promueve la programación orientada a objetos, se prevee que todo objeto variable proviene de uno generico, esta clase generica implementa un método que permite saber que tipo de dato es o contiene, el método apropiado para que una variable (sea un objeto o una estructura, etc) nos devuelve su naturaleza es: GetType().
>>> a as int >>> a.GetType() >>> 1.GetType() >>> (2.34).GetType() >>> ([]).GetType() >>> ((,)).GetType()
Boo provee de la funcion typeof(), la cual nos permite saber el tipo de dato de una variable, en los mismos términos de .Net.
Espero que todo lo tratado les permita mejorar en algo la programación orientada a objetos como lo hizo conmigo.








