Las mentiras de los paradigmas

Fabian Mosso Chavez
Trebol IT
Published in
4 min readJun 1, 2020

Todos los programadores, al leer sobre algún lenguaje de programación, por lo general, se topan con descripciones del siguiente estilo:

  • Java es orientado a objeto
  • C es imperativo
  • Python es multiparadigma

Pero, ¿qué es un paradigma? Tomemos como ejemplo el “paradigma” orientado a objetos, partamos analizando el siguiente bloque de código Java:

class Point {    public int x;    public int y;    public Point(int x, int y){        this.x = x;        this.y = y;    }    public void movePoint(int newx, int newy){        this.x = newx;        this.y = newy;    }}Point p = new Point(1,3);p.movePoint(4,5);

En el código anterior definimos la clase Point, que representa un punto en 2 dimensiones. La clase tiene el parámetro x, el parámetro y, y el método movePoint, que mueve el punto a una nueva posición. Además de definir la clase Point, “instanciamos” un punto y llamamos a método movePoint.

Ahora veamos cómo se definiría este mismo código en otro lenguaje orientado a objetos, como C# :

class Point{    public int x;    public int y;    public Point(int x, int y)    {        this.x = x;        this.y = y;    }    public void movePoint(int newx, int newy)    {        this.x = newx;        this.y = newy;    }}Point p = new Point(1,3);p.movePoint(4,5);

Podemos apreciar que el código es muy similar con el anterior. Cuando agrupamos por paradigma, estamos agrupando por similitud, ambos códigos se parecen: tienen clases, tienen modificadores de visibilidad, los objetos se instancian con la palabra reservada new, etc.

Los paradigma son útiles, porque permiten darle al programador una idea de cómo es un lenguaje. Pero, a pesar que sean útiles, no son precisos. ¿Exactamente qué significa el “Paradigma orientado a objetos”?

Consideremos un tercer lenguaje que también pertenece a este paradigma, Javascript:

var Point = function(x,y) {    this.x = x;    this.y = y;};Point.prototype.movePoint = function(newx, bewy) {    this.x = newx;    this.y = newy;};var p = new Point(1,2);p.movePoint(4,5);

En este caso, no utilizamos clases para instanciar el objeto punto, creamos el objeto directamente utilizando prototipo y luego modificamos el prototipo agregándole el método movePoint.

El concepto de prototipos aparece en javascript, pero no en Java ni C#, a pesar que los 3 lenguajes pertenecen al mismo paradigma.

Cuando pensamos en orientado a objetos, pensamos que vamos a poder utilizar objetos, asignarlos a variables, pero ¿son necesarias las clases? ¿y los prototipos? Existen lenguajes como Smalltalk o Scala donde todo, hasta los números son objetos, en cambio Java permite la existencia de primitivas, que no son objetos ¿esto hace menos orientado a objeto a Java v/s los otros lenguajes?.

No existen respuesta a las preguntas anteriores, decir que un lenguaje es de cierto paradigma da cierta idea de cómo es el lenguaje, pero esta categorización no entrega información de las características del lenguaje, sobre lo que es posible expresar o no. Por lo tanto, es necesario utilizar un mejor concepto que ‘paradigma’.

En búsqueda de una mejor descripción.

Robert Harper [1] argumenta que clasificar a los lenguajes de programación según paradigma es como clasificar animales según su morfología (apariencia). Los biólogos se dieron cuenta hace tiempo que clasificar según morfología es impreciso. Un ejemplo típico de esta clasificación son las zebras. Las zebras y los caballos se parecen mucho, pero del punto del vista genético, un humano tiene mas en común con un chimpancé que una zebra con un caballo [2].

En ves de mirar la apariencia, veamos a los ciudadanos de primera clase [3], o también llamado valores. Lo que caracteriza a los valores, es qué estos pueden ser asignados a variables, pueden ser argumento de funciones, o pueden ser el retorno de funciones, entre otras características dentro del lenguaje.

Por ejemplo, en general los números son de primera clase se puede pasar números como argumentos a funciones, y estas pueden retornar números.

En cambio, los punteros son de primera clases solo en algunos lenguajes como C o Rust, lo que permite en estos lenguajes, tener un manejo mas preciso de la memoria utilizada.

En Java las clases no son valores, no es posible asignar una clase a una variable o definir una función que retorne una clase.

Class returnClass(boolean b){   if(b){       return Point;   } else{      return Object;   }}Object o = new returnClass(true) (1,2)

El código anterior no es válido en Java.

Saber qué elementos son valores o no en el lenguaje, nos permite conocer lo que es posible, o no, expresar en el lenguaje.

Síguenos en LinkedIn y Facebook para leer todos nuestros artículos y tips e ingresa en nuestro sitio web para conocer más de nosotros o unirte a nuestro equipo.

[1]: https://www.cs.cmu.edu/~rwh/papers/paradigms/paradigm.pdf
[2]: Primate Origins of Human Cognition and Behavior
[3]: https://en.wikipedia.org/wiki/First-class_citizen

--

--