Probando clases ObjetiveC usando MacRuby

Sin duda una de las cosas que siempre me ha gustado tener a mano es una manera de probar código sin tener que crear todo un proyecto para ello. Hace mucho tiempo, cuando usaba Java como mi principal lenguaje de programación, usaba Beanshell, que ademas de ser un lenguaje de scripting ofrece una consola que interpreta código en java en tiempo real.

Por aquel tiempo, si quería probar, por ejemplo, como sacar una subcadena a partir de un carácter dado, podía ir probando con las diferentes combinaciones en la consola de Beanshell. La alternativa era construirse todo un proyecto solo para probar como deberías hacer el substring correcto, proyecto que había que compilar y ejecutar para ver los resultados. Sin duda el hecho de usar una consola que te daba los resultados inmediatos era una gran ventaja.

Mas adelante, y con algunas aventuras en python o ruby, la existencia de la consola para probar código venia de serie con la plataforma. Así si queremos probar un pequeño fragmento de código Ruby, podemos arrancar el irb y escribirlo tal cual.

Hoy en día, en mis aventuras por Objetive-C, echaba de menos esta funcionalidad. Esta claro que al ser Objective-C un lenguaje compilado, a priori es complicado tener un programa que haga esto, pero es aquí donde encaja esa maravilla llamada MacRuby🙂

Dado a que, usando MacRuby, podemos acceder a todas las clases definidas en los frameworks de OSX sin importar en que lenguaje estén definidas, vamos a poder usar el irb para poder probar esas clases de Cocoa que usamos habitualmente.

Vamos a ver un ejemplo:

Supongamos que tenemos una cadena de la forma “clave=valor;clave2=valor2″” y queremos transformarla en un diccionario que almacene esta información.

Para ello, necesitamos manipular la clase NSString, sin duda una alternativa sería escribir el código (siempre después de los test, claro😉 ), e ir probando. Pero siempre surgen algunas dudas, como por ejemplo, el IndexOf de NSString, ¿esta basado en 0?, si hago un substring con inicio en la posición 3, ¿incluye el tercer carácter?

Estas dudas, harán posiblemente que el código que escribamos la primera vez, falle.

La alternativa es arrancar macirb, y jugar directamente con la clase NSString. Por ejemplo si ejecutamos lo siguiente:

irb(main):010:0> "clave=valor;clave2=valor2".componentsSeparatedByString(";")
=> ["clave=valor", "clave2=valor2"]

Veremos que el mensaje “componentsSeparatedByString”, funciona como esperábamos. Pero no solo eso, vemos que también podíamos aplicar lo mismo a cada elemento para obtener cada clave y cada valor:

irb(main):012:0> "clave=valor;clave2=valor2".componentsSeparatedByString(";").each { |x| p x.componentsSeparatedByString("=") }
["clave", "valor"]
["clave2", "valor2"]
=> ["clave=valor", "clave2=valor2"]

Como vemos, la comodidad que ofrece el probar código solo con teclearlo directamente en la consola es tremendamente util para reducir muchos ciclos de compilar (o ejecutar test) y ver como vuelve a fallar.

La “magia” de MacRuby no acaba aquí, como hemos dicho antes, podemos llamar a cualquier clase de Cocoa, por lo que si probamos el siguiente código:

irb(main):006:0> framework 'Cocoa'
irb(main):007:0> sp = NSSpeechSynthesizer.alloc.initWithVoice nil
=> #<NSSpeechSynthesizer:0x2005293e0>
irb(main):008:0> sp.startSpeakingString "hello from macruby. This is so cool!"
=> true

Nuestro mac empezará a hablar.😀

Como veis, la única regla a seguir es en vez de utilizar la sintaxis típica de objetive c para enviar mensajes, debemos utilizar la notación habitual con el “.”. Aunque si esto nos incomoda, siempre podemos seguir usando mensajes gracias al método “send” de Ruby, y de esta manera ejecutar el anterior código como:

irb(main):010:0> sp.send :startSpeakingString, "hello from macruby. This is so cool!"

La interoperabilidad Ruby Cocoa abre todo un mundo de posibilidades, ¿Alguien ha dicho algo sobre RSpec para probar clases hechas en ObjectiveC?. En cualquier caso, son unos interesantes temas para otras entradas del blog.

Una respuesta a Probando clases ObjetiveC usando MacRuby

  1. Pedro dice:

    Muy interesante lo de usar una consola para probar cosas online sobre un lenguaje compilado. La verdad es que es lo que me gusta de los lenguajes de scripting, pero nunca se me había ocurrido que esto se podía hacer también en lenguajes compilados.

    En mi caso probaré lo que comentas de usar el Beanshell, si lo he entendido bien podría probar cosas de java directamente en la consola usando Beanshell ¿incluso hacer un breakpoint en mi código Java y probar cosas en medio de la ejecución con Beanshell?

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: