Objetive-C, un lenguaje dinámico

Si programamos para Mac o iPhone, seguramente el lenguaje que usaremos será Objetive-C. Muchas veces no reparamos en lo diferente que es este lenguaje de otros como C o Java.

Sin duda, el primer aspecto diferenciador es la sintaxis. Tanto en C, C++ o Java, estamos acostumbrados a invocar a los métodos de los objetos usando un “.”, en objetive c esto es bastante diferente. Quizá os habreis preguntado el porque de esta sintaxis, o quizá solo pensabais que era una sintaxis más, sin embargo, hay unas razones en ese comportamiento. Pero no vamos a adelantar acontencimientos🙂

Objetive-C fue creado principalmente por Brad Cox and Tom Love ayá por los años 80, su principal intención era añadir caracteristicas del lenguaje Smalltalk al C tradicional.

Smalltalk por su parte fue creado en los años 70, y pese a su antiguedad fue de los primeros lenguajes que aplicaban mas profundamente la teoria de orientación a objetos. De hecho, aún hoy en día se sigue usando como modelo de enseñanza de este paradigma de programación.

Si queremos citar alguna de las caracteristicas que le destacaban como abanderado de la orientación a objetos podemos mencionar cosas como la instrospeccion de la que Smalltalk-80 podía alardear, o el paso de mensajes como forma de comunicación entre objetos.

Además en Smalltalk todo era un objeto, no existía los tipos básicos. Cualquier “integer” era a su vez un objeto al que se le podían enviar mensajes.

Volviendo a Objetive-C, estas son las caracteristicas que Cox y Love incorporaron, haciendo un lenguaje bastante diferente a los otros que estamos acostumbrados a usar.

Una de las cosas mas importantes donde se diferencia Objetive-C, y de la que vamos a hablar en el post, es en el dinamismo. Cuando hablamos de dinamismo nos estamos refiriendo a la forma de invocar los métodos, o mas correctamente, la forma de enviar mensajes a instancias.

Si nos fijamos, la sintaxis de Objetive C (heredada de Smalltalk) elimina el “.”, esto nos esta indicando que cuando estamos enviando un mensaje a un objeto, no exigimos en tiempo de compilación que el mensaje exista. Es decir, en Java, si llamamos a un método, dicho método debe existir durante la compilación, o esta fallará, en Objetive-C, esta comprobación no se hace más que para enseñar un warning.

Veamos un ejemplo.

// JAVA
// Definicion
...
int suma (int operando1, int operando2)
...

// Llamada
MiObjeto.suma(4, 5)
MiObjeto.resta(3, 2) // Fallo de compilacion, resta no existe

// Objetive-C
// Definicion
...
(int) sumaConOperando1:(int) op1 operando2:(int) op2
...

// Llamada
[MiObjeto sumaConOperando1:4 operando2:5]
[MiObjeto restaOperando1:3 operando2:2] // Compila OK, se lanza una excepcion al ejecutarse

Si MiObjeto no define el método, en Java no llegará a compilarse, en el caso de Objetive-C decimos que la clase no responde al mensaje, y el fallo se provocará en la ejecución.

Este detalle aporta un dinamismo a Objetive-C, que es dificil de encontrar en otro lenguaje compilado (excluimos los lenguajes de script).

A priori, puede parecer un impedimento, sin duda la mejor forma de evitar los errores es que se detecten antes de la ejecución, pero este comportamiento abre una nueva posibilidad a la hora de crear nuestro diseño de clases.

Cuando mandamos un mensaje a un objeto, dinamicamente se comprueba si este objeto puede responder a este mensaje, si no puede, se puede enviar este mensaje a otro objeto de la jerarquía, si nadie responde a ese mensaje, se lanzará la excepcion. Excepción que puede ser capturada sin que llegue a dañar a la ejecución. Además, es posible enviar el mismo mensaje a un grupo de objetos, de una forma que es difícil hacer en Java o C. Por ejemplo, podríamos iterar por una colección de objetos y, visto desde el punto de vista de Java, llamar a un mismo método de todos los objetos.

Este comportamiento es ampliamente usado en Cocoa, como por ejemplo cuando una aplicación se inicia, se les envia un mensaje de inicialización a todos los objetos que forman nuestra aplicación. Mensaje al que podemos responder, o no. Sin que este hecho, suponga un fallo en la aplicación. O por ejemplo, en la forma de implementar el mecanismo de Target-Action, del que ya hablamos en este post.

Sin embargo, todo este dinamismo tiene un precio, de esta manera, invocar un metodo en C++ es bastante mas rápido que enviar un mensaje en Objetive-C, ya que como se puede suponer, encontrar la dirección de memoria donde esta la función en C, es mucho más rápido que el mecanismo de paso de mensajes.

Desde el punto de vista del código, lo métodos se pueden manejar con lo que se conoce como “Selectors”, de esta manera el mensaje suma del que hablabamos antes se puede identificar como: “@selector(sumaConOperando1:operando2:)“.

Dentro de la clase NSObject existen numerosos mensajes que nos pueden ayudar a realizar tareas con selectors.

Por ejemplo con “performSelector“, podemos enviar el mensaje de la misma manera que lo hacemos por el nombre de la función. Por lo que, al ser el selector una “variable” podemos asignarla de forma dinámica, y así, decidir en tiempo de ejecución cual es el mensaje que vamos a enviar.

Ademas de “performSelector“, sin duda el mensaje más util de NSObjet es “respondsToSelector“, que nos va a decir si un objeto en concreto responde a un mensaje o no, de tal manera que nos podemos evitar el llamarlo, si sabemos que no va a responder.

Aparte de esta característica tan importante y central del lenguaje, Objetive-C se diferencia en muchas otras cosas de los lenguajes “tradicionales”, que perfectamente, pueden ser objetivo de otros posts.🙂

3 respuestas a Objetive-C, un lenguaje dinámico

  1. Tyflos dice:

    Un artículo muy interesante. Yo vengo de lenguajes como Pascal y C y me sorprendo gratamente de características de Objetive-C muy útiles aunque aún me cuesta comprender conceptos como la delegación, categorías o la introspección, aunque sigo intentándo usar esas características en lugar de adaptar mi antiguo modelo de programación, propio de C y Pascal, a la sintáxis de Objetive-C. Estaría bien una serie de artículos sobre este punto de vista utilizado por Cocoa y Objetive-C de delegados y demás. Ya he leído tu artículo de categorías y me ha ayudado mucho. Como siempre, sigue así

    • robjperez dice:

      Gracias por estar ahi🙂

      La verdad es que Objetive-C me enctanta, tiene funcionalidades muy interesantes, y la forma de programación es una mezcla entre alto y bajo nivel.

      Me apunto tu sugerencia para futuras entradas del blog🙂

  2. […] un poco con el tema del anterior post, en esta entrada vamos a ver como podemos cargar una clase de forma dinámica usando principalmente […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: