Capitulo 1 –Análisis y diseño Orientado a Objetos con aplicacionesComplejidad 1.1 La complejidad inherente al software: las propiedades de los sistemas de software simples y complejos. Mucha de la complejidad que debe manejar un ingeniero de software es complejidad arbitraria. Un sistema de software creado por un programador aficionado o desarrollador profesional que son especificados, construidos y mantenidos por el mismo, no son complejos – Son aplicaciones altamente intranscendentes -. Tales sistemas tienden a tener un propósito muy limitado y un ciclo de vida muy corto. Las características del software de dimensión industrial es que resulta sumamente difícil, sino imposible, para el desarrollador individual comprender todas las sutilidades de su diseño. La complejidad de tales sistemas excede la capacidad humana. La complejidad parece ser una propiedad esencial de todos los sistemas de software de gran tamaño (puede dominarse pero no ser eliminada). ¿Porque el software es complejo de forma innata? Esta complejidad inherente se deriva de cuatro elementos: La complejidad del dominio del problema La dificultad de gestionar el proceso de desarrollo La flexibilidad que se puede alcanzar a través del software Los problemas que plantea la caracterización de sistemas discretos La complejidad del dominio del problema: se refiere a la complejidad que conlleva el entendimiento del problema en base a los requisitos proporcionados por el cliente (algunas veces estos compiten entre si o se contradicen). Considérese los requisitos para el sistema electrónico de un avión multimotor, un sistema de conmutación para teléfonos celulares o un robot autónomo. La funcionalidad pura de tales sistemas es difícil incluso de comprender, pero añádanse además de todos los requisitos no funcionales, tales como facilidad de uso, rendimiento, coste, capacidad de supervivencia y fiabilidad, que a menudo están implícitos. Esta ilimitada complejidad externa es la que causa la complejidad arbitraria. Los usuarios y los desarrolladores suelen tener perspectivas diferentes sobre la naturaleza del problema y realizan distintas suposiciones sobre la naturaleza de la solución. Los requisitos de un sistema de software cambian frecuentemente durante su desarrollo. Es mantenimiento cuando se corrigen errores. Es evolución cuando se responde a requerimientos que cambian. La dificultad de gestionar el proceso de desarrollo: El equipo de software debe ofrecer ilusión de simplicidad al usuario. Nadie puede comprender completamente el sistema a titulo individual. La cantidad de trabajo exige la utilización de un equipo de desarrolladores y de forma ideal se utiliza un equipo tan pequeño como sea posible. Con un equipo de desarrolladores, el reto clave de la dirección es siempre mantener una unidad e integridad en el diseño. 1 La flexibilidad que se puede alcanzar a través del software: el software ofrece la flexibilidad máxima por lo que un desarrollador puede expresar casi cualquier abstracción. Esta flexibilidad resulta ser una propiedad que seduce increíblemente. Los problemas que plantea la caracterización de sistemas discretos: Los sistemas discretos por su propia naturaleza tienen un numero finito de estados posibles; en sistemas grandes hay una explosión combinatoria que hace este numero enorme. El principal problema reside en tratar de caracterizar sistemas analógicos como el movimiento de la pelota lanzada (ya que es un sistema continuo) . Cuando se afirma que un sistema que un sistema se describe con una función continua, quiere decirse que no puede tener sorpresas ocultas. Las consecuencias de la complejidad ilimitada: “Cuanto más complejo sea el sistema mas abierto esta al derrumbamiento total”. Nuestro fracaso en dominar la complejidad del software lleva a proyectos retrasados, que exceden el presupuesto y que son deficientes respecto a los requerimientos fijados. A esta situación se la llama la Crisis del software. 1.2 La estructura de los sistemas complejos. Comportamiento emergente: el comportamiento del todo es mayor que la suma de sus partes. Los cinco atributos de un sistema complejo: 1. La complejidad toma la forma de una jerarquía. Un sistema complejo se compone de subsistemas relacionados que tienen a su vez sus propios subsistemas, y así sucesivamente, hasta que se alcanza algún nivel ínfimo de componentes elementales. 2. La elección de que componentes de un sistema son primitivos es relativamente arbitraria y queda en gran medida a decisión del observador. Lo que es primitivo para un observador puede estar a un nivel de abstracción mucho más alto para otro. 3. Los enlaces internos de los componentes suelen ser más fuertes que los enlaces entre componentes. Se relaciona con las métricas de Alta Cohesión y Bajo Acoplamiento 4. Los sistemas jerárquicos están compuestos usualmente de unas pocas clases diferentes de subsistemas en varias combinaciones y disposiciones. Los sistemas complejos tienen patrones comunes, estos pueden conllevar la reutilización de componentes pequeños. Ej. Células que se encuentran en plantas y animales. 5. Un sistema complejo que funciona ha evolucionado de un sistema simple que funcionaba. Complejidad organizada y desorganizada El descubrimiento de abstracciones y mecanismos comunes facilita en gran medida la comprensión de los sistemas complejos. La mayoría de los sistemas interesantes no contienen una sola jerarquía, en lugar de eso, se encuentra que en un solo sistema complejo suelen estar presentes muchas jerarquías diferentes. Jerarquía estructural “parte de”, jerarquía de tipos “es un”. 2 Ej. El motor turbofan es un tipo de motor de propulsión a chorro, el cual forma parte de un Jet. Se llaman a esas jerarquías “Estructuras de clases” y “Estructuras de objetos”, respectivamente. Cada jerarquía esta dividida en capas, con las clases y objetos más abstractos construidos a partir de otros más primitivos. Existen colaboraciones estrechas entre objetos del mismo nivel de abstracción. De forma conjunta nos referimos a la estructura de clases y de objetos de un sistema como su arquitectura. 1.3 Imponiendo orden al caos Dijkstra sugiere “Divide y vencerás” – es esencial descomponer el problemas en subproblemas que sean más manejables - . Descomposición Algorítmica. o Diseño estructurado descendente. Cada modulo del sistema representa a un paso importante del proceso global. Descomposición Orientada a Objetos. o Cada objeto modela algún objeto del mundo real. Un objeto no es mas que una unidad tangible que muestra un comportamiento bien definido. Categorías de métodos de diseño Un método es un proceso disciplinado para generar un conjunto de modelos que describen varios aspectos de un sistema de software en desarrollo. Una metodología es una colección de métodos aplicados a lo largo del ciclo de vida del desarrollo del software. DOO Se deberían modelar sistemas de software como colecciones de objetos que cooperan. Ventajas de la descomposición orientada a objetos • Produce sistemas más pequeños a través de la reutilización de mecanismos comunes. • Sistemas más resistentes al cambio, mejor preparados para evolucionar en el tiempo. El papel (rol) de la abstracción A través de abstracciones los humanos somos capaces de comprender mecanismos y/o cosas complejas – Newton lo admitió secretamente a algunos amigos: comprendía cómo se comportaba la gravedad, pero no cómo funcionaba -. De hecho el lenguaje es una abstracción necesaria para poder llevar a cabo una comunicación. El papel (rol) de la jerarquía La estructura de clases resalta la estructura y comportamientos comunes dentro de un sistema. La identificación de jerarquías en un sistema de software complejo suele ser fácil, porque requiere que se descubran patrones entre muchos objetos. 1.4 Del diseño de los sistemas complejos. El propósito del diseño es crear una estructura clara y relativamente simple 3 Los elementos de los métodos de diseño del software Notación: Lenguaje para expresar cada modelo. Proceso: Actividad que encamina a la construcción ordenada de los modelos del sistema. Herramientas: Artefactos que eliminan el tedio de construir el modelo. El Diseño Orientado a Objetos es un método que lleva a una descomposición Orientada a Objetos. 4