Escribe tu búsqueda

Xojo: variables y tipos de datos

Compartir

El título suena divertido, lo sé. Sin embargo, tal y como ocurre cada vez que aprendemos un nuevo lenguaje (o nuestro primer lenguaje de programación), es fundamental sentar algunas bases en torno a las cuales gira todo lo demás. Prometo hacerlo lo menos árido posible, porque programar ¡es divertido!

Cuando hacemos un programa, cualquier tipo de programa, en el fondo consiste en tratar una cantidad y tipo de información determinada, ya sean imágenes, sonido, textos, páginas web… da igual. En el fondo tienes que hacer referencia a ese tipo de información con la que vas a tratar, y manipularla de un modo u otro para producir la salida deseada: el resultado o resultados de tu aplicación.

Y para que todo esto ocurra, empezaremos con la magia de las variables.

Si ya has programado antes, probablemente no descubras nada nuevo en cuanto a las definiciones, aunque sí sobre los usos y tipos soportados, motivos por los que deberías de continuar leyendo. Y si por el contrario nunca antes has programado y la frase anterior te ha sonado a chino… también deberías de continuar leyendo. No es tan complicado, ya verás.

Variables, cestos para los datos

En Xojo utilizamos las variables como contenedores de datos: números, cadenas de texto, colores… o bien para que contengan otros objetos (ya llegaremos a los objetos en la próxima entrega).

Las variables representan el modo que tenemos en el código de referirnos a un contenido determinado en memoria, una y otra vez, sin necesidad de tener que repetirlo en cada ocasión, y con la conveniencia de que podemos modificarlo de modo que no tenga por qué continuar representando su forma original.

Mi definición: piensa en las variables como en cestos, con la particularidad de que cada cesto solo puede contener aquello que hayamos indicado previamente con una etiqueta pegada sobre el propio cesto. Por supuesto, has de declarar tus ‘cestos’ y etiquetarlos adecuadamente antes de que puedas utilizarlos, para saber qué puede echar en cada uno de ellos.

¿Y qué significa esto? Pues que a diferencia de lo que ocurre con otros lenguajes de programación, Xojo es un lenguaje de programación de tipado fuerte (¡bing!), exquisita definición que puedes consultar en la Wikipedia y que, de forma más coloquial, viene a decir que si declaras tu cesto para que contenga manzanas, nunca, nunca, nunca, intentes meter peras en él, porque obtendrás un error como respuesta (¡aunque hay trucos y modos de hacerlo!).

Ahora bien, es preciso que a la hora de elegir un nombre para tus variables tengas en cuenta que este puede ser de cualquier longitud, debe de comenzar con una letra ASCII (A-Z), siguiendo con cualquier combinación de caracteres o caracteres y números, además de que también puedes utilizar en su composición el guión bajo (_).

Sin embargo, Xojo no es sensible en cuanto al uso de mayúsculas y minúsculas en la composición del nombre para las variables. Por tanto, las variables ‘nombre’, ‘Nombre’ y ‘nOmBrE’ serán tratadas como si fuesen la misma (si utilizas variables como el último ejemplo… tienes un problema).

Consejo: ¡Elegir buenos nombres para tus variables es todo un Arte! Al principio, puedes dejarte llevar por la emoción de crear tu aplicación lo más rápido posible. No lo hagas. A medida que tu aplicación vaya creciendo perderás una gran cantidad de tiempo intentando recordar qué variable era responsable de qué, o cómo se llamaba aquella otra en la que guardabas otra cosa… Utiliza nombres no excesivamente largos, y que sean representativos del tipo de información que contienen.

Obviamente, a lo largo del curso no haré caso de mis propios consejos por cuestiones de comodidad (hmmmm, sí… la mía), y legibilidad. 

Declarar y usar variables

¡Listo! Ya sabemos que nuestros cestos (variables) han de ser declaradas para un tipo determinado, y para ello Xojo utiliza la palabra clave Dim. Por ejemplo, lo siguiente sería el modo de declarar una variable en Xojo para que admita datos de tipo numérico entero (sin parte fraccionada):

Dim n as integer

E incluso podemos asignarle un valor de inicialización, si así lo deseamos:

Dim n as Integer = 42

O bien declarar varias variables al mismo tiempo bajo un mismo tipo:

Dim n, i, x, z as Integer

Como puedes apreciar, y también a diferencia de lo que ocurre con otros lenguajes de programación, en Xojo no es preciso finalizar una línea de código utilizando punto y como (;) o cualquier otro carácter específico. Basta con un simple retorno.

Por tanto, a partir de la declaración anterior, podremos asignar cualquier otro valor numérico siempre que lo deseemos:

n = 0

n = 3

n = 5

Si ejecutásemos nuestro programa ahora, ¿cuál es el valor de ‘n’? La respuesta: 5. Cada vez que asignamos un nuevo valor a nuestro “cesto”, este descarta el contenido anterior para almacenar el nuevo… de ahí su nombre: variable.

Pero, ¿qué ocurre si en la asignación de la variable utilizamos una operación en la que tome parte la propia variable? Por ejemplo:

n = 5

n = n + 5

El compilador de Xojo, al igual que hacen otros muchos compiladores, evalúan en primer lugar la parte derecha de la expresión (a la derecha del signo igual ‘=’), asignado a continuación el resultado sobre el componente de la parte izquierda de la expresión; en este caso la variable ‘n’.

Por tanto, y a lo que nos interesa, primero se toma en la parte derecha el valor de ‘n’ (5), sumándolo al valor numérico constante (puesto que no está representado por una variable) y se asigna de nuevo a la misma variable.

Te acostumbrarás (y deberás) de utilizar este tipo de expresiones una y otra vez en tus propias aplicaciones Xojo o con cualquier otro lenguaje de programación.

También podemos asignar a una variable el contenido de otra variable o bien el contenido obtenido como resultado en el tratamiento de otras variables. He aquí un ejemplo:

Dim n, x, y as integer = 5

n = x + y

Como resultado de la última sentencia, la variable ‘n’ contendrá el valor 10, suma de ‘x’ e ‘y’ (indicado mediante el operador ‘+’).

Ahora bien, ¿qué ocurriría en el siguiente caso?

Dim n, x as integer = 5

Dim y as string = "5"

n = x + y

La respuesta, un poco más adelante.

Truncado de datos, tipado fuerte con sentimientos

Y ahora veamos alguna de las excepciones sobre todo el asunto del tipado fuerte y que los cestos declarados como naranjas solo pueden contener naranjas, y demás.

Teniendo en cuenta el siguiente ejemplo, donde declaramos un par de variables como contenedores de números enteros y otra como contenedora de números reales (comúnmente denominados ‘de coma flotante’)… ¿qué ocurrirá? ¿obtendremos un error por parte del compilador o no?

Dim i, n as integer = 5

Dim f as double = 5.25

i = n + f

Pues que, efectivamente, el compilador no se queja y lo que obtendremos será el resultado 10 almacenado en la variable ‘i’. ¿Por qué? Porque en este tipo de situaciones, el compilador trunca la información de la variable disonante (en este caso la declarada como tipo Double) para adaptarla a la variable de destino. Y como una variable declarada de tipo entero (Integer) no puede almacenar información decimal… pues se desprecia la parte decimal contenida originalmente en la variable ‘f’.

¡Ojo! porque en algunos programas, efectivamente, este puede ser el comportamiento que busquemos, pero en otros perder la información decimal como parte del proceso realizado por el compilador, sin ser avisados de ello, ¡puede ser un fallo muy serio! Imagina por ejemplo el desastre que resultaría en tu próxima aplicación Xojo encargada de poner un satélite en órbita o, más prosaico, llevar la contabilidad doméstica.

Moraleja: cuando trabajes con variables, observa muy mucho que los datos no se vean ‘truncados’ como resultado de la asignación de un tipo a otro distinto.

Las peras con las peras, las manzanas con las manzanas

Como te prometí, veamos ahora el resultado del ejemplo inmediatamente anterior. Refresquemos la memoria:

Dim n, x as integer = 5

Dim y as string = "5"

n = x + y

Como hemos visto, el compilador es capaz de adaptar información almacenada en variables declaradas bajo tipos diferentes… siempre y cuando exista la posibilidad de una conversión directa, tal y como es el caso entre números declarados como enteros y los declarados como reales (Double). Después de todo, en ambos caso se trata de números. Pero no es así entre tipos declarados como enteros (‘n’ y ‘x’) y otro declarado para contener datos alfanuméricos (variable ‘y’).

De hecho, si intentas compilar (Comando + B) el fragmento de código anterior (por ejemplo en el evento ‘Open’ de App) obtendrás el siguiente error:

Lo que viene a decir es que se esperaban datos de tipo entero… y se ha encontrado ¡con una cadena! (String), de modo que la correspondencia de datos entre las variables es errónea. Toca solucionarlo.

Existen otros lenguajes de programación con los que nunca tendrás este tipo de problemas y, si ven que pueden convertir una cadena en valor numérico lo harán sin quejarse; mientras que si intentas “sumar” o añadir un número a una cadena existente, también lo harán.

En Xojo, no. Recuerda: es de tipado fuerte.

Eso no significa que puedas conseguir los mismos resultados, y de hecho dispone de varias funciones para obtener una versión diferente de tus variables sin que afecte a su tipo original:

  • Str. Devuelve una cadena a partir del valor numérico proporcionado; pero, ojo, la variable continuará siendo del tipo declarado.
  • Val. Devuelve un valor numérico a partir de la cadena proporcionada. Como en el anterior caso, la variable conservará en todo momento su tipo declarado originalmente.

Existen otras funciones más especializadas y/o flexibles en función de lo que quieras obtener. Es algo que irás aprendiendo con la práctica y a medida que vayas devorando la documentación de Xojo. No hay otra.

Para poner lo anterior en práctica, podríamos resolver nuestro anterior problema del siguiente modo:

Dim n, x as integer = 5

Dim y as string = "5"

n = x + val(y)

Así la función Val nos devuelve el valor numérico almacenado en la variable ‘y’ (5). Por tanto, en este caso sí obtenemos el resultado deseado: 10.

Ahora bien, ten en cuenta que la función Val no siempre puede extraer un valor numérico a partir del dato almacenado en una cadena:

Dim n, x as double = 5

Dim y as string = "5,25"

n = x + val(y)

Msgbox str(n)

Conociendo lo que ya conocemos sobre el truncado de datos y la conversión de tipos mediante las funciones Val y Str… ¿qué ocurre en esta ocasión? (Observa que ahora ‘n’ y ‘x’ están declarados para almacenar números reales, con parte decimal).

Copia el fragmento en el IDE de Xojo y ejecútalo (Comando + R), yo te espero. Por cierto, Msgbox es la función de Xojo que muestra el texto que le pasemos sobre un cuadro de diálogo. Es la forma más básica de presentar un mensaje al usuario de nuestra aplicación, interrumpiendo la interacción con la interfaz principal de nuestro programa. Le estás gritando, vaya.)

¡Tachan! Efectivamente, el resultado es un sonoro 10 y se ha perdido la parte decimal pese a que nuestras variables numéricas están definidas como tipo Double. ¿Por qué ha pasado esto? El culpable es la función Val… y tu forma de pensar. El hecho de que la cadena incluya lo que parece un número decimal, tal y como nos enseñaron en la escuela, utilizando la coma como separador, a Xojo no se lo parece… y hace bien. Después de todo, en EE.UU. y otros países utilizan como separador decimal el punto. ¿Quién tiene razón, después de todo? La función Val, que ha sido diseñada para extraer sólo la parte que le parezca numérica desde el inicio de la cadena.

Así, por ejemplo, habríamos llegado al mismo resultado si hubiésemos declarado la variable ‘y’ del siguiente modo:

Dim y as string = "5xxxx25"

Mientras que si la variable ‘y’ fuese declarada:

Dim y as string = "Xojo rules!)

Entonces la función Val interpretaría su valor numérico como un sonoro cero.

Tratar cadenas como números, con equivalencia internacional

¿Y no existe modo de que Xojo interprete la coma en una cadena como separador decimal? Sí, lo es. Y este es el motivo por el que, cuando consultes la documentación de Xojo siempre debes de consultar el apartado “See also” en la parte inferior correspondiente a la página sobre el tema consultado.

Por ejemplo, así es como descubrirás al consultar la documentación sobre Val que existe otra función relacionada denominada CDbl. Así, retomando nuestro ejemplo y sustituyendo Val por CDbl, obtendremos el resultado deseado:

Dim n, x as double = 5

Dim y as string = "5,25"

n = x + cdbl(y)

Msgbox str(n)

¡Ahora bien, la ventana nos muestra el resultado utilizando el punto como separador decimal en vez de la coma… ¿Cómo lo resolvemos? Al igual que Val tiene una función relacionada CDbl, ya te adelanto que la función str también cuenta con una variación que permite resolverlo. Te toca averiguar cómo. (Pista: recuerda: “See also”)

Tipos de datos

Xojo proporciona por omisión una serie de tipos de datos que podemos denominar como básicos. Son los siguientes (algunos de ellos ya los hemos ido viendo a lo largo de este capítulo):

String. El tipo de dato declarado como String puede contener cualquier información alfanumérica.

Dim s as string = "Hola mundo"

Si durante la declaración no realizamos asignación, entonces el contenido de la variable será vacío, equivalente a asignar dobles comillas:

Dim s as string

Dim s as string = ""

El tipo de dato String soporta el operador de suma (+) que permite concatenar, por ejemplo, dos cadenas:

Dim nombre as string = "Javier"

Dim Apellido as string = "Rodríguez"

MsgBox nombre + " " + apellido

También ofrece otra cantidad de funciones que puedes utilizar para manipular prácticamente cualquier aspecto de la cadena propiamente dicha, tal y como puedes ver en la documentación oficial (http://docs.xojo.com/index.php/String).

Integer. Como hemos visto, se trata de un tipo de dato numérico con signo, lo que significa que no puede contener parte decimal pero sí números naturales con un máximo de 32 bits. Es decir, puede expresar números entre -2.147.483.648 y 2.147.483.648 (¡ojo con la información de signo cuando crees tus aplicaciones!).

Si lo deseas, también puedes utilizar otros tipos de datos numéricos más específicos soportados por Xojo: Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32 y UInt64; si bien en la práctica sólo suelen emplearse cuando se hacen llamadas a las API nativas del sistema operativo (tranquilo, son temas muy avanzados, por ahora).

Double. Tal y como también hemos ido viendo en nuestros ejemplos, se trata del tipo numérico capaz de almacenar la parte decimal con precisión exquisita. En este caso las variables declaradas como tipo Double emplean un tamaño de 8 bytes de memoria, lo que permite expresar un rango de ±1.79769313486231570814527423731704357e+308 (si practicas la memorización de Pi por deporte, sabrás apreciar mi esfuerzo al copiar este dato aquí).

Currency. Este tipo de dato es capaz de almacenar un valor numérico compuesto por hasta 15 dígitos a la izquierda de la coma decimal, con una precisión decimal de cuatro dígitos. Como habrás deducido, probablemente es el tipo de dato que querrás utilizar cuando realices cálculos numéricos con dinero, además de que también es el tipo de dato compatible con Visual Basic (lo que sabrás apreciar si quieres cambiar a Xojo como entorno de desarrollo desde dicho lenguaje de programación).

Boolean. Se trata del tipo de dato fundamental a la hora de que tus programas tomen un curso u otro como resultado de una comprobación determinada o expresión que devuelva un resultado booleano, por ejemplo. Sólo puede contener dos valores: verdadero (indicado como True) o falso (indicado como False). Por omisión, una variable declarada como booleana tiene el valor False por omisión:

Dim b as Boolean //(b = false)

Dim b as Boolean = True

Color. Como puedes imaginar, se trata del tipo de dato encargado de almacenar la información correspondiente a un color determinado. Es posible definir un Color mediante tres funciones, correspondientes a los tres modelos de color soportados (RGB, HSV y CMY) o bien mediante un valor numérico constante, precedido por los caracteres &c:

Dim c as color = &cff0000 // 100% rojo, 0% verde, 0% azul

Ámbito de variables

Por otra parte, una vez que has declarado una variable para que sea de un tipo determinado, no podrás volver a declarar la misma variable para que sea de otro tipo diferente en el mismo bloque de código. Por ejemplo:

Dim n as integer

Dim x, i as integer = 5

n = x + i

dim n as string <--- error!

 

Ahora, sí es perfectamente válido que utilices los mismos nombres de variables en los diferentes componentes utilizados a la hora de crear nuestras aplicaciones Xojo: Controles, Ventanas, Módulos, e incluso como parte de los diferentes métodos (llamadas de código) declarados en cada uno de dichos componentes. Cada uno de estos elementos conforman lo que se denomina ámbitos de ejecución.

Aunque ahora mismo, parte de lo anterior no te quede muy claro, sirva decir que una variable se crea y existe (es decir, ocupa memoria) cuando se entra en su ámbito de ejecución, y desaparece y se destruye una vez que el programa sale de dicho ámbito.

Por ejemplo, el ámbito de ejecución del objeto App que te encuentras de serie cada vez que creas una nueva aplicación de escritorio, es desde que ejecutas hasta que salgas de la propia aplicación. Por tanto, cualquiera de las variables declaradas como Propiedades del objeto App existirán siempre que se esté ejecutando el programa.

Y así, sin previo aviso, es como hemos llegado a hablar de Objetos y Propiedades. Algo que abordaremos en la próxima entrega, momento en el que tendremos más herramientas para ver en detalle los ámbitos de ejecución y la relación entre variables, clases y objetos.

Hasta entonces, ¡practica con las variables! y empieza a crear tus primeros programas indagando, como siempre, en la documentación oficial y en los propios ejemplos suministrados con Xojo.

Enlaces de Interés sobre Xojo

Artículos anteriores

 

Javier Rodríguez (@bloguintosh) es desarrollador OS X e iOS, director de Macsoluciones.com. Puedes contactar con él para el desarrollo de aplicaciones para Mac e iOS en entornos empresariales así como consultoría y formación.

2 Comentarios

  1. Jorge Roger Takushi Guillen 16 diciembre, 2014

    amigo, tengo un problema, soy nuevo con el xojo, he hecho un pequeño proyecto, pero resulta que tiene dos ventanas, windows1 y windows2, el problema es q las variables creadas en el windows1, no se pueden usar en el windows2, y no le encuentro solucion, existe algun tipo de variable universal q trabaje en cualquier windows demi proyecto, hablo de una unica variable, como por ejemplo el codigo del usuario creado en la primera ventana, no se mantiene en la segunda ventana.

  2. Javier Rodríguez 17 diciembre, 2014

    De entrada, eso es una mala implementación en el “reparto de responsabilidades”; es decir que un objeto deba de acceder directamente a las variables de otro (en este caso entre dos ventanas) 😉

    Ahora a la solución: si necesitas acceder a un conjunto de variables desde varias ventanas, decláralas en el objeto de aplicación (App) o bien crea un módulo y utilízalo para que albergue todos los elementos que quieras utilizar de forma global en el proyecto.

    Para conocer más detalles del lenguaje, puedes echar un vistazo al libro que he publicado sobre el lenguaje de programación Xojo en http://www.aprendexojo.com

    Saludos!

    Javier

Dejar un comentario

Twitter
Visit Us
Tweet
YouTube
Pinterest
LinkedIn
Share