You are on page 1of 12

De Problemas a Soluciones

Half the battle is knowing what problem to


solve
Data Structures and Algorithms
La Programacin Orientada a Objetos: (A.A. Aho, J.E. Hopcroft & J.D. Ullman)
Introduccin

Prof. Franco Guidi Polanco


Escuela de Ingeniera Industrial
Pontificia Universidad Catlica de Valparaso, Chile
fguidi@ucv.cl

Actualizacin: 02 de agosto de 2007 De http://pbfcomics.com/


Franco Guidi Polanco (PUCV-EII) 02/08/2007 2

De Problemas a Soluciones Los Requerimientos

Anlisis: entender el problema y sus Los requerimientos:


requerimientos son incompletos
usualmente estn equivocados
Diseo: determinar un modelo que nos permita son engaosos (y los usuarios
resolver el problema. tambin)
no cuentan la historia completa
Implementacin: determinar la forma de
representar el modelo que describe el problema (y
la solucin): Por lo tanto, los
requerimientos siempre
cambian

Franco Guidi Polanco (PUCV-EII) 02/08/2007 3 Franco Guidi Polanco (PUCV-EII) 02/08/2007 4
El Desarrollo de Proyectos Metodologas y Modelos

La Ingeniera de Software provee:


Se estudiarn
Metodologas de desarrollo.
en detalle
Desarrollo en cascada
en curso de
Proceso Unificado
etc.
Modelamiento
de Sistemas
1 Lo que propuso el
comit de proyecto
2 Lo que se especific
como requerimiento
3 Lo que dise
el analista
Modelos para soportar el desarrollo
Especificacin estructurada (DFDs, MER, etc.)
UML
etc.

Lenguajes para la implementacin


C, C++
Java
4 Lo que desarrollaron
5 Lo que se instal 6 Lo que necesitaba etc.
los programadores al usuario el usuario

Franco Guidi Polanco (PUCV-EII) 02/08/2007 5 Franco Guidi Polanco (PUCV-EII) 02/08/2007 6

Cecilia Serrano
(Miss Chile 1979) Divide et Impera: Descomposicin Funcional

Divide et Impera
The Beatles
Descomposicin en funciones:
el analista descompone el
Grease
problema en una serie de pasos
que permiten resolverlo.

Los pasos son refinados


sucesivamente, hasta llegar a
Antes de la Programacin funciones elementales.
Orientada a Objetos
Costo?
Teleserie de Cara
al Maana
(1982)
1a Teletn (1978) Franco Guidi Polanco (PUCV-EII) 02/08/2007 8
Descomposicin Funcional La Encapsulacin como Agrupacin de Funciones
...
ingresarDatos(datos); La encapsulacin permite la agrupacin de ideas
relacionadas en una unidad, la que posteriormente puede
calcularMedia(datos, media);
calcularDE(datos, de);
ser referida por un solo nombre.
mostrarResultados(media, de);
...
procedimiento ingresarDatos(datos:arreglo)
{
i=0;
mientras i <= 10 hacer
{
El concepto surgi en la dcada del 40 con la invencin de
leer datos[i]
i = i + 1;
la subrutina: los programadores se dieron cuenta de que
}
}
un mismo patrn de instrucciones se poda repetir muchas
procedimiento calcularMedia(datos:arreglo, media:float) veces en un programa.
{
i=0;
suma = 0;
mientras i <= 10 hacer
{
suma = suma + datos[i]
i = i + 1;
}
media = suma / 10
}
...

Franco Guidi Polanco (PUCV-EII) 02/08/2007 9 Franco Guidi Polanco (PUCV-EII) 02/08/2007 10

Descomposicin Funcional: Reutilizacin de


Ventajas de Funciones o Subrutinas
Cdigo
Ahorro de memoria de computador (cdigo fuente de
Programa original Programa con subrutina programas ms corto).
. .
. .
i=1 HacerCeros(a)
Cdigo fuente ms entendible: una subrutina agrupa un
mientras i<=10 hacer
{ .
.
conjunto de instrucciones en un concepto que una
si a[i]=10 entonces a[i]=0
i=i+1 .
} HacerCeros(b)
.
.
. persona puede considerar y manejar como una sola idea
.
i=1
mientras i<=10 hacer
. (en el ejemplo, HacerCeros).
{ HacerCeros(c)
si b[i]=10 entonces b[i]=0 .
i=i+1 .
} .
.
. Procedimiento
i=1 HacerCeros(x:arreglo)
mientras i<=10 hacer i=1
{ mientras i<=10 hacer
si c[i]=10 entonces c[i]=0
i=i+1 {
} si x[i]=10 entonces x[i]=0
. i=i+1
}

Franco Guidi Polanco (PUCV-EII) 02/08/2007 11 Franco Guidi Polanco (PUCV-EII) 02/08/2007 12
Reutilizacin antes de la POO: Tipos Abstractos de
Lenguajes de Programacin
Datos
Antes de la POO los lenguajes de programacin
eran procedimentales.
Aproximacin: NOTA:
NO LO INTENTE
ADT Tipo de dato
(No provisto por
+ Operaciones
(Abstract
Imagine
Data Type) el lenguaje de
programar en programacin)
Java, usando
slo mtodos Por separado, pero asociadas.
estticos, con
instancias de
clases que no
tengan mtodos.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 13 Franco Guidi Polanco (PUCV-EII) 02/08/2007 14

La Programacin Orientada a Objetos (POO)


Pulp Fiction
Q. Tarantino (1994)
El paradigma de la Orientacin a Objetos es sucesor de la
Tragedia Transbordador Challenger descomposicin funcional
(1986)

Se centra en el concepto de Objeto:


Tim Berners-Lee
(CERN-1989)

Objeto = Datos + Mtodos


La Programacin (Definicin tradicional)
Los objetos:
Orientada a Objetos son responsables de si mismos.
saben de qu tipo son.
conocen su propio estado (datos).
Cecilia Bolocco contienen el cdigo que les permite actuar.
Miss Universo (1987)
Derrumbe
Muro Berln (09/09/1989) Franco Guidi Polanco (PUCV-EII) 02/08/2007 16
POO versus Descomposicin Funcional Cmo identificar Objetos?

El modelo de programacin funcional mantena En problemas pequeos una tcnica sencilla se


centralizadas las responsabilidades: basa en la identificacin de sustantivos y verbos :
Una cena en la cual un garzn pide a cada comensal lo que se
servir, y luego les trae los platos solicitados. Los sustantivos pueden ser objetos
Los verbos pueden ser mtodos

El modelo de programacin OO
provee delegacin de
responsabilidades:

Una cena en la cual a los comensales


se les indica la distribucin del buffet.
Ellos se sirven a su propio gusto.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 17 Franco Guidi Polanco (PUCV-EII) 02/08/2007 18

Objetos Visin de Objetos

Una buena forma de concebir un objeto es pensar en l Martin Fowler identifica tres perspectivas para describir los
como una entidad con responsabilidades. Las objetos:
responsabilidades determinan el comportamiento del
objeto. Nivel conceptual: un objeto es un conjunto de responsabilidades.
Debe existir una forma para comunicar a un objeto qu
debe hacer. Nivel especificacin: un objeto es un
conjunto de mtodos
Esta comunicacin se logra por medio del conjunto de (comportamientos), que pueden ser
mtodos que un objeto ofrece para que otros puedan invocados por otros objetos o por si
invocar. mismos.
El conjunto de estos mtodos se denomina interfaz pblica
Nivel implementacin: un objeto es
del objeto.
cdigo y datos, e interacciones
computaconales entre ellos.

Martin Fowler
Franco Guidi Polanco (PUCV-EII) 02/08/2007 19 Franco Guidi Polanco (PUCV-EII) 02/08/2007 20
Perspectivas para Describir Sistemas OO Perspectivas para Describir Sistemas OO: Ejemplo

Sistema de docencia, que mantiene datos de


alumnos y registra sus inscripciones en
cursos.
Nivel Conceptual Anlisis

Diseo (Lenguajes de
Nivel Especificacin modelamiento e.g. UML)
Nivel Conceptual

Codificacin (Lenguajes de Nivel Especificacin


programacin e.g. Java, C++, C#, etc.) Nivel Implementacin

Nivel Implementacin

Franco Guidi Polanco (PUCV-EII) 02/08/2007 21 Franco Guidi Polanco (PUCV-EII) 02/08/2007 22

Ejemplo: Nivel Conceptual Ejemplo: Nivel Especificacin

Responsabilidades: Clase Alumno:

public setRol(numero: int, verificador: int)


Alumno: public setNombre( nombre: String)
Mantener datos de un alumno (rol y nombre). Debe validar el rol public getRol(): String
del alumno.
public getNombre(): String

Curso:
Clase Curso:
Mantener datos de un curso (nombre)
Mantener la lista de los alumnos que se inscriben en el curso, public setNombre(nombre: String)
verificando que estos no se repitan al momento de agregarlos. public addAlumno(alumno:Alumno):boolean
Retornar alumnos, buscndolos por rol del alumno. public getAlumno(rol: String):Alumno

Franco Guidi Polanco (PUCV-EII) 02/08/2007 23 Franco Guidi Polanco (PUCV-EII) 02/08/2007 24
Es necesario tomar precauciones, si el anlisis
Ejemplo: Nivel Implementacin
inicial est bien hecho?
public class Alumno{
private String rol, nombre;
public void setRol(int numero, int verificador){
if( sumaDigitos(numero) == verificador )

All systems change during their life cycles. This


this.rol = rol +-+verificador;
}
public void setNombre(Sting nombre){
this.nombre = nombre; public class Curso{ must be borne in mind when developing systems
}
public String getRol(){
private String nombre;
private Vector alumnos; expected to last longer than the first version.
return rol;
} public void setNombre(String nombre){
public String getNombre(){ this.nombre = nombre;
return nombre; }
} Ivar Jacobson.
public boolean addAlumno(Alumno alumno){
private int sumaDigitos(int numero){if( getAlumno( alumno.getRol() )== null ){ Object Oriented Software Engineering a Use Case
...
}
alumnos.add( alumno ); Driven Approach,
return true;
} } Addison Wesley, 1992,
return false;
}
public Alumno getAlumno(String rol){
...
}
}

Franco Guidi Polanco (PUCV-EII) 02/08/2007 25 Franco Guidi Polanco (PUCV-EII) 02/08/2007 26

POO y Encapsulacin Encapsulacin como Ocultamiento de Datos

Tradicionalmente se asocia a ocultamiento de Ejemplo: El contexto de la


datos (estado) de un objeto. clase Punto no
public class Punto{
private int coordA, coordB;
tiene visibilidad de
cmo sta
Sin embargo, se refiere adems a ocultamiento public void setXY(int x, int y){
coordA = x; almacena sus
de: coordB = y;
datos.
}
implementacin de mtodos public int getX(){
tipo, clases derivadas return coordA; Consecuencia:
} Puede modificarse
detalles de diseo public int getY(){ el conjunto de
reglas de instanciacin }
return coordB;
variables de la
} clase Punto, sin
que esto afecte su
contexto.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 27 Franco Guidi Polanco (PUCV-EII) 02/08/2007 28
Encapsulacin en la Implementacin de Mtodos Encapsulacin del Tipo

Ejemplo: Ejemplo El contexto de


las figuras no tiene
public class Angle{ El contexto de la Figura visibilidad de cul
clase Angle no
Contexto de ellas est
private double angle;
tiene visibilidad +dibujar()
+rellenar() exactamente
del algoritmo de
public void setAngle(double a){ +ocultar() utilizando.
angle = a; clculo del seno
}
del ngulo Consecuencia:
public double getSin(){ El contexto puede
// Clculo mediante series de Consecuencia: Rombo Cuadrado Crculo implementar una
// Taylor Puede modificarse lgica comn para
... +dibujar() +dibujar() +dibujar()
la implementacin +rellenar() +rellenar() +rellenar() utilizar cualquiera
}
del mtodo sin +ocultar() +ocultar() +ocultar() de las figuras (o
} afectar al contexto. cualquier nueva
subclase).
Franco Guidi Polanco (PUCV-EII) 02/08/2007 29 Franco Guidi Polanco (PUCV-EII) 02/08/2007 30

Encapsulacin de Detalles de Diseo Encapsulacin de Reglas de Instanciacin

Ejemplo Ejemplo
El contexto de la public class LeonardoDaVinci{ El contexto de la
Banco
clase Banco no clase no tiene
Contexto private static LeonardoDaVinci instance;
+recibirCliente() tiene visibilidad de visibilidad de la
+atenderSiguiente() las clases que
private LeonardoDaVinci(){} lgica de
soportan sus public static LeonardoDaVinci getLeonardo(){ instanciacin de
if( instance == null ) objetos
operaciones. instance = new LeonardoDaVinci();
Cola Cajero } LeonardoDaVinci.
Consecuencia: return instance;
Puede modificarse } Consecuencias?
+agregar() +atender() public String writeName(){
+sacar() la arquitectura return odranoeL;
del Banco sin }
...
afectar el contexto. }

Franco Guidi Polanco (PUCV-EII) 02/08/2007 31 Franco Guidi Polanco (PUCV-EII) 02/08/2007 32
Encapsulacin y Diseo Encapsulacin y Diseo

Muchos patrones de diseo (soluciones a


Ante especificaciones variables y sistemas problemas comunes de diseo) utilizan la
que evolucionan... encapsulacin de tipos para crear capas de
separacin entre objetos.

... podemos lograr un buen La separacin se crea asignando


diseo? referencias a clases abstractas o
interfaces.

S, encontrando qu cosas pueden variar en


Esto permite modificar alguno de los
el diseo y encapsulndolas lados de la capa de separacin, sin
afectar a la otra.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 33 Franco Guidi Polanco (PUCV-EII) 02/08/2007 34

El principio abierto-cerrado El principio abierto-cerrado

En el libro Object Oriented Software Sntomas de un mal diseo (cuando no se cumple este
Construction de 1988, Bertrand Meyer principio):
propuso el Open-Closed Principle (OCP) Al modificar un mdulo de software, los cambios se propagan a
otros mdulos.
Las entidades de software (clases, Por lo tanto:
mdulos, funciones, etc.) deberan Se deben disear mdulos que nunca cambiarn.
estar abiertos para extensin y Si los requerimientos cambian, se debe extender el comportamiento
cerrados para modificaciones. Bertrand Meyer de tales mdulos, agregando nuevo cdigo, no modificando aqul
existente.
En otras palabras, el software debe ser diseado para soportar la adicin La base de este principio est en los conceptos de:
de nuevas funcionalidades, sin que esto comporte modificaciones en
Abstraccin
aquellas existentes.
Polimorfismo

No es siempre posible seguir completamente este principio.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 35 Franco Guidi Polanco (PUCV-EII) 02/08/2007 36
El principio abierto-cerrado El principio abierto-cerrado

Los mdulos desarrollados bajo este principio Aqu no se respeta el principio:


tienen dos caractersticas: Personaje
Estn abiertos para extensin: el comportamiento del
mdulo puede ser extendido, a fin de lograr un nuevo
public void pinta(Personaje p){ Hroe Enemigo
comportamiento, impusto por nuevos requerimientos de if( seRequierePintar ){
la misma o de otra aplicacin. if( p instance of Hroe)
pintaHeroe((Hroe) p);
Estn cerrados para modificaciones: el cdigo fuente else if(p instance of Enemigo) Dibujador
pintaEnemigo((Enemigo) p);
de un mdulo existente no debe ser alterado. }
pinta(Personaje p)
} pintaHroe(Hroe p)
pintaEnemigo(Enemigo p)

Qu pasa si es necesario agregar un nuevo tipo de


personaje (ej. un Mago)?

Franco Guidi Polanco (PUCV-EII) 02/08/2007 37 Franco Guidi Polanco (PUCV-EII) 02/08/2007 38

El principio abierto-cerrado Consecuencias del principio abiertocerrado

Aqu si es respetado el principio: Regla de diseo: Establecer visibilidad privada


a variables de instancia.
Personaje
Dibujador
pinta() Los conceptos de abstraccin y polimorfismo del
pinta(Personaje p)
principio abierto-cerrado estn asociados a la
Hroe Enemigo especificacin de jerarquas de herencia.
public void pinta(Personaje p){
if( seRequierePintar )
p.pinta(); pinta() pinta()

}
Hay algo que decir respecto de las jerarquas de
herencia? (Veamos el principio de sustitucin de
Es posible agregar nuevos objetos a pintar (agregando una Liskov)
subclase de Personaje), sin modificar el cdigo ya existente

Franco Guidi Polanco (PUCV-EII) 02/08/2007 39 Franco Guidi Polanco (PUCV-EII) 02/08/2007 40
El principio de sustitucin de Liskov El principio de sustitucin de Liskov

Barbara Liskov, en Data Abstraction and Hierarchy, SIGPLAN Notices, Ejemplo:


23, 5 (May 1988) estableci lo que hoy se conoce como el Liskov
Substitution Principle (LSP):

Programador Vehculo
Las funciones que utilizan punteros
o referencias a clases de base, deben
ser capaces de utilizar subclases de Areo Terrestre
stas, sin necesidad de conocerlas

Esto es: Bus Tren


Cualquier propiedad que sea cierta para una
sperclase, debe serlo tambin para sus
subclases.
Un cliente de una clase debe funcionar
correctamente con cualquier subclase de sta La clase Programador debe funcionar correctamente con la
ltima. Barbara Liskov clase Vehculo, o con cualquier subclase de ella
Franco Guidi Polanco (PUCV-EII) 02/08/2007 41 Franco Guidi Polanco (PUCV-EII) 02/08/2007 42

El principio de sustitucin de Liskov El principio de inversin de dependencia

El LSP se violara ante la presencia de situaciones como la El Dependency Inversion Principle (DIP) establece cmo implementar
siguiente: los objetivos enunciados por el OCP y el LSP.

Los mdulos de alto nivel no deberan depender de los


Programador Vehculo
mdulos de bajo nivel. Ambos deberan depender de
programa(vehiculo v) abstracciones.
Areo Terrestre Las abstracciones no deberan depender de detalles. Los
detalles deberan depender de abstracciones.
public void programa(Vehculo v){
if( v instance of Bus ){
throw new InvalidException(); Bus Tren
else
programaAutomtico(v);
}
}

Kandinsky Klee
Franco Guidi Polanco (PUCV-EII) 02/08/2007 43 Franco Guidi Polanco (PUCV-EII) 02/08/2007 44
El principio de inversin de dependencia El principio de inversin de dependencia

Propone la estategia de depender de abstracciones Aqu no se cumple el DIP:


(interfaces, funciones abstractas y/o clases public void copiar(LectorTeclado l, EscritorDisco e){
abstractas), en vez de depender de funciones y while( !l.eof){
byte b = l.leer();
clases concretas. e.escribir( b );
}
}

Copiador La lgica general del


copiador tiene
cableada la accin
sobre un LectorTeclado
LectorTeclado EscritorDisco y un EscritorDisco
Posibilidad de reutilizar
el cdigo del Copiador?

Franco Guidi Polanco (PUCV-EII) 02/08/2007 45 Franco Guidi Polanco (PUCV-EII) 02/08/2007 46

El principio de inversin de dependencia Despus de la OO... qu?

Aqu s se cumple: Los objetos ofrecen una interfaz pblica por medio
public void copiar(Lector l, Escritor e){
de la cual otros objetos invocan sus
while( !l.eof){ comportamientos.
byte b = l.leer();
e.escribir( b ); Los objetos son inherentemente reactivos: su
}
} comportamiento es gatillado por la accin (externa)
de otro objeto.
Copiador Nuevo paradigma: agentes de software.

Los agentes de software son unidades de software


Lector Escritor
con objetivos y responsabilidades.

Los agentes de software exhiben comportamiento


LectorTeclado EscritorDisco proactivo: un agente acta por cuenta propia sobre
el ambiente y sobre otros agentes para alcanzar sus
objetivos.

Franco Guidi Polanco (PUCV-EII) 02/08/2007 47 Franco Guidi Polanco (PUCV-EII) 02/08/2007 48

You might also like