lunes, 16 de mayo de 2016

Platón, Aristóteles y la Orientación a Objetos





Una de las grandes ventajas que tiene ser el primero en algo es que eres original, sé que esto es una perogrullada pero no deja de ser verdad, de Pero Grullo pero verdad al fin y al cabo. Algo así les ocurrió a los filósofos de la antigua Grecia quienes fueron los primeros que trataron sistemáticamente los principales temas que han preocupado de siempre a la humanidad, puede que hubiera otros filósofos antes de ellos pero sus testimonios no han llegado hasta nosotros. Otros vinieron después que copiaron, ampliaron e iniciaron nuevos caminos, pero la base del pensamiento actual está allí, en la Grecia clásica, sobre esos cimientos se construyó a lo largo de los siglos el edificio de nuestro conocimiento.

De hecho, en este ejercicio de redacción que acometo imprudentemente, lo que pretendo es describir cómo un paradigma de la ingeniería del software (1) desarrollado a finales del siglo XX bebe en las fuentes de la filosofía que se hacía veinticuatro siglos antes.

Uno de estos personajes originales fue Platón (2), aunque ya había una tradición filosófica importante cuando empezó a filosofar, podemos considerarle bastante original. El núcleo de la filosofía platónica a través del cual se articula todo su pensamiento y que, al mismo tiempo, representa su principal aportación a la historia del saber, es la teoría de las ideas.

La formulación de la teoría, en su forma más básica, nos lleva a distinguir entre dos realidades. La realidad tangible y la realidad sensible

La primera está constituida por las ideas – de “eidos” que significa literalmente “aspecto” o “figura” – que son inmateriales, eternas y ajenas a cualquier cambio o modificación. La segunda lo constituyen lo que solemos llamar “cosas” y, por tanto, está formada por todo aquello que es material, finito, corruptible o modificable.

Un ejemplo que pone el profesor Antonio Escohotado (3) es el de una puerta. Si pienso en una puerta puedo representármela con tales o cuales características – grande, pequeña, verde o azul, de madera o de cristal -, recordada, imaginada, o percibida directamente porque la estoy viendo delante de mí. Pero además de esto hay una abertura en la pared. La puerta es puerta porque son aberturas en la pared, que constituye algo universal y no se agota en ninguno de sus ejemplos. Platón decía que una idea existe cuando damos el mismo nombre a muchas cosas separadas.

Uno podría pensar entonces que las ideas residen en nuestra mente y son meras representaciones de los objetos que podemos tocar con nuestros sentidos, pero lo platónico siempre es un poco más complicado. Las ideas representan la esencia de los objetos de conocimiento, no son meros contenidos mentales, no son conceptos, las ideas subsisten independientemente de que sean pensadas o no. Por tanto las ideas son independientes del pensamiento, del sujeto que las piensa y del objeto del que son su esencia. Yo, para aclararme sobre cómo las ideas pueden ser independientes del sujeto, pienso en que la idea existe incluso si no conozco su concepto correspondiente, las patatas existían y su idea platónica también antes del descubrimiento de América pero nadie que viviera en este hemisferio las conocía, por cierto, ¿cómo demonios harían para acompañar a un huevo frito?.

Las ideas son el modelo o arquetipo de las cosas de la realidad sensible, son identidades puras, lo que Platón denomina también como género o clase formada por las cosas de la realidad sensible con la misma identidad ideal. Las cosas son una copia o imitación de las ideas, son ejemplares únicos de las ideas. 

La consecuencia inmediata de la teoría platónica de las ideas es la separación entre el mundo o realidad intangible y el mundo o realidad sensible. Este es el dualismo platónico que recibió muchas críticas, la primera y más importante, la de su alumno en la Academia de Atenas, Aristóteles (4).

Aristóteles viene a poner un poco de sentido común a la propuesta de Platón. Está de acuerdo con él en que hay un elemento común entre todos los objetos de la misma clase, el universal, la idea, que es la causa de que le demos el mismo nombre a todos los objetos del mismo género. El macedonio admite que ese universal existe, pero no que tenga existencia independiente de las cosas, niega que sea subsistente como dicen los filósofos.

El dualismo platónico para Aristóteles no tiene ningún sentido, duplicar el mundo visible, estableciendo un mundo paralelo es complicar el asunto sin obtener ninguna ventaja a cambio, ya que este mundo paralelo necesita a su vez de una explicación, es – en definitiva - establecer una separación entre las cosas y aquello por lo que las cosas son como son, entre los objetos y su esencia.

En cualquier caso, esa visión inteligente del mundo real que comparten los dos filósofos, la división – si se quiere metodológica - entre los ejemplares y la idea que representa a toda una categoría de esos ejemplares, ha sido una herramienta usada hasta la saciedad a lo largo de la historia del conocimiento humano, desde la clasificación biológica de las especies a los tipos ideales de Weber, desde la clasificación de las criaturas celestiales en distintos coros por la iglesia medieval – supongo yo que después de un tremendo chute de incienso -hasta el paradigma de la orientación a objetos (5) de la moderna informática.

Y antes de empezar a desgranar qué es eso de la orientación a objetos debo hacer una seria advertencia. Los informáticos, sobre todo aquellos que nos dedicamos al desarrollo de programas – o, especificando más, los que nos dedicamos a la ingeniería del software (6) - tenemos un trabajo que no dudaría en calificar de “platónico”. 

Me di cuenta enseguida, nada más sumergirme en este condenado mundillo cuando era un joven estudiante en la Universidad Politécnica de Madrid, lo que pasa es que entonces no sabía muy bien cómo expresarlo, me faltaba cultura, situación a la que puse remedio años después cuando estudié sociología. 

La ingeniería del software es platónica pues nos movemos entre dos realidades: un mundo real, que es el pretendemos interpretar con nuestra ciencia, y un mundo intangible, que en su versión conceptualmente más simple, reside en una máquina gobernada por impulsos eléctricos interpretados como unos y ceros.

Así pues, nuestro trabajo consiste esencialmente en interpretar la realidad hablando con los expertos en la materia que pretendemos informatizar, utilizamos diversas técnicas de diagramación para representar esa realidad siguiendo metodologías de análisis contrastadas, y luego construimos programas cambiando el lenguaje de los diagramas por el lenguaje de programación que la situación aconseja o nuestra empresa quiere que usemos. Lenguaje con instrucciones que el ordenador – que no deja de ser un autómata - sigue al pie de la letra.

Lo dicho, interpretamos la realidad sensible para transformarla a una realidad intangible y binaria, y de paso resolvemos - espero que de manera eficaz -  algún problema del mundo real, desde la aproximación de un avión al aeropuerto a la nómina de una empresa pasando por un portal web para conseguir pareja. 

Y en ese proceso de interpretación de la realidad mediante diagramas y programas es donde hay que colocar al análisis, el diseño y la programación orientada a objetos. Vamos a asomarnos tímidamente a sus principios y cómo conectan con lo descrito antes acerca de lo que pensaban Platón y Aristóteles.

Todo comenzó en la década de 1960 con un lenguaje de programación muy particular, Simula (7), que estaba pensado para realizar simulaciones, desde circuitos a aeronaves, y en ese entorno era necesario agrupar características y crear clases de cosas. Está considerado como el primer lenguaje orientado a objetos. La orientación a objetos quedó circunscrita a este entorno durante años, hasta que a finales de la década de 1980 tomó un gran impulso y hoy proliferan los lenguajes de programación que cumplen con sus requisitos.

Los conceptos básicos de este tipo de lenguajes son la clase y el objeto. La clase es equivalente al género platónico, siguiendo con el ejemplo del profesor Escohotado,  yo hago abstracción de todas las puertas y creo la clase “puerta” en donde coloco todas las características que definen a las puertas, entendiendo por características los tipos datos – atributos en la jerga informática - que las describen  y las operaciones - o métodos en la misma jerga – que puedes realizar sobre esos datos. 

Pero la clase es el modelo, es la definición universal, es la idea al modo de Platón, en cambio la cosa, el ejemplar que forma parte del mundo sensible, sería el objeto. Y es el objeto el que tiene existencia real, ya veremos un poco más adelante cómo se manifiesta esa existencia en un entorno tan abstracto como el interior de un ordenador. Con el objeto definimos la puerta corredera de madera verde que se puede abrir y cerrar hacia los lados y que mide 1 por  2 metros o la puerta giratoria de cristal que no para nunca. Ambas pertenecen a la clase puerta y ambas son objetos distintos.

Pero, ¿cómo puede tener existencia real un objeto dentro del ordenador?. Pues bien, mientras que la clase no se ejecuta (8) y queda como definición, el objeto existe en tiempo de ejecución, almacena datos en memoria y acaba muriendo cuando deja de ejecutarse. Es más, hay programas llamados “recolectores de basura” que limpian la memoria de los restos de estos objetos para que no estorben, son como enterradores de objetos muertos. Al tiempo en que el objeto está vivo en memoria se le llama persistencia y es una de las propiedades básicas de la orientación a objetos.

Voy a proponeros un pequeño viaje a la programación orientada a objetos. No me voy a meter en mucho detalle, sé que es terreno pantanoso, pero si hemos llegado hasta aquí merece la pena un pequeño esfuerzo más.

 Supongamos que quiero crear la clase “persona”. En ella introduciré todos los atributos o datos que creo que definen a un ser humano. Podría poner dentro de la clase datos como el nombre y apellidos, datos biométricos como la altura o el peso o el color del pelo, lugar, país y fecha de nacimiento, dirección, teléfonos y muchos otros datos característicos de una persona. Y como operaciones o métodos podría incluir el cálculo de la edad o el consumo basal  de calorías en función del sexo, la edad y el peso, el número de combinaciones pueden ser enorme. Una posible definición simplificada, utilizando un pseudocódigo (9) parecido a un lenguaje de programación cualquiera, podría ser:

Clase persona;
Atributos
Nombre: caracteres (50);
LugarNacimiento: caracteres (25);
PaisNacimiento: caracteres (20);
AñoNacimiento: entero;
AñoDefuncion: entero;
Métodos
Vida (AñoNacimiento, AñoDefuncion);
/* calcula los años de vida restando al año de defunción el año de nacimiento */
Fin Clase

Luego para crear un objeto de la clase bastaría con poner algo así en el programa:
Platon es nueva persona;   o    Aristoteles es nueva persona;
Y para meter datos bastaría:
Platon.Nombre:= “Platón”;
Platon.LugarNacimiento:=”Atenas”;
Platon.PaisNacimiento:=”Grecia”;
Platon.AñoNacimiento:= -427;
Platon.AñoDefuncion:= -347;

Esto sería un ejemplo de una asignación directa de los valores a los datos pero podrían obtenerse de la pantalla o de una base de datos o de cualquier otra fuente. 
Y como ejemplo de operación podría calcular sus años de vida invocando al método:
Vida(Platon.AñoNacimiento, Platon.AñoDefuncion);

Como el lector presupondrá todo esto puede llegar a ser muy complicado y no quiero ir mucho más allá pues me meto en territorio farragoso, así que vamos a ir terminando pero no sin ver una propiedad más que da idea de la potencia de definición que proporciona la orientación a objetos. Yo puedo, superando a Platón, construir clases de clases.  Como diría mi hijo pequeño: ¿Cómo te quedas Platón?, ¿en eso no habías pensado, eh?.
 
Supongamos que trabajo en una empresa de software que recibe encargos de otras empresas. Una empresa me encarga una aplicación de ventas que trata básicamente de gestionar clientes y otra me encarga solucionarle el problema de su nómina que trata básicamente de gestionar empleados. Si tengo bien definida una clase persona,  evidentemente con más datos de los que he puesto en párrafos anteriores, puedo reutilizarla para crear nuevas clases, pues al fin y al cabo, todos los clientes y los empleados son personas. Para ello bastaría algo así como:

Clase Empleado es nueva persona;
Atributos
Departamento: caracteres (20);
PuestoTrabajo: caracteres (20);
Categoria: caracteres (15);
SueldoBase: numeroreal;
Antigüedad: entero;
Métodos
Retribución(); /* calcula la retribución mensual de un empleado */
Fin clase
Clase Cliente es nueva persona;
Atributos
Empresa: caracteres (20);
Cargo: caracteres (20);
VentasAnuales: vector [1..12] de numeroreal;
CuentaBancaria: caracteres (15);
Métodos
                Cobros (); /* realiza los cobros a los clientes */
Envíos (); /* programa envíos de productos */
Fin clase

En este caso, la clase empleado heredaría todos los atributos y métodos de la clase persona añadiendo las características propias de un empleado. Y lo mismo pasaría con la clase cliente. De esta manera programaría una sola vez todo aquello que tiene que ver con las personas independientemente de si éstas son empleados o clientes. A esto se le llama reutilización y abarata mucho los proyectos.

Antes hemos hablado de que el trabajo del ingeniero de software pasa por la traducción de la realidad a un lenguaje ejecutable en un ordenador. Ese trabajo resulta más fácil con el paradigma de la orientación a objetos ya que permite describir la realidad de una manera más sencilla, fidedigna y con más potencia semántica que cualquier otra manera que se haya diseñado anteriormente. Acerca la realidad sensible al mundo intangible siguiendo un sistema que en el fondo fue el mismo que concibió Platón hace muchos siglos. Lo que francamente no sé es si los creadores del lenguaje Simula hace 50 años pensaron en las ideas de Platón y Aristóteles cuando concibieron este paradigma pero, de lo que estoy seguro, es que fueron herederos de una milenaria tradición intelectual que tiene su origen en ellos.

Juan Carlos Barajas Martínez
Informático y sociólogo

Notas

  1. La ingeniería de software es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación, y mantenimiento del software. Según Bohem, es la aplicación práctica del conocimiento científico al diseño y construcción de programas de computadora y a la documentación asociada requerida para desarrollar, operar y mantenerlos. Se conoce también como desarrollo de software o producción de software.
  2. Platón (en griego antiguo: Πλάτων) (Atenas o Egina,1 ca. 427-347 a. C.) fue un filósofo griego seguidor de Sócrates y maestro de Aristóteles. En 387 fundó la Academia, institución que continuaría su marcha a lo largo de más de novecientos años. Su influencia como autor y sistematizador ha sido incalculable en toda la historia de la filosofía, de la que se ha dicho con frecuencia que alcanzó identidad como disciplina gracias a sus trabajos.
  3. Antonio Escohotado Espinosa  (Madrid, 5 de julio de 1941) es un pensador, ensayista y profesor universitario español cuyas obras, si bien centradas principalmente en el derecho, la filosofía y la sociología, han abordado una gran variedad de campos. Obtuvo notoriedad pública por sus investigaciones acerca de las drogas, y son conocidas sus posiciones antiprohibicionistas. El leit motiv de su obra es una afirmación de la libertad como antídoto frente al miedo o las coacciones que empujan al ser humano hacia toda clase de servidumbres. Fue profesor de filosofía en la Facultad de Ciencias Políticas y Sociología de la UNED.
  4. Aristóteles (en griego antiguo: Ἀριστοτέλης, Aristotélēs; Estagira, 384 a. C.-Calcis, 322 a. C.) fue un filósofo, lógico y científico de la Antigua Grecia cuyas ideas han ejercido una enorme influencia sobre la historia intelectual de Occidente durante más de dos milenios. Aristóteles escribió cerca de 200 tratados (de los cuales solo nos han llegado 31) sobre una enorme variedad de temas, incluyendo lógica, metafísica, filosofía de la ciencia, ética, filosofía política, estética, retórica, física, astronomía y biología. Aristóteles transformó muchas, si no todas, las áreas del conocimiento que abordó. Es reconocido como el padre fundador de la lógica y de la biología, pues si bien existen reflexiones y escritos previos sobre ambas materias, es en el trabajo de Aristóteles, donde se encuentran las primeras investigaciones sistemáticas al respecto. Entre muchas otras contribuciones, Aristóteles formuló la teoría de la generación espontánea, el principio de no contradicción, las nociones de categoría, sustancia, acto, potencia y primer motor inmóvil. Algunas de sus ideas, que fueron novedosas para la filosofía de su tiempo, hoy forman parte del sentido común de muchas personas. Aristóteles fue discípulo de Platón y de otros pensadores (como Eudoxo) durante los veinte años que estuvo en la Academia de Atenas. Fue maestro de Alejandro Magno en el Reino de Macedonia. En la última etapa de su vida fundó el Liceo en Atenas, donde enseñó hasta un año antes de su muerte.
  5. Paradigma de la Orientación a objetos
  6. Esta precisión la pongo porque hay dos formas de desarrollar programas, aplicaciones o sistemas de información, a la buena de Dios - algunos cachondos tecnológicos utilizan el eufemismo "code and fix" - o utilizando metodologías de desarrollo. Yo siempre he sido partidario de un desarrollo metodológico por las razones que suelen venir en los libros de ingeniería de software, que son múltiples y ciertas, y por una razón personal: flaco favor haría a la memoria de mi padre y al dinero que se gastó en mi educación y, a la memoria del dinero que me gasté yo cuando mi padre murió, si fuera un auténtico chapuzas y no aplicara técnicas que me garantizan la calidad de los productos que desarrollo. ¡He dicho!.
  7. Simula es un lenguaje de programación orientada a objetos (OOP) de 1962. Fue el primero de este tipo que incluyó el concepto de clase. Varios años después de su desarrollo, casi todos los lenguajes modernos comenzaron a utilizar sus principios de orientación a objetos. Así fue como se popularizaron términos como clases, objetos, instancias, herencia, polimorfismo, etc. Simula 67 fue lanzado oficialmente por sus autores Ole Johan Dahl y Kristen Nygaard en mayo de 1967, en la Conferencia de Trabajo en Lenguajes de Simulación IFIO TC 2, en Lysebu cerca de Oslo
  8. Aquí la palabra ejecutar tiene el sentido de la 6ª acepción del Diccionario de la Real Academia: “6. tr. Inform. Poner en funcionamiento un programa”.
  9. En ciencias de la computación, y análisis numérico, el pseudocódigo (o falso lenguaje) es una descripción de alto nivel compacta e informal1 del principio operativo de un programa informático u otro algoritmo. Utiliza las convenciones estructurales de un lenguaje de programación real, pero está diseñado para la lectura humana en lugar de la lectura mediante máquina, y con independencia de cualquier otro lenguaje de programación. Normalmente, el pseudocódigo omite detalles que no son esenciales para la comprensión humana del algoritmo.

Bibliografía:

Antonio Escohotado Espinosa
Filosofía y Metodología de las Ciencias Sociales
UNED 1989

José María Fouce
La Teoría de las Ideas de Platón

José María Fouce
La metafísica aristotélica: la crítica de la Teoría de las Ideas

Vídeo sobre la Teoría de las Ideas de Platón: