29 de noviembre de 2009

El Paradigma OOP (Parte 3)

Después de algunas semanas en las cuales tuvimos varios contratiempos incluidos uno que otro "bomberazo" no raros por desgracia en la vida de un programador profesional. Y después de finalizar también este fin de semana una migración y actualización del sistema operativo de mi computadora a mi sistema operativo favorito (Debian GNU/Linux). Ahhh... ¡por fin! me siento nuevamente como en casa :-)...feliz de poder estar usando nuevamente Debian mientras escribo estas líneas.

Pero bueno, paulo majora canamus ... entremos en la materia que nos ocupa en este blog. En la entrada anterior terminamos mostrando un pequeño programa en Squeak Smalltalk comparándolo con la versión en java del mismo programa. Alguien dirá que siendo Squeak un entorno gráfico la comparación contra el programa de línea de comandos "nomedad.java" transcrito en la entrada anterior no sería completamente adecuada.

Pues bien, a continuación transcribo la versión para línea de comandos en GNU-Smalltalk del programita en cuestión

"nomedad.st"
| nombre edad |
Transcript show: 'Hola, ¿Cual es tu  nombre? '.
nombre := stdin nextLine.
Transcript show: '¿En que año naciste? '.
edad := (stdin nextLine) asInteger.
edad := 2010 - edad.
Transcript show: 'Hola '; show: nombre; cr;
          show: 'En el año 2010 tendrás ';
          show: edad printString;
          show: ' años.'; cr.
!

Como se puede apreciar, esta versión de línea de comandos comparada con la versión anterior gráfica ¡¡no cambió casi en nada!!.

Mencionábamos que en esta primera aproximación a Smalltalk, pueden apreciarse algunas características del lenguaje que son muy importantes para entender el paradigma de programación que nos ocupa en este blog. Veamos cuáles son algunas de ellas.

  1. La primera es desde luego que Smalltalk hace honor a su nombre y es un lenguaje breve y conciso, sin verborrea ("small") en pocas palabras y como decía Alfredo en su post anterior, es un lenguaje terso. Smalltalk es un lenguaje muy simple y es fácil de aprender. Solamente tiene cinco palabras reservadas (super, self, true, false, nil) y solamente hay unos pocos principios básicos que el usuario tiene que saber para poder utilizar el lenguaje. Además, como veremos la sintaxis de Smalltalk es parecida al lenguaje natural.

  2. Lo que vendría siendo nuestra declaración de variables

    | nombre edad |
    que en un lenguaje híbrido/procedural tendrían que ir acompañadas de su declaración de tipo, aquí en Smalltalk solamente necesitan declararse sus nombres. Esto se debe a que en Smalltalk como seguiremos viendo más adelante, todo, absolutamente todo es un objeto (números, cadenas, etc. vaya hasta el código mismo) por lo tanto cuando se declara una variable simplemente se está declarando una referencia a un objeto, y no importa si esta referencia tendrá valores numéricos, de caracteres, será un arreglo, etc. Para Smalltalk es un objeto y punto. No necesitamos saber de antemano el tipo del mismo para poder trabajar con él, ya veremos porqué.

  3. En Smalltalk las instrucciones se construyen como una serie de mensajes que se envían a los diferentes objetos del programa para que hagan alguna tarea específica. Tomemos como ejemplo la primera línea del programa después de la declaración de las variables:

         Transcript show: 'Hola, ¿Cual es tu nombre? '.
       
    Aquí le estamos enviando al objeto Transcript el mensaje show: (o #show: en Smalltalk idiomático ya veremos porqué) el cual a su vez requiere un objeto String (mas propiamente dicho una instancia de la clase String) que en este caso es el letrero 'Hola, ¿Cual es tu nombre? '. Tanto en Smalltalk como en Pascal las cadenas se delimitan con comillas simples. Y el punto al final del renglón significa el fin del mensaje.

Este último concepto de los mensajes queridos amigos y lectores es de las ideas mas fundamentales (en mi caso fue la más fundamental de todas) para poder entender a cabalidad el paradigma de programación orientado a objetos. Y es que no, no y tres veces no, no es lo mismo y nunca será lo mismo enviar un mensaje que "invocar un método". Esta distinción conceptual y semántica tiene profundas implicaciones.

Los métodos en los lenguajes híbridos procedurales se han implementado como llamadas a procedimientos y funciones. Esto dificulta todavía mas la comprensión del paradigma original.

Sobre el concepto de los mensajes haremos a continuación algunas definiciones muy importantes.

Al conjunto de mensajes que un objeto es capaz de entender y responder se le denomina su protocolo. Este protocolo de mensajes de un objeto es a lo que en otros lenguajes como Java se le denomina una "interfaz" (interface). Ya antes mencionábamos que no necesitamos saber de antemano el tipo de los objetos que vamos a usar y esto es porque lo realmente importante es que los objetos que utilicemos se conformen al protocolo de mensajes que les vamos a enviar, esto es: que entiendan y respondan al los mensajes que les vamos a mandar. El protocolo de mensajes es lo que define las características y el comportamiento (responsabilidades) de los objetos. A la descripción de un conjunto de objetos con protocolos similares se le denomina Clase. Y a un elemento del conjunto de objetos descrito por una Clase se le denomina Instancia.

Esta es una definición mucho mejor y mas acertada que aquella que varios de nosotros aprendimos (o mas bien sufrimos) cuando estudiantes cuando se nos dijo que "una clase era a un tipo lo que una variable a una instancia". No mucho que ver. La analogía solo es aparente pues como veremos después las clases a su vez también son instancias de sus meta-clases y existen tanto protocolos de clase como protocolos de instancia. Valga decir que ésta última definición en su momento fue un obstáculo mas en nuestro camino hacia la comprensión del verdadero paradigma.

Queridos amigos y lectores el tiempo y el espacio se nos han agotado el día de hoy. Continuaremos escribiendo más sobre este tema en nuestra siguiente entrega.

Espero sus comentarios. Saludos.