duduromeroa.com

RESEÑA: CAPÍTULO II

Orientación a objetos: los paradigmas de programación acogen un moderno enfoque


Por Eduardo Romero | Guayaquil, Ecuador

www.duduromeroa.com, animación, lector, gif


#programación, #orientaciónObjetos, #sintaxis, #programación


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 garantice 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.

¿Qué es un objeto en lenguajes de programación?

El término 'objeto' en lenguajes de programación es tres cosas a la vez, en este orden: metáfora, concepto y sintaxis. Metáfora, porque indica cualquier elemento único (real o abstracto) con características propias. Concepto, porque refiere a que ese elemento puede ser categorizado en un conjunto más grande, como una clase. Y sintaxis, porque diferentes lenguajes de programación cuentan con sintaxis para indicar que un objeto tiene atributos únicos que podrán establecer estados de ese objeto.

Esa nueva propuesta difería de los procedimientos estándar (o paradigmas, o criterios ya establecidos para crear software) 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 (más abajo un enlace a mi Ws).
  • 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. En otras palabras, el enfoque funcional era el de 'números siendo calculados mediante operaciones', sin más.

Programación imperativa

Para Louden y Lambert (2011) "representa la ejecución secuencial de instrucciones, el uso de variables que representan ubicaciones de memoria y el uso de la asignación para cambiar los valores de las variables. Lo imperativo es una secuencia de declaraciones que representan comandos o imperativos".

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

Si todo fuera un objeto, el enfoque del proceso cambia. Chamond Liu, en su libro 'Smalltalk, Objects, and Design' (1996, p. 4) explica la orientación a objetos con este sencillo y bonito ejemplo de una suma de escuela, en el cual agregué la instancia del objeto desde una clase junto al comportamiento desde el método (la operación de suma):

xxxx, Ecuador, www.duduromeroa.com
Una suma convertida bajo el enfoque de orientación a objetos. duduromeroa.com, basado en Chamond Liu, 'Smalltalk, Objects, and Design' (1996, p. 13)

La importancia de la mensajería entre entidades: Alan Kay y SmallTalk

Se le reconoce al informático estadounidense Alan Kay (1940) como el primer y más importante impulsor para madurar 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 indagar cómo los organismos complejos requieren de un mismo elemento (la célula y las comunicaciones entre ellas), iterado millones de veces, mantienen un sistema complejo (como el cuerpo humano) en funcionamiento.

Motivado en las nuevas formas de crear software, Kay (junto a Adele Goldberg, Daniel Ingalls y Diana Merry en la empresa Xerox y su divisió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 automantiene 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] junto con el concepto de clases (entendido como una estructura-madre que permite copiar otras subentidades) eran metáforas más clara.

En el ejemplo siguiente (tomado de Sebesta, 2012, p. 87) una porción de sintaxis del lenguaje SmallTalk crea, primero, una clase y sus valores (que se alojarán en las variables, que también serán definidas). Luego establece los valores para los atributos que permitan ubicar los vértices de un polígono.

Ejemplo en SmallTalk para dibujar un polígono.

"----Crea clase"
class name Polygon
superclass Object
instance variable names ourPen

"----Define nombres de variables"
numSides
sideLength

"----Crea un objeto"
new
^ super new getPen
"Indica un puntero"
getPen
ourPen <- Pen new defaultNib: 2

"Método de dibujo"
draw
numSides timesRepeat: 
[ourPen go: sideLength;
turn: 360 // numSides]

"----Define longitud"
length: len
sideLength <- len
"Define número de lados"
sides: num
numSides <- num

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 ese contexto, un mensaje es 'comunicarle (mediante una acción o método) a un componente que se requiere de un servicio o dato'. Para Louden, Lambert, (2011) "(...) algunos mensajes, llamados mutadores, pueden resultar en un cambio de estado en el objeto receptor, mientras que una llamada de función simplemente devuelve un valor a la llamada. El proceso de envío y recepción de mensajes también se llama pase de mensajes. El conjunto de mensajes que un objeto reconoce a veces se llama interfaz".

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: "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, comunicación e independencia [entre diferentes componentes o módulos] 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 

Ya revisados algunos antecedentes del enfoque de la orientación a objetos, en las siguientes secciones mostraré cómo esos conceptos se aplican en el lenguaje de programación Javascript. Este es un lenguaje con un intérprete propio (llamado motor de Javascript) integrado en los servidores web de todo el mundo. Y cada navegador web contiene su propia tecnología de ese motor: V8 para Google, SpiderMonkey para Ópera y JavaScriptCore para sistemas Apple.

Orientación a objetos: los paradigmas de programación acogen un moderno enfoque


LIBROS CONSULTADOS
Alan Kay, 1998. (Alan Kay On Messaging) Alan Kay sobre la mensajería. Correo electrónico a squeak@cs.uiuc.edu. Subject: prototypes vs classes was: Re: Sun's HotSpot

Alan C. Kay, 1993 The Early History Of Smalltalk. Apple Computer

Alan Kay, 1997. The computer revolution hasnt happened yet. OOPSLA (Object-oriented programming systems and applications) keynote 12th Anual SIGPLAN

Andrew P. Black, 2013. Object-oriented Object-oriented Programming: Some Hist amming: Some History, and Challenges for the Next Fifty Years.

Daniel Ingalls, 1989 Object-Oriented Programming. A lecture.

Tone Bratteteig, Gisle Hannemyr, Jens Kaasboll, 2003. In Memory of Kristen Nygaard

TM. Mitchell Waldrop, 1993. Science magazine. Frustrated With Fortran? Bored by Basic? Try OOP!

Jan Rune Holmevik, 1994 Compiling SIMULA: A Historical Study of Technological Genesis

Ole Lehrmann Madsen, Birger Møller-Pedersen, Kristen Nygaard, 1993. Object-Oriented Programming In The Beta Programming Language.

K. Nygaard, 1986. ACM SIGPLAN NoticesVolume 21, Issue 10, 1986. Basic Concepts in Object Oriented Programming.

Sebesta, R. Concepts Of Programming Languages Tenth Edition, Pearson, 2012

LaLonde, Pugh, 1990. Inside Smalltalk Volume I (), Prentice-Hall International. Inc.

Chamond Liu, (1996). 'Smalltalk, Objects, and Design'

James Noble, 2009. The Myths of Object-Orientation. School of Engineering and Computer Science, Victoria University of Wellington, New Zealand

Louden, Lambert, 2011. Programming Languages, Principles and Practice. Third Edition.