Definitivo introduccion a poo

Page 1

Introducci贸n a POO Diciembre 2008

Jose A. Garc铆a jagarcia@siteframe.tk


Ingenieria del software Ingeniería de software es la disciplina o área de la informática que ofrece métodos y técnicas para desarrollar y mantener software de calidad. ¿Qué es calidad? Un software de calidad debe hacer lo que se espera de el, responder a las espectativas del cliente, hacerlo dentro de los plazos correctos, actuar de forma controlada en todos los casos, acotando los errores y haciendo posible la reusabilidad y la gestión del conocimiento. Desde un punto de vista práctico este enfoque choca frontalmente con 3 obstaculos. 1. La complejidad de Software Paradigmas de desarrollo 2. La especificación de los requisitos 3. La estimación de proyectos Lenguaje unificado de modelado Patrones de diseño Procesos de desarrollo de software


Problema 1 : La complejidad del software Un Software complejo es dificilmente gestionable, tiene una alta dependencia de los programadores, es dif铆cil de probar, de modificar, comprender y por tanto mantener. La lucha contra la complejidad del software a dado lugar a la aparici贸n de numerosos paradigmas de desarrollo.


Introducción: Paradigmas de desarrollo Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro. Desde un punto de vista práctico los paradigmas de desarrollo son las formas con la que las ciencias de la computación intentan modelar y dar solución a los problemas de la vida real.


Introducción: Paradigmas de desarrollo Paradigmas procedimentales u operacionales La característica fundamental de estos paradigmas es la secuencia computacional realizada etapa a etapa para resolver el problema. Su mayor dificultad reside en determinar si el valor computado es una solución correcta del problema, por lo que se han desarrollado multitud de técnicas de depuración y verificación para probar la corrección de los problemas desarrollados basándose en este tipo de paradigmas. PARADIGMAS DE DESARROLLO FUNCI ONALE S

PROCE DIMEN TALES DECLA RATIV OS

HEURI STICOS CONC URREN TES


Paradigma Imperativo La programación imperativa es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican a la máquina cómo realizar una tarea. La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing.


Paradigma Imperativo Procedimental la programación se divide en bloques (procedimientos y funciones) que pueden o no comunicarse entre sí. Además la programación se controla con secuencia, selección e iteración. Permite reutilizar código programado y otorga una mejor compresión de la programación.


Paradigma Imperativo Modular La programación modular es un paradigma de programación que consiste en dividir un programa en módulos ó subprogramas con el fin de hacerlo más legible y manejable. Se presenta históricamente como una evolución de la programación Procedimental para solucionar problemas de programación más grandes y complejos de lo que ésta puede resolver. Al aplicar la programación modular, un problema complejo debe ser dividido en varios subproblemas más simples, y estos a su vez en otros subproblemas más simples. Esto debe hacerse hasta obtener subproblemas lo suficientemente simples como para poder ser resueltos fácilmente con algún lenguaje de programación. Ésta técnica se llama refinamiento sucesivo, divide y vencerás ó análisis descendente (Top-Down). Esto es un claro antecedente a la POO


Modularidad


Paradigma dirigida por eventos La programaciรณn dirigida por eventos es un paradigma de programaciรณn en el que tanto la estructura como la ejecuciรณn de los programas van determinados por los sucesos que ocurran en el sistema o que ellos mismos provoquen. Para entender la programaciรณn dirigida por eventos, podemos oponerla a lo que no es: mientras en la programaciรณn secuencial es el programador el que define cuรกl va a ser el flujo del programa, en la programaciรณn dirigida por eventos serรก el propio usuario --o lo que sea que estรฉ accionando el programa-- el que dirija el flujo del programa. Aunque en la programaciรณn secuencial puede haber intervenciรณn de un agente externo al programa, estas intervenciones ocurrirรกn cuando el programador lo haya determinado, y no en cualquier momento como puede ser en el caso de la programaciรณn dirigida por eventos.

Esto es un claro antecedente a la POO


Paradigmas orientados a objetos • El Análisis Orientado a Objetos (AOO) se basa en considerar la solución a un problema no como una secuencia de ordenes sino como un conjunto de mensajes que intercambian los objetos que modelan al problema. • Este enfoque pretende conseguir modelos que se ajusten mejor al problema real, a partir del conocimiento del llamado dominio del problema, evitando que influyan en el análisis consideraciones de que estamos analizando un sistema para implementarlo en un ordenador.


Paradigmas orientados a objetos


Conceptos bรกsicos โ ข Un objeto empaqueta datos (una representaciรณn concreta) y procedimientos que operan sobre los datos.


Conceptos bĂĄsicos Nombre

Datos/Atributos/Campos

MĂŠtodos/Servicios/Interfaz


Conceptos básicos • El envío de mensajes es la única forma para que un objeto realice una operación. • Los métodos son la única forma para cambiar el estado de los datos. • Cuando esto se cumple, se dice que el estado interno del objeto (el valor de sus datos) está encapsulado; éste no puede ser manipulado directamente desde el exterior y su representación concreta es invisible.


A B S T R A C C I Ó N O P E R A C I O N A L

JAVA

Evolución Histórica Cód.Inst.Simb. Macros Subrutinas Funciones Anidamiento Subprogramas Encapsulam. Octult. Inform. Espec - Impl Métodos Mensajes

Lenguajes Máquina / Ensamblador

Id = Dir Mem. Manip.Total de Datos

FORTRAN

Id. Simb. Tipos Oper. restring.

PASCAL

Registros Tipos definidos Gest. Din. Mem

MODULA-2 ADA Lenguajes Orientados a Objetos

Tipo Abstracto de Datos Objetos

A B S T R A C C I Ó N D E D A T O S


A B S T R A C C I Ó N O P E R A C I O N A L

Evolución Histórica Cód.Inst.Simb. Macros Subrutinas Funciones Anidamiento Subprogramas Encapsulam. Octult. Inform. Espec - Impl

Métodos Mensajes

J2EE

Eventos Invocación remota

Lenguajes Máquina / Ensamblador FORTRAN

PASCAL

Id = Dir Mem. Manip.Total de Datos Id. Simb. Tipos Oper. restring. Registros Tipos definidos Gest. Din. Mem

MODULA-2 ADA

Tipo Abstracto de Datos

Lenguajes Orientados a Objetos

Objetos

COMPONENTES Componentes

A B S T R A C C I Ó N D E D A T O S


¿Qué es la Orientación a Objetos? • El concepto surge en los lenguajes de programación – Se organiza el software como una colección de objetos discretos que encapsulan » Estructuras de Datos y » Comportamiento.

– Un sistema OO funciona mediante la colaboración entre los objetos que se comunican entre sí.

• El concepto se extiende a los métodos de análisis y diseño – Se utilizan los objetos del mundo real como base para construir modelos – Los elementos que forman los sistemas del mundo real se corresponden con objetos software


Conceptos básicos • OO provee objetos como el principal medio para abstraer y estructurar un sistema. • Un objeto puede modelar entidades del mundo real, puede capturar abstracciones de fenómenos complejos, puede representar artefactos de software (pilas, gráficos, …).


Conceptos básicos • El contexto del problema se ve como objetos que interactúan entre ellos


Conceptos básicos • Ejemplo Enviar Flores [simple] – Suponga que Juan desea llevarle flores a una amiga en otra ciudad María –Como Juan no puede llevarlas personalmente, le encarga a su florista preferida (Rosa) el envío –María recibe sus flores


Conceptos básicos • Ejemplo Enviar Flores [detalle] –Juan le solicita a Rosa un servicio –Rosa sabe cómo prestarle el servicio a Juan –Juan sabe que Rosa presta el servicio que el necesita –Rosa es responsable de prestarle el servicio adecuadamente a Juan –Juan desconoce qué le implica a Rosa prestarle el servicio


Conceptos básicos • Ejemplo Enviar Flores [4] María

Mensajero

Arreglista

Juan

Productor

Recolector

Rosa

Florista Local


Conceptos básicos • En programación orientada por objetos un programa es una comunidad de agentes (objetos) que interactuan entre ellos. • Cada objeto tiene un rol en la solución del problema • Cada objeto provee un conjunto de servicios (o métodos) • Los servicios de un objeto son usados por otros objetos.


Conceptos básicos • La forma en que los objetos se comunican entre ellos es a través de mensajes: –Un mensaje encapsula la petición de un servicio –El receptor del mensaje presta el servicio y devuelve una respuesta al que solicitó el servicio


Conceptos básicos: ejemplo Un objeto ventana gráfica Ventana ejemplo

La ventana se sabe: • cerrar • abrir • cambiar de tamaño • pintar • mover Además, sabe: dónde está, si está visible o no ...

Qué sabe hacer la ventana? Cuáles servicios ofrece?


Conceptos básicos Ventana ejemplo

Objetos figuras geométricas: • un triángulo • un rectángulo • un círculo Las figuras geométricas se saben: • Pintar • agrandar .. Además, saben: dónde están, si están visibles o no ...

Qué saben hacer las figuras geométricas gráficas?


Conceptos básicos Ventana ejemplo

La ventana tiene la responsabilidad de solicitar a las figuras geométricas que se pinten

Las figuras geométricas tienen la responsabilidad de saberse pintar y de hacerlo cuando se lo soliciten

La ventana tiene que saber cómo hacer la solicitud. La figura geométrica tuvo que haber hecho público cómo usar sus servicios


Caracteristicas del AOO (1) •

Dominio del problema. – El paradigma OO es más que una forma de programar. Es una forma de pensar acerca de un problema en términos del mundo real en vez de en términos de un ordenador. El AOO permite analizar mejor el dominio del problema, sin pensar en términos de implementar el sistema en un ordenador. El AOO permite pasar directamente el dominio del problema al modelo del sistema.

Comunicación. – El concepto OO es más simple y está menos relacionado con la informática que el concepto de flujo de datos. Esto permite una mejor comunicación entre el analista y el experto en el dominio del problema (es decir, el cliente).

Consistencia. – Los objetos encapsulan tanto atributos como operaciones. Debido a esto, el AOO reduce la distancia entre el punto de vista de los datos y el punto de vista del proceso, dejando menos lugar a inconsistencias o disparidades entre ambos modelos.


Caracteristicas del AOO (2) •

Expresión de características comunes. – La herencia expresa explícitamente las características comunes de una serie de objetos que en otros enfoques quedan escondidas y llevan a duplicar entidades en el análisis y código en los programas. El paradigma OO proporciona mecanismos que permiten reutilizar aquello que es común, sin impedir por ello describir las diferencias.

Resistencia al cambio. – Los cambios en los requisitos afectan notablemente a la funcionalidad de un sistema y por tanto al software desarrollado con métodos estructurados. Los objetos que componen o maneja el sistema son mucho más estables. Las modificaciones necesarias para adaptar una aplicación basada en objetos a un cambio de requisitos suelen estar mucho más localizadas.

Reutilización. – Aparte de la reutilización interna, el paradigma OO desarrolla modelos mucho más próximos al mundo real, con lo que aumentan las posibilidades de reutilización. Es probable que en futuras aplicaciones nos encontremos con objetos iguales o similares a los de la actual.


Las clases y los objetos están en todas partes Vehículo Platero:Animal Animal

CLASE OBJETO Punto Figura

(1,3) (2,2) (2,1)

(5,2.5)


Conceptos bรกsicos


Conceptos básicos: CLASES y OBJETOS • CLASE – Atributos – Operaciones – Comportamiento 

OBJETO – Valores de los atributos – Estado – Identidad

Lavadora marca modelo capacidad: integer ... Programar PonerRopa CerrarPuerta Lavar ID:Lavadora marca=“Lapava” capacidad=5 estado=centrifugando


Conceptos básicos: PASO DE MENSAJES • Invocación de métodos • Medio de colaboración entre objetos

Conectar() :Televisor

:MandoADistancia Canal(4)


Conceptos básicos: ENCAPSULACIÓN • Ocultación de detalles • Concepto de Interfaz • Independencia Sens3 => Vol++ Sensor => VolUp => => DAC31.out=2.1 =>=>Settings.vol++ Amp27.gain=1.3 =>=>DAC23.out=0.7 OSD, Pref, ...


Conceptos básicos: HERENCIA • Generalización / Especialización • Los objetos “heredan” las características de la clase. • Las clases pueden heredar de otras clases. – Extensión. – Restricción. – Modificación.

• Utilidad: – Abstracción. – Reutilización. Lavadora Hormiga capacidad

Electrodoméstico tensión consumo Conectar Desconectar

Televisor numCanales

Plancha vapor


Conceptos básicos: POLIMORFISMO Permite al modelador hablar el lenguaje del cliente.  Evita asignar identificadores artificiosos para distinguir las operaciones.  Contribuye a la reutilización de código.  Ej: Operación “Enchufar” 

TomaDeCorriente tensión Enchufar(e:Electrodoméstico)


Polimorfismo • Una variable puede referirse a objetos de una clase distinta de la que se ha declarado • Restricción en base a la herencia


Conceptos básicos: ASOCIACION • Modela la relación entre objetos (necesaria para que se comuniquen y colaboren) • Asociación-Clase / Enlace-Objeto • 3 tipos: – Asociación – Herencia – Agregación / Composición (agregación fuerte) Coche

Motor

Árbol

Hoja


Conceptos b谩sicos: Algunos detalles de implementaci贸n


Clases

“Punto.hpp”

• Estructuras que encapsulan datos y funciones CONSTRUCTOR class Punto VARIABLES DE ESTADO { public: Punto(); (DATOS MIEMBRO) float x,y; void trasladar(float, float); void cambiar_x(float a){x=a;}; void cambiar_y(float b){y=b;}; float distancia(Punto); };

MÉTODOS (FUNCIONES MIEMBRO)


Clases y Objetos 

OBJETO = Instancia de una CLASE • Objeto (Clase)  Valor (Tipo) • • • •

Identidad Entidad dinámica Cada objeto tiene su propio estado Objetos de una clase comparten su comportamiento


Métodos y Mensajes • Métodos: definen el comportamiento de una clase Punto Estado e identidad x,y: float trasladar(a,b) distancia(pto)

Comportamiento

• Invocación de métodos: Paso de Mensajes trasladar(1,-1)

P1:Punto

obj.mens(args) X=2 Y=2


Colaboración entre objetos • Los objetos (clases) colaboran para resolver problemas. • La forma en que los objetos (clases) colaboran puede ser muy variada: – Asociación simple – Herencia – Agregación – Composición – ...


Agregaci贸n de objetos class Segmento { private Punto inicio,final; public Segmento(Punto p1,p2) {inicio = p1; final = p2;} public float longitud() {return inicio.distancia(final);} public void trasladar(float a,float b) {inicio.trasladar(a,b); final.trasladar(a,b);} }


Composici贸n de objetos public class Habitacion { private int numHabitacion; private int numCamas; // declaraci贸n de m茅todos ... } public class Hotel1 { Habitacion h1; Habitacion h2; // resto declaraciones ... h1 = new Habitacion( 222 ); }


Construcción y Destrucción • Diferentes mecanismos para la creación y la eliminación de objetos, dependiendo del lenguaje. • Construcción de objetos (reservar memoria): – Constructores (C++, Eiffel, Java) – Métodos de clase (Smalltalk)

• Eliminación de objetos (liberar memoria): – Destructores (C++) – Recolección automática de memoria –garbage collection- (Smalltalk, Eiffel, Java)


Construcciรณn y Destrucciรณn JAVA class Circulo extends Elipse { // extensiรณn, restricciรณn, modificaciรณn; public Circulo () { ... }; public Circulo (int radio) { ... }; } ... Circulo c1; ... c1 = new Circulo(4);


Herencia • Posibilidad de reutilizar código • Algo más que incluir ficheros o importar módulos Figura • Distintos tipos de herencia: – simple / múltiple – de implementación/de interfaz Polígono

• Limitaciones • Problemas Regular

Irregular

Elipse

Círculo


Herencia JAVA class Elipse extends Figura { // extensión, restricción, modificación } C++ class Elipse : public Figura { // extensión, restricción, modificación } Smalltalk Figura subclass: #Elipse ”extensión, restricción, modificación” Python class Elipse (Figura) ”extensión, restricción, modificación”


Ejercicio calculadora L


Paradigmas de desarrollo: MAS


Paradigmas de desarrollo: MAS


Metafora de la descomposición dominante

• •

Descomponer por forma, por color, por tamaño. Nos vemos obligados a elegir un modelo como principal.


Distintos Modelos •

Ordenado por Forma

•

Ordenado por Color


Jerarquía Color-Forma •

Nos vemos obligados a elegir un modelo como principal. En este caso: color, y luego forma


Problemática Actual

• Un sistema complejo puede verse como una implementación combinada de múltiples áreas de interés (concerns)


Problemática Actual Clase Libro { ….. <todas las cosas de libro> <manejo de errores> … }

Clase Socio { ….. <todas las cosas de socio> <manejo de errores> <controles de acceso> }

Clase Alquiler {….. <todas las cosas de alquiler> <manejo de errores> <controles de acceso> }


Biblioteca Class Biblioteca { private libro [] libros ; private socio [] socios; public Biblioteca() { … public void prestamo( socio S, libro L) { if controlDeAccesoValido() then{ // código del método } else{ generarExcepcion(); } }

Control de acceso Funcionalidad básica public void ingresarSocio(socio S){ if controlDeAccesoValido() then{ // código del método } else{ generarExcepcion(); } } // demás métodos… }


Paradigma orientado a aspectos • Fue presentada en público por Gregor Kickzales y su equipo de investigación de Palo Alto Research Center en 1996. • “ Un aspecto es una unidad modular que se disemina por la estructura de otras unidades funcionales. Los aspectos existen tanto en la etapa de diseño como en la de implementación…”


Definición de Aspecto • Un aspecto de diseño es una unidad modular del diseño que se entremezcla en la estructura de otras partes del diseño. Un aspecto de programa o de código es una unidad modular del programa que aparece en otras unidades modulares del programa (G. Kiczales) ”


POA •

La POA promueve la separación de conceptos a través de mecanismos, que permiten abstraer y componer estos conceptos a lo largo del sistema.

Un aspecto es un concepto que no es posible encapsularlo claramente, y que resulta diseminado por todo el código.

Un aspecto será la unidad que encapsulará un concepto entrecruzado.


Estructura Tradicional PROGRAMA

Lenguaje

Compilador o IntĂŠrprete

EJECUTABLE


Estructura POA PROGRAMA DE COMPONENTES

Lenguaje base

PROGRAMA DE ASPECTOS 1

Lenguaje de aspectos 1

... ...

TEJEDOR (WEAVER)

EJECUTABLE

PROGRAMA DE ASPECTOS N

Lenguaje de aspectos N


Ejemplo Estructura POA Modelo de objetos

Aspecto de gestión de memoria

Aspecto de sincronización

Programa

Aspecto de gestión de errores

Aspecto de distribución


Esquema POA


Conceptos Básicos de POA Punto de unión (Join Point) Punto de corte (Pointcut) Punto de ejecución (Advice) Aspecto (Aspect)

Una posición bien definida dentro del código orientado a objetos, por ejemplo, la declaración de un método. Un conjunto de condiciones aplicadas a un punto de unión que, al cumplirse, activarán el punto de corte y se ejecutará el punto de ejecución asignado a dicho punto de corte. Fragmento de código que se ejecuta cuando se activa un punto de corte. La combinación de puntos de corte, puntos de unión y puntos de ejecución.


PseudoCodigo definici贸n de un aspecto Aspecto Control { Punto de enlace operacionesSeguras = llamadas a Biblioteca.prestamo & llamadas a Biblioteca.ingresarSocio& ... antes de operacionesSeguras: { if !=(controlDeAccesoValido()) then{ generarExcepcion(); } }


Relación POA y POO POO: conceptos comunes

Clase A

Clase A1 Attb1

POA: conceptos entrecruzados

Clase A2 Attb 3

Attb2 Método 1 Método 1

Método 2


Evolución de la POO en la POA Clases Clase A

Clase B

Comportamiento propio

Comportamiento propio

Clase A

Clase B

Comportamiento propio

Comportamiento propio

Persistencia Traza Persistencia ……..

Traza Aspectos


Ventajas de la POA • Un código menos enmarañado, más natural y más reducido. • Mayor facilidad para razonar sobre los conceptos, ya que están separados y las dependencias entre ellos son mínimas. • Un código más fácil de depurar y más fácil de mantener.


Herramientas POA • Lenguajes para programar Aspectos: • AspectJ: Extensión a Java para aplicar aspectos. La más popular. • AspectC++, AspectS, CAESAR.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.