viernes, 7 de agosto de 2009

Análisis orientado a objetos (AOO)

Lenguaje Orientado a Objetos

En 1985, E. Stroustrup extendió el lenguaje de programación C a C++, es decir C con conceptos de clases y objetos, también por esas fechas se creo desde sus bases el lenguaje EIFFEL.

En 1995 apareció el más reciente lenguaje OO, Java desarrollado por SUN, que hereda conceptos de C++.

El lenguaje de desarrollo más extendido para aplicaciones Web, el PHP 5, trae todas las características necesarias para desarrollar software orientado a objetos, entre otros tenemos Delphi,

Finalmente también otros lenguajes script como el ActionScript que si bien no es totalmente orientado a objetos pero sí posee las características.

Características de la Programación Orientada a Objetos.

Mensajes

Se puede enviar información de un objeto a otro. Por ejemplo un objeto (ana) de la clase "operador" está enviando un mensaje a un objeto (jeep) de la clase "automóviles" .El mensaje es "arrancar motor" .stos mensajes no son de forma libre en ningún sentido, ya que en vez de eso las clases de operador y automóviles han sido programadas cuidadosamente para enviar y recibir un mensaje de "arrancar motor".La clase operador ha sido programada para transmitir un mensaje arrancar motor bajo determinadas circunstancias. La clase automóviles ha sido programada para reaccionar a el mensaje "arrancar motor" en alguna forma.

Encapsulamiento.

El encapsulamiento consiste en unir en la clase las características y comportamientos, esto es, las variables y métodos, con el objetivo de tener todo en una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento. El encapsulamiento es utilizado para esconder detalles de la puesta en práctica no importantes de otros objetos. Entonces, los detalles de la puesta en práctica pueden cambiar en cualquier tiempo sin afectar otras partes del programa.

La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará conocer qué hace la clase pero no será necesario saber cómo lo hace, este es un elemento importante en la Programación Orientada a Objetos.

La encapsulación da lugar a que las clases se dividan en dos partes:

  1. Interface: captura la visión externa de una clase, abarcando la abstracción del comportamiento común a los ejemplos de esa clase.
  2. Implementación: comprende la representación de la abstracción, así como los mecanismos que conducen al comportamiento deseado.

Formas de encapsular

  1. Estándar (Predeterminado)
  2. Abierto: Hace que el miembro de la clase pueda ser accedido desde el exterior de la Clase y cualquier parte del programa.
  3. Protegido: Solo es accesible desde la Clase y las clases que heredan (a cualquier nivel).
  4. Semi cerrado : Solo es accesible desde la clase heredada
  5. Cerrado: Solo es accesible desde la Clases.

En el encapsulamiento hay analizadores que pueden ser semánticos y sintácticos.

Herencia

Las clases pueden tener "hijos”, esto es, una clase puede ser creada a partir de otra clase. La clase original, o madre, es llamada "clase base".La clase hija es llamada "clase derivada".Una clase derivada puede ser creada en forma tal que herede todos los atributos y comportamientos de la clase base.

Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia.

Por ejemplo, imaginemos que estamos haciendo el análisis de un Sistema para una tienda que vende y repara equipos celulares.

Fig. 6 Ejemplo de un caso de herencia entre clases

En el gráfico vemos 2 Clases más que posiblemente necesitemos para crear nuestro Sistema. Esas 2 Clases nuevas se construirán a partir de la Clase Celular existente. De esa forma utilizamos el comportamiento de la SuperClase.

En general, podemos tener una gran jerarquía de Clases tal y como vemos en el siguiente gráfico:

Fig. 7 Ejemplo de una Jerarquía de Clases

Polimorfismo

El termino polimorfismo se refiere a comportamientos alternos entre clases derivadas relacionadas. Cuando varias clases heredan atributos y comportamientos, puede haber casos donde el comportamiento de una clase derivada deba ser diferente del de su clase base o de sus clases derivadas parientes. Esto significa que un mensaje puede tener diferentes efectos, dependiendo de exactamente que clase de objeto recibe el mensaje.

Abstracción

La abstracción consiste en captar las características esenciales de un objeto, así como su comportamiento.

La abstracción se refiere a quitar las propiedades y acciones de un objeto para dejar solo aquellas que sean necesarias. Es decir, diferentes tipos de problemas requieren distintas cantidades de información, aun si estos problemas pertenecen a un área en común. En la segunda fase de la creación de la clase, se podrían agregar más atributos y acciones que en la primera fase.

En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones.

Ejemplo

Por ejemplo un carro, este es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o parquearse.

Pues en un esquema POO el carro sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.

Ocultamiento.

Es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer sólo los detalles que sean necesarios para el resto del sistema.

El ocultamiento permite 2 cosas: restringir y controlar el uso de la Clase. Restringir porque habrá cierto comportamiento privado de la Clase que no podrá ser accedido por otras Clases. Y controlar porque daremos ciertos mecanismos para modificar el estado de nuestra Clase y es en estos mecanismos dónde se validarán que algunas condiciones se cumplan.

Ejemplo: En el Lenguaje Orientado a Objetos Java, el ocultamiento se logra usando las palabras reservadas: public, private y protected delante de las variables y métodos.

Que es un objeto

Los conceptos de análisis y diseño fueron desarrollados para dar soporte a la tecnología de programación orientada a objetos su evolución no fue una evolución instantánea, sino que han ido cambiando con el paso del tiempo. La programación orientada a objetos toma su concepto de encapsulación de la idea de ingeniería de software de la abstracción de datos, y su concepto de herencia a partir de la idea de base de datos de generalización y especialización.

Ejemplo

Nuestro teléfono celular, si hablamos en términos de la programación orientada a objetos, podemos decir que nuestro objeto celular es una instancia de una clase conocida como "celular". Los celulares tienen características (marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos tales como (realizar llamadas, recibir llamadas, enviar mensajes, transmisión de datos, etc.).

Fig. 8 Ejemplo de una objeto

Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del mismo tipo y mismas características

Fig. 9 La siguiente figura muestra a ese modelo o plantilla le llamamos CLASE, y a los equipos que sacamos a partir de ella la llamamos OBJETOS.

Clase

La clase es un modelo o prototipo que define las variables y métodos comunes a todos los objetos de cierta clase. También se puede decir que una clase es una plantilla genérica para un conjunto de objetos de similares características.

Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En realidad no existe diferencia entre un objeto y una instancia. Sólo que el objeto es un término más general, pero los objetos y las instancias son ambas representación de una clase.

Instancia

Una instancia es un objeto de una clase en particular.

Debido a que el análisis y diseño orientado a objetos esta fuertemente relacionado con la programación orientada a objetos. Seis ideas básicas caracterizan a la Programación Orientada a Objetos (POO):

1.-Objetos
2.-Clases
3.-Mensajes
4.-Encapsulación
5.-Herencia
6.-Polimorfismo

Que ventajas nos ofrece el Lenguaje Orientado a Objetos.

  • Fomenta la reutilización y extensión del código.
  • Permite crear sistemas más complejos.
  • Relacionar el sistema al mundo real.
  • Facilita la creación de programas visuales.
  • Construcción de prototipos
  • Agiliza el desarrollo de software
  • Facilita el trabajo en equipo
  • Facilita el mantenimiento del software

Entre los lenguajes orientados a objetos destacan los siguientes:

Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la POO con otros paradigmas.

Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico.

Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo.

También es necesario recalcar que en la programación orientada a objetos es factible de utilizar en JavaScript.

Lo interesante de la POO es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible.

Componentes Genéricos.

El numero final de módulos u objetos es menor que el numero de datos y funciones. Esto reduce la complejidad de la aplicación, ya que el programador piensa en menos componentes a la vez, descantando detalles innecesarios.

Extensibilidad

Otro aspecto fundamental de un sistema es su extensibilidad, la cual corresponde a la facilidad en modificar un sistema durante el transcurso de su vida. La necesidad de extensibilidad nos lleva a cuestionarnos, preguntas tales como: cuando se vuelve mas costoso mantener un sistema de software que crear uno nuevo?

Los Sistemas compuestos por múltiples módulos facilitan esta extensibilidad dado que los cambios en el sistema se pueden, generalmente, reducir a cambios en módulos particulares y no en todo el sistema a la vez. Con la programación orientada a objetos, los cambios se dan a dos niveles:

ð Modificación externa a un objeto.

ð Modificación interna de los objetos.

Los cambios internos de los objetos afectan principalmente al propio objeto, mientras que los cambios externos de los objetos repercuten de mayor manera en el resto del sistema.

Reutilización.

La reutilización o réuso de componentes es otro de los mecanismos importantes para administrar la complejidad del software. La reutilización reduce el tiempo de diseño, codificación y costo del sistema al amortizar el esfuerzo sobre varios desarrollos. Mediante la reutilización se aprovechan componentes o bibliotecas ya desarrolladas, logrando una mayor estandarización y simplificación en las aplicaciones. Aunque es posible la reutilización por medio de lenguajes tradicionales, los lenguajes orientados a objetos aumentan sustancialmente las posibilidades de reutilización gracias a la mayor modularidad de los sistemas. En general, el mayor problema de la reutilización radica en construir componentes genéricos, sencillos, con interfaces bien definidas y que puedan utilizarse en varias áreas de la aplicación.

El esfuerzo para construir componentes genéricos es, por lo general, mucho mayor que para construir componentes específicos para una aplicación particular. Con la orientación a objetos, el objeto es la unidad de réuso mas pequeña, lo que permite aprovechar definiciones similares de objetos dentro d lamisca aplicación, o incluso entre distintas aplicaciones. Al agrupar objetos similares, se puede lograr la reutilización de componentes de más alto nivel. También se pueden aprovechar objetos con estructuras de datos y funciones similares, definiendo una sola vez los aspectos comunes y especializándolos en objetos adicionales. Todo esto es para del mecanismo de herencia en la orientación a objetos. A un nivel más amplio existen marcos de aplicación (frameworks), donde una aplicación genérica en un dominio particular se especializa según las necesidades de diferentes empresas, algo que ha sido muy exitoso en el ámbito de la planificación de recursos empresariales (ERP- Enterprise Resource Planning). Al definir una aplicación en términos suficientemente abstractos o generales, se puede, en teoría, especializar su comportamiento sin hacer ningún cambio en la estructura básica de los componentes y de la propia aplicación, lo que permite extender de manera radical su utilidad. Seria el elixir de la ingeniería de software crear nuevas aplicaciones sin escribir una sola línea de código, solamente integrando componentes ya existentes.

Dado que para lograr grandes niveles de réuso, existe en la actualidad un esfuerzo muy importante mediante patrones de diseño, los cuales están encaminados a solucionar aspectos particulares de las arquitecturas de software.

Los componentes genéricos o plantillas facilitan la reutilización del software.

Componentes Genéricos de Software

¿Qué se puede generalizar?

ð Subprogramas (swap, suma, etc.).

ð Estructuras de datos comunes (pilas, árboles).

ð Algoritmos (ordenación, búsquedas).

Módulos Genéricos.

ð Unidades Genéricas (plantillas) para generar módulos (objetos o programas).

ð Se puede decir que tienen unos “huecos” que se deben rellenar: Parámetros genéricos formales.

ð Instanciando la unidad genérica conseguimos una modulo que se puede utilizar directamente: Parámetros genéricos reales.


Proceso de Analisis Orientado a Objetos

Las características fundamentales de un proyecto con éxito:

ð Buena visión arquitectónica

· No existe ningún camino bien definido para idear una arquitectura. Tan solo se pueden definir los atributos de una buena arquitectura: Capas de abstracción bien definida, Clara separación de intereses entre interfaz e implementación, Arquitectura simple.

· Es necesario distinguir entre decisiones estratégicas y tácticas.

· Decisiones estratégicas es aquella que tiene amplias implicaciones estratégicas e involucra así a la organización de las estructuras de la arquitectura al nivel mas alto.

· Decisiones tácticas son las que solo tienen implicaciones arquitectónicas locales, es decir solo involucran a los detalles de interfaz e implementación de una clase.

ð Ciclo de vida incremental e iterativo

· Los ciclos de desarrollo no deben ser anárquicos ni excesivamente rígidos.

· Cada pasada por un ciclo análisis/diseño/evolución lleva a refinar gradualmente las decisiones estratégicas y tácticas, convergiendo en ultima instancia hacia una solución con los requisitos reales de los usuarios finales (habitualmente no expresados explícitamente por estos).

El Proceso de Desarrollo de Software Modelo en cascada

Fig. 10 La siguiente figura nos muestra el Modelo de Cascada

El Proceso de Desarrollo de Software Modelo en Espiral.

Fig. 11 La siguiente figura nos muestra el Modelo en Espiral


Detalle de un proceso de Desarrollo de Software

Aunque el proceso es iterativo el orden de los pasos fundamentales es el siguiente:

ð Análisis:

o Características comunes de los documentos

o Documentos de análisis

o Especificación de requisitos o requerimientos

o Diagramas de casos de uso, Escenarios y sub-escenarios, Prototipos.

ð Diseño (preliminar y detallado)

o Modelo de Clases, Objetos y mecanismos de colaboración

o Diagramas de interacción

- Diagrama de secuencia

- Diagrama de colaboración

o Diagramas de Clases y consulta de patrones de diseño.

o Diagramas de objetos.

o Modelado del comportamiento de clases y objetos

o Diagramas de actividades

o Diagramas de estados

o Contracción del modelo físico

o Diagramas de componentes

o Diagramas de Despliegue

ð Implementación

o Las decisiones iniciales de implementación se toman a partir de los diagramas de componentes y de despliegue.

o Se implementan las clases de un componente a partir de los diagramas de clases y diagramas de objetos.

o A partir de los diagramas de actividades y de los diagramas de estados se implementa el comportamiento de los métodos de cada clase.

ð Prueba

o Prueba unitaria de cada clase

o Prueba de módulos.

o Prueba de integración se realiza siguiendo los escenarios, diagramas de interacción, actividades y estados.

ð Mantenimiento

o Informes de errores

o Nueva especificación de requisitos. Nueva versión.

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio