Sobrecarga de métodos: Propiedades Calculadas, Setters y Getters

Method OverloadingHace ya algunas versiones atrás, Xojo introdujo la capacidad de utilizar Propiedades Calculadas, algo que en otros lenguajes de programación se realiza mediante el uso de un método Setter y otro Getter asociados a la propiedad en cuestión. Así, el primero de ellos, el Setter, es el que se invoca cuando queremos modificar el valor de la propiedad asociada, mientras que el Getter será el método invocado para obtener desde nuestro código el valor de dicha propiedad. Detrás de toda esta magia se encuentra la Sobrecarga de métodos.

Como programadores esto presenta toda una serie de ventajas. La primera de ellas es que cuando creamos una propiedad de estas características, mediante por ejemplo Insert > Computed Property, estaremos definiendo el nombre de la propiedad, tipo y ámbito tal y como haríamos con cualquier otra propiedad. De hecho, cuando referenciamos dicha propiedad desde nuestro propio código lo haremos utilizando la habitual notación por punto y también asignaremos los nuevos valores utilizando el signo habitual de asignación; es decir, el símbolo igual (“=”).

Ahora bien, Xojo se encarga de ocultar toda la complejidad interna que se encierra tras dicha definición y que podemos observar simplemente seleccionando la propiedad definida en el Navegador de Proyecto y desplegándola.

Definición de Propiedad Calculada en Xojo

Como puedes ver en la imagen, bajo el nombre de la propiedad propiamente dicha encontramos los dos métodos: Get y Set. El método Get será el que se invoque automáticamente cada vez que escribamos código del tipo:

dim variableTexto as string = miPropiedad

Mientras que el método Set será el que se invoque automáticamente cada vez que definamos un nuevo valor para la propiedad mediante código del tipo:

miPropiedad = MiCampoDeTexto.text

Sin embargo, si intentásemos ejecutar un código así obtendríamos sendos errores durante el proceso de compilación. ¡No existe la propiedad propiamente dicha! Es decir, al crear una Propiedad Calculada de esta forma habremos construido el “armazón”, pero falta el contenedor real encargado de almacenar la información tratada por ambos métodos. Esto es algo que resulta bastante fácil de solucionar: cuestión de añadir una nueva propiedad y definir su ámbito (Scope) como privado, evitando así que pueda ser accedida directamente desde cualquier objeto. La única forma de hacerlo será utilizando la Propiedad Calculada creada previamente.

De hecho, una forma de ver más claramente dicha relación entre la propiedad estándar y la Propiedad Calculada consiste en realizar el proceso a la inversa. Prueba a crear una nueva propieda y, a continuación, selecciónala en el Navegador de Proyecto, accede al menú contextual y selecciona la opción Convert to Computed Property, tal y como se muestra en la siguiente imagen:

Convertir Propiedad en Propiedad Calculada

Como resultado comprobarás que el IDE de Xojo no sólo habrá creado la estructura que hemos visto previamente y que conservará el nombre original de la propiedad creada, sino que también habrá modificado el nombre de la propiedad en cuestión, añadiendo una “m” al inicio de la misma, y habrá modificado su ámbito para que sea de tipo Privado.

La utilidad tras el Setter y el Getter

Más allá de una mera cuestión cosmética de sintaxis, la verdadera utilidad de las propiedades calculadas en comparación con las propiedades normales está en el código que podemos escribir en ambos métodos, y que será el que se ejecute antes de que se devuelva el valor o bien antes de guardarlo como resultado de una nueva asignación.

Continuando con nuestro ejemplo, y si estuviésemos utilizando la propiedad para guardar un nombre, podríamos utilizar entonces el Setter de dicha propiedad para proporcionar un valor por defecto en el caso de que se hubiese recibido una cadena vacía durante la asignación:

Set (Value As String)
If Value = "" then mMiPropiedad = "Nuevo Usuario"

Mientras que, por otra parte, podríamos emplear el Getter de la propiedad para devolver el valor asociado con un formato determinado. En nuestro caso podría ser, por ejemplo, asegurarnos de devolver el nombre con la inicial de cada palabra en mayúscula (algo que podríamos haber hecho también perfectamente en el Setter, pero ten en cuenta que se trata simplemente de ilustrar su uso).

Get As String
Return mMiPropiedad.Titlecase

Sobrecarga de métodos

Pero la realidad tras las Propiedades Calculadas es que ¡siempre estuvieron disponibles en todas las ediciones Xojo! Es decir, lo que el IDE de Xojo nos proporciona no es más que una comodidad tanto a la hora de crear la infraestructura interna de métodos que vemos al inspeccionar este tipo de propiedades, así como la definición del tipo y ámbito mediante el panel Inspector.

Lo cierto es que siempre se pudo llegar al mismo resultado (y aun se puede) mediante una capacidad disponible en cualquier lenguaje de programación orientado a objetos, tal y como es el caso de Xojo: la sobrecarga de métodos.

Se conoce como sobrecarga de métodos la capacidad de definir múltiples métodos con el mismo nombre siempre y cuando varíe su signatura; es decir, la cantidad y/o tipo de parámetros recibidos y/o valor devuelto por el método. Así, si en una anterior entrada del blog ya se vio esta capacidad aplicada a los Operadores en Xojo, ahora veremos como podemos llegar a los mismos resultados de un Getter y un Setter en combinación con una propiedad utilizando la sobrecarga de métodos.

Empieza creando una nueva propiedad mediante, por ejemplo, Insert > Property. Define su tipo al deseado (String para este ejemplo) y el ámbito (Scope) como Privado (Private). Eso sí, asegúrate de que que añadir una “m” o cualquier otro caracter de tu elección al nombre que quieras usar para la propiedad, si bien se suele utilizar la letra “m” por convención.

Ahora crearemos nuestro método Setter. Para ello utiliza Insert > Method sobre el mismo elemento del proyecto sobre el que hayas creado la propiedad. Nombra el método con el nombre de la propiedad (sin la “m”) y utiliza lo siguiente en el campo Parameters:

Assigns Value as String

El campo Return Type (tipo devuelto por el método) quedará vacío y el ámbito será Público (Public).

La palabra clave Assigns nos proporciona la comodidad sintáctica de utilizar el símbolo de igualdad (“=”) a la hora de asignar el valor del parámetro cuando llamemos al método. Así, si nuestro método se llama “miPropiedad”, podremos invocarlo de la siguiente forma:

miPropiedad = "Nuevo valor"

¿A que no parece que estemos llamando a un método sino realizando una asignación a una Propiedad?

Ahora vamos a encargarnos de definir el método que hará las funciones de Getter y para ello volveremos a repetir la operación de añadir un nuevo método sobre el mismo elemento que contiene la propiedad, utilizando en este caso también ¡el mismo nombre que el empleado con el método anterior! Cuando lo hagas, verás que el Navegador de proyecto pasa a incluir ambos métodos bajo una jerarquía común. En este caso, como se trata del Getter, no hará falta definir ningún parámetro, simplemente indicar el tipo devuelto (String, en nuestro caso).

Así es como se verá en el Navegador de Proyecto:

Sobrecarga de métodos en Xojo.

Como indicaba anteriormente, la sobrecarga de métodos es posible porque si bien usan el mismo nombre, el compilador sabrá en todo momento cuál de ellos ha de invocar basándose en la cantidad y/o tipo de los parámetros recibidos y/o tipo devuelto.

¡Listo! Has podido ver qué son las Propiedades Calculadas y qué es lo que sucede realmente desde la perspectiva de la Programación Orientada a Objetos.

¡Recuerda que esto y mucho más es lo que puedes aprender, desde cero y de forma progresiva, en mi libro electrónico “Programación Multiplataforma Xojo“!


Un comentario en “Sobrecarga de métodos: Propiedades Calculadas, Setters y Getters

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *