Paradigmas de programación: los intentos de atenuar la complejidad en creación de software
Evitar fallos. Eso sustentó a los investigadores suecos Ole-Johan Dahl (1931-2002) y Kristen Nygaard (1926-2002) a presentar en 1963 un nuevo enfoque del pensar la programación mediante una sintaxis que garantize reducir problemas de interpretación humana, como al evitar confundir los nombres o los significados de los valores usados o de sus nombres contenedores (o variables).
Kristen Nygaard fue un matemático que trabajó con la Defensa militar noruega en el área de investigación informática y posteriormente como investigador en computación para el Gobierno. Nygaard ya usaba computadores en la década de 1950 para recrear (es decir, simular) en computadores los cálculos de las dimensiones de materiales radiactivos usados en reactores nucleares. Por lo que Nygaard y colaboradores requerían insertar datos que simulen esas complejas tareas y procesos extensos.
Fue así que junto con Ole-Johan Dahl (un programador más experimentado que Nygaard) crearon Simula I (entre 1962 y 1964) y Simula 67, ambos los primeros lenguajes de programación con el enfoque en crear entidades y luego; con Simula 67, desde la orientación a objetos (Bratteteig, Hannemyr, Kaasboll, 2003, p. 3) al aplicar conceptos como clases, herencia y métodos.
Esa nueva propuesta difería de los procedimientos estándar al organizar el código en entidades autónomas (objetos). Donde cada objeto protegía datos propios pero intercambiables según la necesidad del sistema. Si este requería ampliarse (escalarse) solo se creaban y se conectaban nuevos objetos desde las clases madre a los ya existentes.
Las sintaxis de programación previas a Simula I hubieran requerido un cambio de valores de atrás hacia adelante, reemplazando y sumando nuevo código propenso a potenciales fallas y complicado de ajustar a largo plazo.
- Nota: He buscado un compilador o intérprete del lenguaje Simula I o Simula 67 en la web. Pero no hallo ninguno. Si conoces de alguno házmelo saber.
- En el ejemplo de abajo el uso del signo
:= [como en x := 10;]refiere a 'aloja' ó 'contiene tal valor'. Es decir, que x aloja 10.
Ejemplo de Simula I (se añaden comentarios para mayor claridad)
// INICIA BLOQUE
begin
// Declaración de variables enteras
integer Int1,Int2;
// Variable para almacenar el resultado
integer Result;
// Asignación válida
Int1 := 3;
// Asignación válida
Int2 := 4;
// Suma correcta
Result := Int1 + Int2;
// Imprime el entero con ancho mínimo 1
OutInt(Result, 1);
OutImage;
// FIN DE BLOQUE
end
La innovación de Nygaard y Ole-Johan Dahl fue presentar, a finales de la década de 1960, un modo-de-pensar-los-datos-de-cómputo. Eso facilitaría modelar acciones o comportamientos; por ejemplo, al recrear mediante cómputo la compleja física nuclear.
En este contexto, modelar significa que muchos bloques de código (conceptualmente, objetos) contengan datos que les permitan comunicarse entre sí para simular una acción o comportamiento: "No es el código (...) el que modela el sistema del mundo real, sino los objetos creados por él." (Black, 2013, p. 5).
En otras palabras, el aporte de Nygaard y Ole-Johan Dahl fue el de crear una filosofía para escribir código de programación, donde se permita simular (mediante datos) objetos del mundo real, darles comportamientos, organizarlos, actualizarlos o corregirlos de forma menos tediosa (y menos frustrante si el sistema crecía) en comparación a mantener los primeros lenguajes, como ForTran.
Tal fue el interés en el aporte de los suecos Dahl y Nygaard que en 1974 la comunidad de desarrollo de Simula se extendió a 23 países, incluído Estados Unidos, Suecia, Alemania y la Ex Unión soviética.
Debido al inicial éxito, en 1993 Nygaard junto con Lehrmann Madsen y Møller-Pedersen redefinieron oficialmente su concepto como orientación a objetos. Lo explicaron así: como un simulador de comportamientos "de una parte real o imaginaria" del mundo físico y sus estados variantes (Madsen, Møller-Pedersen, Nygaard, p. 16-18). Para ello, el sistema debe ser alimentado con los datos de los atributos de esos objetos, y de cómo cambian esos estados a lo largo de un periodo.
A esa forma de pensar en programación se sumaba otros enfoques ya usados, como la programación procedimental (o imperativa) en la cual la ejecución de un programa sigue una secuencia lógica de procedimientos que transforman los datos (Madsen, Møller-Pedersen, Nygaard, p. 14); similar al usar una calculadora, donde no se puede ser arbitrarios con el orden de las operaciones. Otro enfoque sigue siendo la programación funcional, en la cual los programas se construyen mediante porciones de código en forma de funciones independientes y con datos fijos (donde cada resultado sirve para iniciar una nueva función) sin depender de otras.
Los lenguajes que permiten todos los enfoques citados se los conoce como lenguajes multiparadigma, siendo Javascript uno de ellos.
El objeto en sintaxis de lenguajes de programación
Tiempo atrás expuse aquí unos breves datos en cuanto al uso del concepto de objeto en lenguajes de programación. Pero la historia de ese concepto es mucho más rica.
En palabras de Nygaard a finales de la década de 1980 "(...) el concepto [de objeto] puede remontarse a la introducción de la simulación digital como una herramienta importante para el análisis [informático] en la década de 1940." (Nygaard, 1986). Allí la ejecución de un lenguaje informático es "una ejecución conjunta de una colección (posiblemente variable) de objetos". Si muchos objetos comparten una estructura en común, entonces se "constituyen una clase". Así mismo, un objeto (también) puede ser un componente de un sistema.
Nygaard, como buen matemático (aunque carecía de conocimientos profundos en programación) escribió que la informática es un enfoque que estudia el mundo natural desde los datos y los procesos que usan esos datos: "(...) es la ciencia que tiene como dominio los aspectos informativos de los fenómenos en la naturaleza y la sociedad." (Nygaard, p. 129-130). Para Nygaard toda propiedad de la esencia de un objeto es medible; y un estado es el momento descrito en que ocurre una transformación de esa sustancia o sus propiedades. Mientras que un lenguaje de programación es "la forma en que el lenguaje organiza la estructura de la sustancia, las propiedades medibles y sus valores, y las transformaciones del estado dentro del proceso."
La importancia del objeto (como concepto) es que permite la agrupación (de cosas, de datos, de valores, de algo) y la modularidad (muchos objetos de una clase crean algo).
La orientación a objetos (que en sí es una programación imperativa) es un "aporte para abordar la complejidad mediante la flexiblidad de lo modular; es decir, dividir un gran problema en partes más pequeñas y generales" (Ingalls, 1989, min. 4:17). Sin estructuras como la orientación a objetos (según sus promotores), si mueves o alteras un elemento dentro de esa complejidad todo el sistema se vendrá abajo. En resumen:
- El objeto simplifica: Dentro de cada objeto existen todos los procedimientos que se necesita para modelar la realidad mediante software.
- Un objeto es tal puesto que nace o se deriva o se copia desde una gran clase madre. Ejemplo: un objeto 'Adrian' se deriva de la clase 'Humano Masculino', que a su vez contiene unas propiedades únicas que luego derivarán en comportamientos de datos.
- Clase: Conjunto cuyos objetos ya tienen características y comportamiento únicos y definidos
- Mensaje: Indica que valores o que comportamientos afectarán
- Método: Acción alojada dentro de una clase y ejecutada para cada mensaje ingresado al objeto
La importancia de la mensajería entre entidades: Alan Kay y SmallTalk
Se le reconoce al informático Alan Kay (1940) como el primer y más importante influenciador de los aportes de Dahl y Nygaard en el mundo informático en EE.UU.
Las matemáticas y el álgebra le permitieron a Kay intuir que un sistema grande y complejo solo podría requerir cierta cantidad de recursos para manejar muchos procesos. Sus conocimientos en biología le inspiraron a imaginar cómo los organismos complejos requieren de un mismo elemento (la célula y las comunicaciones entre ellas), iterado millones de veces, para mantener un sistema complejo (como el cuerpo humano) en funcionamiento.
Inspirado en las nuevas formas de crear software, Kay (junto a Adele Goldberg, Daniel Ingalls y Diana Merry en la empresa Xerox y su divisón de investigación PARC) desarrollaron desde 1970 hasta su publicación en 1980 su propia versión de lenguaje orientado a objetos: el lenguaje Smalltalk. En él se aplicaba la metáfora de los 'objetos' como contenedores de propiedades, cuyos datos insertados por el programador permitían recrear o modelar la realidad. Inicialmente lo llamaron programación antropomórfica o programación por personificación (LaLonde, Pugh, 1990, p. 1).
Durante el desarrollo de las primeras versiones de SmallTalk Kay cuestionó (basado en su otra pasión intelectual, la biología) lo siguiente: si las células pueden escalar en factores de millones de veces, ¿cómo lo hacen sin perder la integridad del organismo que están formando?; cómo es posible que un sistema biológico se automantenga sin ser desmontado?, ¿Y cómo aplicar eso a la creación de sistemas en informática? (Kay, 1997, Min. 36-35, 44-42).
A Kay le estimuló el desarrollo sueco de Simula (Kay, 1997, min. 27-53) y sus "relaciones entre estados". En sus conferencias Kay daba ejemplos de escalamiento sin daños, como al construir una casa pequeña en una catedral; y se preguntaba cómo optimizar la integridad (de un sistema complejo) con menos recursos.
Finalmente, Kay aclaró que el concepto de objetos (defendido inicialmente por él mismo) era confuso e innecesario: "A lo largo de los años me he disculpado por usar el término 'orientado a objetos' (Kay, 1997, min. 37-52:58). El concepto de 'procesos' [interconectados con entidades diversas] era una metáfota más clara.
En un famoso correo electrónico aclaró "la orientación a objetos no se trata solo de clases ni de objetos [esa fue una idea menor]. El concepto más importante es el de mensajería entre los elementos o módulos de un sistema, sean cual sean sus estados".
En estos últimos años jóvenes conferencistas como Anjana Vakil en su charla 'Object Oriented Programming is not what I thought' (Øredev Conference, 2020) reconocen que "lo importante [en desarrollo de software] es qué y cómo los objetos (o entidades) ejecutan o reciben instrucciones.
Ese (el comportamiento) es lo importante de la orientación a objetos."; donde "Más que objetos, es comunicación entre entidades". Y donde comunicación también refiere a comportamiento: aceptar, rechazar, transmitir datos entre entidades para alterar (o no modificar) los estados de las entidades que se están modelando desde el software (Noble, 2009).
Comportamiento y comunicación [entre entidades] es lo más importante en la orientación a objetos en lenguajes de programación.
Hoy en día la mayoría de lenguajes de programación (y los más populares, como PHP y Javascript) aceptan el enfoque orientado a objetos con algunas variantes. Como resumen conceptual (sus matices los explicaré a futuro) el enfoque orientado a objetos conlleva el siguiente flujo de desarrollo:
Funcional vs orientado a objetos
// ######
// Enfoque funcional: Fortran, Pascal, or Cobol
Datos A, B, C
→ función X altera A
→ función Y altera B
→ función Z usa A y B (alterados)
→ resultado P
// ######
// Enfoque orientado a objetos (PHP, Java)
Proceso
Clase A
Objeto A1 (nace de la clase A)
→ Propiedades de A1
→ Métodos (u operaciones) de A1
→ Envíar método a Objeto A1
→ El Objeto A1 ejecuta método
→ El método cambió el estado del Objeto A1
Luego:
- Nuevo proceso requiere alterar propiedades para cambiar estado de objeto A
- Ó, nuevo objeto (con diferentes propiedades) se deriva de la clase A
xxx texto que aparecerá al enviar el link por Whatsapp xxx