Por qué orientarse a objetos

06/01/2007
Por qué orientarse a objetos
Dr. Rubens Arizmendi
Autor: 
Dr. Rubens Arizmendi
Systems Engineer, Expert in Mathematics, Computation and Systems. Ingeniero de la Universidad de Montevideo-Uruguay. Studies in M.I.T. (USA). Doctor of Science in Information Systems Engineering, Tecana American University.

Las definiciones de un Sistema son numerosas, casi infinitas, según quien las redacte. Y eso confiere universalidad a los sistemas, los pone por encima de los paradigmas, de las religiones, del origen del Mundo… la Cosmogonía misma es un sistema.

Luego, nadie lo duda: el Sistema es una estructura viviente. Fue creado para actuar y, más que para dar, para promover respuestas; ayuda y orienta al Hombre a buscar las soluciones que necesita. El sistema nace, se desarrolla, puede enfermarse y curarse, puede morir, y también resucitar si es que su existencia terminó en alguna parte pero vuelve a vivir y actuar en otro entorno, reencarnado, con otro ropaje.

Su vigencia puede ser corta o larga, eterna, provisional, limitada a términos finitos. Vive asediado por nuevas generaciones que intentaran desplazarlo. Por eso, es fascinante, mágico, alucinante, odiado. Y tiene un depredador incansable y malvado: el Usuario.

Aunque lo parezcan, estas imágenes no son retóricas, sino totalmente valederas. Significan que, como toda obra humana, el Sistema se renueva con expresiones que son, cada vez, la culminación de valores agregados que el Hombre soñó, después los descubrió, y llamó a una Tecnología que les diera vida y forma.

En Informática, podría decirse que el Sistema nació en un solo programa, de ejecución manual, mecánica, o semiautomática. El entorno le hizo crecer en complejidad, en responsabilidades, en prestigio. Pero, siempre se mostró atado a la Semiótica (Teoría General de los Signos) y más aún, a sus hijas llamadas Pragmatics, Sintaxis y Semántica, característica ésta que por sus continuas fallas y traspiés dentro de los sistemas ha dado lugar a una nueva rama de estudio llamada Sistemántica.

De ahí la importancia de la aparición y presentación del Análisis, Diseño y Desarrollo de Sistemas orientados a objetos. Se trata de una nueva manera de enfocar las aplicaciones empleando modelos basados en conceptos del mundo real donde se desenvuelve el sistema. La metodología tradicional enfatiza en la descomposición funcional del sistema de la empresa. El nuevo enfoque se orienta a identificar “objetos” pertenecientes al dominio de la aplicación y a establecer las entidades que constituirán su representación final mediante procedimientos y acciones, computarizadas o no. Primero define conceptualmente los objetos; para después, queda la forma como estos se utilizan.

Se persigue la comprensión del espacio o escenario del problema, antes de proponer las soluciones. Es bien sabido que a menudo los problemas percibidos son sólo síntomas, no las causas del problema real. La representación de una empresa mediante “modelos” del sistema que la rige, permite capturar los aspectos conceptuales, en lugar de orientarse a la implementación final de las soluciones y cambios. Es más rigurosa en el estudio de la información y en la definición de los mecanismos del proceso, y por ello soporta con más vigor las nuevas ingenierías de los negocios.

La experiencia dice que en general no acorta tiempo con respecto al desarrollo convencional, pues su esencia exige esfuerzos adicionales en el diseño; pero en cambio provee beneficios como la reutilización de sus elementos, la reducción de errores que generalmente se propagan en el proceso de diseño y especialmente enormes ventajas en el mantenimiento, que resultará así blindado frente a las “maldades” de la Sistemántica.

 

El modelado de Objetos

Sin que esto implique una definición completa y formal, podremos decir que un objeto es una abstracción, una percepción de la que surge un concepto, o algo con limites bien definidos y que tiene significado para la aplicación (también vale decir “que es capaz de hacer variar el comportamiento del sistema”).

Una taquilla de un Banco, un Jinete que conduce caballo de carrera, un formulario de pago de Impuesto, un programa de computadora, una pantalla de micro, un reloj, pueden ser considerados un objeto.

Luego, y como premisa, el diseñador debe comprender al objeto antes de construirlo. La abstracción es aquella capacidad humana que permite una visualización clara del flujo de las ideas, abre caminos en medio de la maleza de conceptos o propuestas, captura los aspectos cruciales de la situación. Puede ser imperfecta, pero establece bases de acción para los creativos.

Cada objeto tiene su propia identidad y se distingue de los otros objetos. El contenido de un modelo de objetos está determinado por su relevancia para la solución buscada.

El modelo puede ser simple, o constar de módulos que capacitan al diseñador a usar segmentos manejables. Mediante estructuras de nomenclatura variada, que incluyen jerarquías, herencias, asociaciones y otras numerosas y tal vez excesivas - definiciones, los objetos pueden conformar diseños que conviertan a un sistema en multidimensionado.

 

Y… ¿Como representar y documentar?

Hay otras propuestas innovadoras. La metodología de diseño orientado a objetos, si bien es amplia en sus esferas de aplicación, se centra y desarrolla en el área informática y en particular en la creación de software para Sistemas de Información, sus verdaderas columnas vertebrales.

No escapa a las etapas clásicas como reuniones multidisciplinarias preliminares, estudio del sistema actual o propuesto, fijación de alcance y objetivos, diseño en sí, desarrollo, documentaciones concurrentes, implementación, pruebas de operación y de aceptación por el usuario, corridas, en paralelo y finalmente la representación documentada total, siguiendo normas y estándares propios de cada instalación.

Y aquí se pregunta: ¿si el ámbito de los objetos es universal y multidimensional, de dónde se obtendrá una representación gráfica del sistema y de los objetos dinamizando al mundo real e interactuando con él?

Las técnicas gráficas universales de documentación en Ingeniería de Software están en proceso de desarrollo y consolidación. El advenimiento de Internet con lenguajes de alta creatividad como Macromedia Flash y Microsoft Front Page, la Animación y la Realidad Virtual, entre otros, están creando valiosas iniciativas entre los sistematizadores

Los objetos son las unidades en que dividimos al Mundo del sistema que percibimos o sentimos, y visualizamos, siendo el Modelo de Objetos el más importante de la tecnología OMT, desarrollado por Rumbaugh junto con otros autores, una de las más aceptadas. Se corresponde de manera más fiel con el mundo real y por lo tanto es más flexible frente a los cambios, allana el camino para comunicarse con el usuario y el resto de la gente de desarrollo.

El modelo describe la estructura de los objetos del sistema, su identidad, atributos, operaciones y relaciones con otros objetos. Crea el contexto en el cual se situarán los siguientes modelos llamados Dinámico y Funcional. En cuanto a su representación gráfica, usa diagramas que contienen clases relacionadas jerárquicamente y que podrán estar asociadas con otras clases.

A partir del Mundo Real, el modelo debe reflejarlo de modo que tenga sentido para los usuarios finales. Posteriormente, el diseño mantiene y se apoya en la estructura básica del modelo, y finalmente, el código de programación se debiera generar de la manera más automática posible a partir del diseño, lo que se logra mediante la nomenclatura funcional común. Se reitera: en OO, todos utilizan el mismo modelo conceptual: analistas, diseñadores, programadores y -muy importante- los usuarios.

Los conceptos más importantes que se manejan -y que son claves para dominar esta tecnología- son: Clases, Enlaces, Asociaciones, Herencia y Generalizaciones. La descomposición de una situación (vulgarmente llamada “problema”) depende de su naturaleza, y del juicio del analista. No hay una representación correcta única.

Una pregunta interesante es: ¿Cómo aparecen los objetos en un sistema la primera vez? Conceptualizando, se van observando objetos que pertenecerán a un mismo “tipo” porque poseen características similares, y eso nos lleva a la concepción de Clase, como plantilla o prototipo para cada tipo de objetos.

CLASES: La Clase agrupa a objetos con idénticos atributos (properties), similares relaciones con otros y con una semántica y comportamiento comunes. Las Clases son importantes porque al agrupar los objetos en clases se abstrae el problema. Es cierto que en la concepción tradicional siempre se piensa en el “archivo que reunirá a los registros”, pero la abstracción que se impone como disciplina en esta tecnología y sus herramientas adicionales otorgan al modelado de objetos mayor potencia y capacidad superior para generalizar su uso en las siguientes fases del desarrollo.

Las Clases proporcionan la ventaja de la reutilización. Los programadores pueden usar una clase cada vez que quieran crear nuevos objetos que, con distintos o más atributos, compartan una sola implementación de método.

Por ejemplo, el impacto del lenguaje JAVA en Internet es un rico conjunto de clases que contienen las abstracciones básicas para el entorno con el cual interactúan sus programas. Así, se ofrece a miles de programadores la oportunidad de crear objetos que interactúan sobre el Java en la red, y hasta los protocolos de Internet que suelen ser complejos y con abstrusos detalles técnicos, son fáciles de manejar como clases preestablecidas de Java.

 

Diagramas

Los diagramas ayudan a pensar con claridad, son otra forma de proceso del pensamiento. Hay progresos notorios en cuanto a generación automática de código y conversión de tipos de diagramas, que dotarían de un poderoso lenguaje común a las partes de la organización involucradas en los Sistemas.

Como formatos universales consistentes, se pueden adoptar los diagramas OMT, suficientemente maduros como una primera generación de estándares.

 

Los objetos se presentan como Instancias de una Clase. Por lo tanto los diagramas a graficarse serán:

a) de CLASES

La Clase se dibuja como un rectángulo, dividido verticalmente en hasta tres rectángulos que contienen: Nombre de la Clase, Atributos con su estructura de datos, y Operaciones inherentes a esos objetos (no las operaciones externas que puedan hacerse sobre ellos) Los diagramas de Clases describen clases de objetos.

b) de INSTANCIAS

La Instancia se dibuja como rectángulo de vértices redondeados. El nombre de la Clase se pone entre paréntesis en letra negrita en la parte superior del cuadro y los atributos y valores de cada instancia, en letra normal. El diagrama de instancias describe así la forma en que un cierto conjunto de objetos se relacionan entre sí. Un diagrama de Clases dado se puede corresponder con un conjunto infinito de diagramas de instancias.

 

Los diagramas de Clase describen el caso general al modelar un sistema.

Especifican la estructura de datos y los métodos operativos que se aplican a cada uno de sus objetos. Los diagramas de instancias son muy útiles para clarificar diagramas de Clases complejos; se recomienda no mezclar unos con otros en el mismo gráfico, para mantener el nivel conceptual de cada cosa.

El modelo final de objetos consistirá en un Grafo cuyos nodos son clases de objetos y cuyos arcos son relaciones horizontales o jerárquicas entre clases.

 

Elementos del Objeto

Un ATRIBUTO es una propiedad de los objetos de una Clase. Los objetos de la Clase Empleado podrían tener como atributos la edad, código del departamento donde trabaja, número de Cedula de Identidad, entre otros.

Se acompaña al atributo con el tipo de representación de su valor precedido por dos puntos, ej, Nombre: string, Sueldo: integer, etc. Opcionalmente también puede agregarse el valor por defecto.

Importante: cada atributo tiene un valor para cada instancia del objeto, aunque las instancias distintas de cierto objeto podrán tener el mismo o distinto valor para un atributo dado. El nombre del atributo es único dentro de la clase, pero puede repetirse en distintas clases con el mismo o diferente significado. Como se dijo, los atributos se colocan en el segundo rectángulo de la Clase.

En el modelado, los objetos no requieren identificadores explícitos (claves) ya que por definición cada uno posee su propia identidad única. Los lenguajes orientados a objetos normalmente hacen referencia a los objetos generando automáticamente identificadores implícitos para ellos que, por lógica, no tienen significado en el mundo real sino dentro del computador.

Una OPERACIÓN es una transformación aplicable a los objetos de una Clase, o que puede ser aplicada por esos objetos. Todos los objetos de una Clase comparten las mismas operaciones indicadas en el tercer rectángulo (inferior) del gráfico de Clase.

Una operación puede aplicarse con el mismo nombre en muchas clases distintas, adoptando distintas formas en cada una de ellas. De ahí la condición de “polimórficas”.

Una FUNCIÓN es intrínsecamente una asociación, y en esta tecnología se ratifica ese concepto. La función asocia objetos de una clase con un conjunto de objetos de otra clase, (es decir, desde un conjunto de objetos hacia otro conjunto de objetos) y su notación de flechas es similar a la usada en Matemática Conjuntista.

Dominio y Rango también deben manejarse aquí: Dominio es la colección de todos los objetos posibles de ser asociados por la función, o la Clase desde la cual la función puede asociar objetos, mientras el Rango es la colección de todos los objetos con los cuales la función puede asociar a los objetos del dominio.

   

Enlaces y Asociaciones

Un ENLACE es una conexión conceptual o física entre instancias de objetos. Por ejemplo Abreu “juega en” el Caracas conecta una instancia de la Clase Peloteros con otra instancia de la Clase Equipos. Una ASOCIACIÓN describe un conjunto de enlaces con estructura y semántica comunes.

Las Asociaciones describen un grupo de Enlaces potenciales del mismo modo que las Clases describen un grupo de Objetos potenciales. De ahí que un Enlace es una instancia de una Asociación. En una Asociación, todos los enlaces conectarán objetos procedentes de las mismas Clases.

Nótese que son conceptos conocidos y trabajados en la programación tradicional, pero que se le presentan en forma diferente a los lenguajes orientados a objetos, donde un programa consta de una colección de elementos discretos como Clases, Objetos, Operaciones, Herencias, Asociaciones (siendo el modelo de objetos el que contiene la mayoría de las estructuras declarativas).

La noción de Asociación no es un concepto nuevo. Viene siendo usada desde hace años en el modelado de bases de datos y el uso de punteros o apuntadores sigue siendo el recurso más práctico (tanto en lo relacional como en lo orientado a objetos…)

 

Herencia y Generalización

Si se necesita crear un objeto similar a otro definido previamente, pero con algunas características adicionales, se deberá “heredar” una nueva clase a partir de la anterior. Así, la HERENCIA es el proceso de crear una nueva clase (subclase) con las características de una ya existente, incluyendo datos y métodos, junto con características adicionales específicas de la nueva clase.

El principal valor de la Herencia en esta tecnología es proporcionar un mecanismo poderoso y a la vez natural, de organización y estructuración de programas, permitiendo así una máxima flexibilidad, al tiempo que posibilita reutilizar las veces que se quiera el código de la superclase, ahorrando tiempo y eliminando errores potenciales. La complejidad de los programas crece así en forma lineal, en lugar de geométrica.

La GENERALIZACIÓN es entonces, la relación entre una Clase, y una o más versiones organizadas y sucesivamente refinadas, de esa misma Clase.

Es la manera jerárquica como el hombre organiza su volumen de conocimientos. Herencia y Generalización son potentes abstracciones: mediante ellas, el desarrollador, después de modelar un sistema, examina las clases obtenidas, agrupa aquellas que tienen similitudes y puede reutilizar el código común.

La Herencia, por su parte, provee la simplificación conceptual que resulta de reducir el número de características independientes dentro del sistema.

 

Recomendaciones a los programadores

El proceso de desarrollo de los modelos orientados a objetos es puramente iterativo, de añadir detalles, siempre buscando optimizaciones. Entre los síntomas de que el programador haya pasado por alto algunos objetos se pueden mencionar:

  • Atributos y relaciones dispares e incoherentes en una clase; debe fraccionarse la clase.
  • Si una clase desempeña dos papeles, no cuadrará la organización, y debería también fraccionarla.
  • Si una operación no tiene una clase destino, ésta debe ser añadida.
  • Para Asociaciones duplicadas, de igual nombre y propósito, generalizar y crear la superclase que las una.
  • Clases innecesarias, debido a carencia de atributos, operaciones y asociaciones de esa clase.- Pregúntese por qué es necesaria.
  • Si faltan vías de acceso para alguna operación, es que hace falta alguna asociación que la haga posible.
  • Asociaciones innecesarias por información redundante.
  • Cada clase debe ser responsable de cumplir con las operaciones que se le han asignado, y de proveer la información que le corresponde.
  • Evite un método que a la vez implemente un algoritmo de trabajo y tome decisiones dependientes del contexto o los resultados.
  • Y algo más:
  • No comience a construir el modelo diseñando cosas. Comprenda bien el problema antes de atacar el trabajo.
  • Trate de mantener un modelo sencillo, evite las complicaciones.
  • Escoja cuidadosamente los nombres, evite que tiendan hacia un cierto aspecto particular de un objeto.
  • No intente determinar la multiplicidad en una fase excesivamente temprana del desarrollo.
  • Haga revisar sus modelos por otras personas.
  • No todas las estructuras OMT son necesarias para todos los problemas, use sólo las que necesite.
  • Cree métodos comprensibles, pequeños, coherentes y legibles.
  • No acceda al interior de una clase en busca de datos. Oculte su herencia interna a las demás clases. La técnica de “encapsulamiento” la protege de cambios caprichosos y “perversidades” de los usuarios.
  • No exporte hacia otras clases las estructuras de datos que son propias del algoritmo de un método. Si lo hace tendrá problemas futuros al cambiar el algoritmo.
  • No optimice el programa antes de que funcione. Valide rigurosamente los argumentos.

Cada modelo, una vez completado, debiera compararse con el Mundo Real, para discutir cuán válido ha resultado.