16 de octubre de 2009

El Paradigma OOP (Parte 2)

En la entrada anterior finalizé haciendo referencia al lenguaje de programación SmallTalk. En esta entrada continuaré con el tema que venía desarrollando.


Así como Pascal fué en su momento, el paradigma de la programación estructurada ( Algoritmos + Estructuras de Datos = Programas). Smalltalk ha sido hasta ahora el paradigma de la programación orientada a objetos.


Otros lenguajes tales como C++, Java y Object Pascal, no son realmente orientados a objetos en toda la extensión de la palabra; son mas bien lenguajes híbridos, lenguajes procedurales con algunas extensiones que permiten programar con objetos, pero nada que ver con la orientación a objetos pura y real de Smalltalk, en donde incluso un bloque de código es un objeto, y como tal tiene un protocolo de mensajes definido. Vaya, incluso lo que en los lenguajes procedurales conocemos como "estructuras de control", en Smalltalk son mensajes y sus parámetros son bloques de código. Nada que ver con los lenguajes procedurales híbridos, esto en sí mismo representa una forma radicalmente distinta de ver el código.


Así pues, fué que reconociendo mi ignorancia y por tanto mis carencias y necesidades, decidí que fuera precisamente Smalltalk quien me sacara del paradigma de la programación procedural y me enseñara el verdadero paradigma de la programación orientada a objetos.


Comencé entonces a hacer mis primeros pininos en Smalltalk y me sorprendió muy gratamente.
De entrada transcribí mi programa mascota "NomEdad" un programita sumamente simple que pide una cadena y un número y despliega como resultado una suma en un letrero.


La versión en Java de este programita es la siguiente:

/* nomedad.java */
import java.io.*;
class nomedad {
    public static void main (String[] args) throws IOException {
        Integer   edad;
        String   strnombre;
        BufferedReader   brin;
        int   n;
        /* Inicialización */
        brin = new BufferedReader(new
InputStreamReader(System.in));
        /* Comienza rutina principal */
        System.out.print("Hola, ¿Cuál es tu nombre? ");
        strnombre = new String(brin.readLine());
        System.out.print("¿En que año naciste? ");
        edad = new Integer(brin.readLine());
        n = 2006 - edad.intValue();
        System.out.print("Hola, ");
        System.out.println(strnombre);
        System.out.print("En el año 2006 tendrás ");
        System.out.print(n);
        System.out.println(" años");
    }
}

Pues bien este programita que al escribirlo en Java por primera vez me causó algunos dolores de cabeza debido a las sutilezas del lenguaje, que copia la sintaxis de C pero no necesariamente su semántica, debido a que las variables se crean pero no se inicializan, debido a que el Standard Output si puede usarse directamente pero el Standard Input no, debido a la sintaxis para declarar excepciones y debido a otras linduras tales como el kilométrico import ...bla bla bla... class ... bla bla ba ... public static void main ( String [] args ) throws ...bla bla bla... etc, etc. (Años después sufriría yo igual o peor con Visual Basic .NET y toda su verborrea).

Este mismo programa en Smalltalk ( Squeak) lo pude escribir en poco más de cinco líneas de código claro, legible y entendible:

"nomedad.st"
| nombre edad |
    nombre := FillInTheBlank request:'Hola, ¿Cual es tu nombre?'.
    edad := FillInTheBlank request:'¿En que año naciste?'.
    edad := 2006 - (edad asInteger).
    Transcript show:'Hola '; show: nombre; cr.
    Transcript show:'En el año 2006 tendras '; show: edad; show:'
años'; cr.

¡¡Que gran diferencia!! ¡¡Solo seis líneas de código, claro y entendible !!.

Esto a pesar de no ser necesariamente Smalltalk idiomático.


Es impresionante saber que en 1980, Smalltalk ya tenía su propia máquina virtual, su propio byte-code, compilador JIT, entorno de programación IDE, ambiente gráfico, implementación del patrón de diseño Model-View-Controller (MVC), entre otras cosas. Elementos que mas de diez años después se venderían como "innovaciones" por parte de Sun con Java y más de veinte años después por parte de Micro$oft con .NET (quien por cierto apenas está logrando cuajar bien su implementación del MVC).


Esta primera aproximación nos muestra ya algunas características del lenguaje Smalltalk que son importantes para entender el paradigma que nos ocupa de las cuales seguiremos escribiendo en nuestro siguiente post.


4 comentarios:

  1. Fíjate como incluso en la versión Java del programa (lenguaje híbrido como mencionas) se ve claramente la influencia de Pascal en la manera en la que está estructurado el código.

    Creo que esto es muy revelador, pues este "Jascal" que transcribes en tu post, muestra la necesidad real de marcar una linea bien definida entre le "antes" y el "después". Es muy revelador el hecho que hayas sentido esa necesidad, pues una de las cosas que más daño han hecho a la comprensión del paradigma OO es el hecho de tomarlo como una "extensión" de los paradigmas anteriores.

    Una de las habilidades básicas de todo desarrollador es la de aprender con rapidez... otra igual de importante a la que no se le da ni remotamente la misma atención es la capacidad de "des-aprender"... por eso habemos quienes aún codificamos en COBOL sin importar qué lenguaje estemos usando.

    ResponderEliminar
  2. Se me hace muy despectivo el que te refieras a "Micro$oft" de esa forma.

    Se ve a leguas que no te interesa llegar a ser MVP. Es una lástima porque siempre es necesario tener buenas referencias aplicadas a los lenguajes de .net ya que mientras que Java y otros lenguajes gozan de una larga historia de proyectos y personas dedicadas a su mejora continua, .net parece que sigue dependiendo mayormente de la benevolencia de microsoft.

    Y claro está, ms creó el programa MVP para aquellos miembros de la comunidad que hagan aportaciones importantes, más allá de lo que microsoft mismo ha construido y/o recomendado... mucho ojo

    ResponderEliminar
  3. Horacio:

    Creo que lo comenté anteriormente y si no es así, lo hago ahora: este blog pretende ser "languaje/platform agnostic". Si bien los que integramos el equipo detrás del blog tenemos nuestras preferencias personales sobre Windows/Linux/MacOS, .NET/Java, etc., tratamos que los temas que abordamos sean de interés general para cualquier programador.

    De lo que se trata es de aumentar nuestra cultura colectiva y creo que eso implica que todos podemos aprender de todos.

    Claro, los que aquí escribimos hemos trabajado (y mucho) con la plataforma de Microsoft y hemos tenido buenas y malas experiencias al respecto y de eso se trata justamente este blog: de comentar lo que hemos aprendido con los años. Con el tiempo, creo que será inevitable que comentemos cosas que hemos hecho en dicha plataforma y si al hacerlo alguien más aprende algo, ¡grandioso! Si Microsoft decide que somos candidatos a un MVP, ¡fantástico! Si no, pues lástima, pero creo que ese no es finalmente nuestro objetivo.

    Creo que es difícil poder evitar algún que otro flame de vez en cuando, al fin y al cabo todos somos humanos.

    Saludos y gracias por tu visita.

    ResponderEliminar
  4. Hola Horacio:

    Antes que nada gracias por tu visita y por tus comentarios.

    Quiero aclarar que no tengo nada personal contra los usuarios de Microsoft y que no ha sido mi intención el herir susceptibilidades.

    En cuanto a las referencias con tecnología .NET tal vez cuando lleguemos a la discusión sobre patrones
    de diseño de acceso a datos pondremos algunos ejemplos de código en VB.NET o en C#. Sin embargo para la discusión de los fundamentos y de los primeros principios estos lenguajes no se me hacen lo suficientemente pedagógicos por las razones que expliqué en la misma entrada. E.d. son lenguajes procedurales híbridos (tal como Java, C++ y Delphi/ObjectPascal) y esto no tiene nada que ver
    con que sean de Microsoft o no.

    Tal vez te parezca bastante despectiva la forma en que me refiero a Microsoft. Sin embargo, dime ¿Cómo calificarías tu los términos de "cancer", "comunista", "anti-americano", etc, con los que Microsoft se ha venido refiriendo a mi comunidad desde hace varios años?
    Además de sus constantes ataques y amenazas hacia mi comunidad por el simple hecho de existir y de representar un paradigma distinto al que ellos han querido imponer a todo el mundo (por la fuerza) durante muchos años.
    Las comunidades se caracterizan por sus valores compartidos. A Microsoft la única comunidad que le interesa es aquella donde solamente existan ellos.
    Pero bueno, eso es materia de otros blogs y de otros comentarios.

    En cuanto a lo del "MVP" tienes toda la razón.
    Personalmente valoro más la educación formal que los reconocimientos de Microsoft.
    Fuera de los empleados y socios de Microsoft no veo a quién mas pudiera interesarle el ser un "MVP".
    A mí no. Ni soy empleado de Microsoft ni ellos ni sus productos me dan de comer.
    Los objetivos de este blog son otros. De otra forma lo hubiéramos puesto en MSDN o en algún otro sitio afín.

    Si tienes alguna inquietud en específico o quisieras que escribiéramos/compartiéramos de algún punto en particular de Programación Orientada a Objetos con .NET, agradeceríamos mucho que nos lo hicieras saaber.

    Sin mas por el momento me despido de tí agradeciéndote nuevamente por tu visita y tus comentarios.

    Saludos Cordiales.

    ResponderEliminar