You are on page 1of 44

P.O.O.

Programación Orientada a
Objetos
Contenidos
1. Evolución del Software
a) Programación No Estructurada
b) Programación Estructurada
c) Programación Orientada a Objetos
3. Modularidad
4. Problemas de la Programación Estructurada
5. La POO como solución
6. Modularidad en Java
Referencias
 http://www.javaworld.com
 http://java.sun.com
 http://www.gamelan.com
 http://www.mindview.net/Books/TIJ/index_html
 http://ootips.org
 http://www.objectmentor.com/resources/publishedArt
icles.html
Evolución del Software

Programación
Programación estructurada Programación
NO estructurada (o Procedimental) Orientada a Objetos

4
MODULARIDAD
Evolución del software

• Programación No Estructurada
• Programación Estructurada (Procedimental)

• Programación Orientada a Objetos (POO)


Programación no Estructurada
• Un solo bloque principal
• Típica de los lenguajes de bajo nivel
• Variables globales a todo el programa
• Problemas:
 Suelen contener secuencias de código repetidas
 Cualquier modificación en el programa  revisar todo
el software

PROGRAMA

Programa Principal

datos
Programación no estructurada
Función noEstructurada1
escribir(“Teclea dos números: “);
leer(a, b);
si (b = 0) entonces saltarA(eti3)
c2  1
da
eti2: si (c2 < b) entonces c1  0
sino saltarA(eti4)
fd
d0
eti1: dd+f
c1  c1 + 1
si (c1 < a) entonces saltarA(eti1)
¿Alguna duda sobre
c2  c2 + 1 por qué se le llama
saltarA(eti2) spaghetti code?
eti3: d 1
eti4: escribir(d)
Programación no estructurada
Función noEstructurada2
escribir(“Teclea dos números: “);
leer(base, exp);
si (exp = 0) entonces saltarA(eti3)
cont2  1
resul  base
eti2: si (cont2 < exp) entonces cont1  0
sino saltarA(eti4)
factor  resul
resul  0
eti1: resul  resul + factor
cont1  cont1 + 1
si (cont1 < base) entonces saltarA(eti1)
cont2  cont2 + 1
saltarA(eti2)
eti3: resul 1
eti4: escribir(resul)
Evolución de los lenguajes de programación
Función factorial
escribir(“Teclea dos números: “); leer(base, exp);
si (exp = 0) entonces
resul1;
sino
principio
resulbase; cont21;
mientras (cont2 < exp) hacer
principio Hay indentación y se
factorresul; resul0; cont10; evitan las etiquetas,
pero me sigue
mientras (cont1 < base) hacer pareciendo poco
principio legible
resulresul + factor;
cont1cont1 + 1;
fin
cont2cont2 + 1;
fin
escribir(resul);
fin
Programación Estructurada
• También llamada procedimental
• Variables globales, variables locales y parámetros

PROGRAMA

Programa Principal Programa


Principal
datos
Procedimiento1

Procedimiento2
Procedimiento1 Procedimiento2 Procedimiento3
Procedimiento3
Programación Estructurada
• Parte
del diseño top-down: descomponer los
requerimientos del programa paso a paso, hasta llegar
aun nivel que permite expresarlos mediante
procedimientos y funciones.

M1
abstracción

TOP-DOW
M2 M3 M4

M5 M6 M7 M8 M9

Lo principal es identificar la funcionalidad que se desea


programar y los datos necesarios para conseguirla
Programación estructurada
Programa principal
tipo parámetro
entero a, b, d;
pedir_numero(a); tipo resultado
pedir_numero(b); tipo variable local
d=potencia(a, b);
escribir(d);

Función potencia (a: entero, b: entero): entero


c: entero;
c1 ¡ Se entiende !
mientras(b>0) hacer
principio
cmultiplicar(a, c);
bb-1;
fin
devolver(c);
Programación estructurada
Función pedir_numero(): entero
escribir(“Teclea un número: “);
leer(a);
devolver(a);

Función multiplicar(a: entero, b: entero): entero


c: entero;
c0
mientras(b>0) hacer
principio
cc + a;
bb-1;
fin
devolver(c);
Modularidad
• Agrupar en módulos los procedimientos con una
funcionalidad común
• Cada módulo puede contener sus propios datos
• Ámbito de las variables

PROGRAMA

Programa Principal
datos

Módulo1 Módulo2
Datos + Datos1 Datos + Datos2

Proced1 Proced2 Proced3


Modularidad

 Modulo: unidad elemental para desarrollar


aplicaciones
Funcionales: subprogramas
Declarativos (datos + funcionalidad): TAD

 Modularidad: característica del Sw


Una aplicación grande se compone de varios
módulos
Los módulos deben ser independientes
En las aplicaciones se integrarán distintos módulos
que se comunican entre sí
Buen diseño  Separación de módulos
Modularidad

Es conveniente separar la especificación del módulo y su


implementación

Especificación: declaración del conjunto de


operaciones que se exportan (interfaz del módulo)
Implementación: parte del módulo que recoge la
estructura de los datos y la implementación de las
operaciones. Queda oculta
¿Por qué modular las aplicaciones?
El sistema está compuesto
Descomponer el problema en de una serie de módulos
partes más simples independientes
Descomposición Modular comunicados entre sí
Composición Modular
Facilitar la comprensión Las modificaciones debidas a
del sistema y de cada cambios en la especificación afectan
una de sus partes a un número reducido de módulos
Inteligibilidad Continuidad Modular

Si se produce un error
en un módulo, éste sólo
afecta a dicho módulo
Protección Modular
Programación Orientada a Objetos
• El término de Programación Orientada a Objetos
indica más una forma de diseño y una metodología de
desarrollo de software que un lenguaje de
programación, ya que en realidad se puede aplicar el
Diseño Orientado a Objetos a cualquier tipo de
lenguaje de programación.

• Toma en cuenta la programación estructurada, a la que


engloba, dotando al programador de nuevos elementos
para el análisis y desarrollo de Software.
Programación Orientada a Objetos
Paradigma de programación que define los programas en términos de
objetos.
Objeto
Entidad que combina:
Estado: datos
Comportamiento: métodos (procedimientos y funciones)
Identidad: propiedad que diferencia a cada objeto del resto
Clase
Generalización de un objeto particular. Una clase representa una
familia de objetos concretos.
Programa
Conjunto de objetos que colaboran entre ellos para realizar tareas
Programación Orientada a Objetos
Ejemplo:
OBJETOS

objeto2 objeto4
color azul color rojo
tipo policiaco tipo utilitario
matricula 0000 PM matricula 9235 FCB
velocidadMax 250 velocidadMax 200

objeto1 objeto3
color rojo color amarillo
tipo deportivo tipo elegante
matricula 1234 ABC matricula 9876 DEF
velocidadMax 300 velocidadMax 150
Programación Orientada a Objetos
CLASE
CLASE Coche
Agrupación de las características (atributos) y
funcionalidad (métodos) de todos los coches
color String
tipo String
matricula String
velocidadMax real Tipo de retorno

arrancar() real frenar()


parar() adelantar(pOtro Coche)
real acelerar() …
Programación Orientada a Objetos
• Encapsula en “objetos”
 el Qué  Datos
 el Cómo  Métodos (funciones)
• Los objetos interactúan enviándose mensajes

PROGRAMA

Objeto1
Datos1 Objeto3
Datos3

Objeto2
Datos2
Objeto4
Datos4
Características de los Objetos
• Identidad del Objeto
Aunque dos objetos sean exactamente iguales en sus
atributos, son distintos entre si.
• Clasificación
Abstracción del concepto de objeto llamada clase
• Mantenibilidad
Un programa o sistema debe ser fácilmente
modificable
• Reusabilidad
Los objetos definidos en un programa pueden ser
extraídos e implantados en otro sin tener que realizar
modificaciones importantes en su código
Características de los Objetos
• Encapsulación y ocultación de datos
La información dentro de un objeto puede ser:
٧ privada: información que necesita el objeto para
operar. Es innecesaria para el resto de objetos
٧ pública: la necesitan el resto de objetos para
interactuar con él
La encapsulación es la capacidad de los objetos de
construir una capsula a su alrededor ocultando la
información que contienen, necesaria para su
funcionamiento interno pero innecesaria para los
demás objetos.

Entrada OBJETO Salida


Características de los Objetos
• Polimorfismo
Posibilidad de definir varias operaciones con el
mismo nombre, diferenciándolas en el número o tipo
de los parámetros.
Los lenguajes Orientados a Objetos permiten definir
operadores con los mismos nombres en clases
distintas; el programa reconoce a qué clase se aplica
durante la ejecución.
• Herencia
Propagación de los atributos y operaciones a través
de distintas sub-clases definidas a partir de una clase
común.
Esta característica se estudia en profundidad en un
capítulo posterior.
Construcción de Clases

Una clase describe un grupo de objetos con similares:


• Propiedades (atributos)
• Comportamientos (operaciones o métodos)
• Relaciones con otros objetos

Cada objeto «conoce» cuál es su clase.


La mayoría de los lenguajes Orientados a Objetos
pueden determinar a qué clase pertenece un objeto
durante la ejecución del programa
Construcción de Clases
Pasos para definir una clase:
1. Identificar los objetos
 Los objetos deben imitar el mundo real
 Cualquier propiedad de un objeto se identifica a
través de atributos
 Además de objetos físicos pueden ser entidades que
se utilizan dentro de la construcción de un programa
2. Definir los atributos
Un atributo recoge un valor que se almacenará en los
objetos de la clase
3. Definir las operaciones.
 Examinar las distintas operaciones asociadas a un
conjunto de datos
 Añadir la operación de construcción de objetos de la
clase
Construcción de Clases (ejemplo)
Ejemplo:
Describir las clases de objetos necesarias para operar
con fracciones

CLASE Fraccion
Atributos
numerador: entero
entero denominador: entero
Métodos
-constructor-
escribir()
multiplicarPorEntero(pNum: entero): Fraccion
sumar(pFracc: Fraccion): Fraccion
2
Comparación de la versión estructurada
con la Orientada a Objetos para resolver un
problema

1. Utilizando una Programación Estructurada


2. Utilizando una Programación Orientada a Objetos
Programación Estructurada vs. Orientada a Objetos

Especificación
Tendremos varias formas en una ventana
gráfica: un cuadrado, un círculo y un
triángulo. Cuando el usuario pinche en
una de las formas, ésta rotará 360º en el
sentido de las agujas del reloj (es decir,
hará una rotación completa) y tocará
un sonido en formato AIF, específico para
esa forma.
Programación Estructurada vs. Orientada a Objetos

Aitor
Jon Cuadrado

rotar (numForma) { Círculo


// rotar la forma 360º rotar(){
} // código para rotar C Triángulo
rotar(){
}
tocarSonido(numForma) { // código para rotar C
} rotar(){
// usar numForma para
tocarSonido(){ // código para
// buscar el fichero AIF
// código para tocar
// a tocar y hacerlo sonar tocarSonido(){// rotar el triángulo
} // sonido del Cuadr } tocar
// código para
}
// sonido del Circulo
} tocarSonido(){
// código para tocar
// sonido del Triáng
}
Programación Estructurada vs. Orientada a Objetos
Añadido a la
especificación
original

Habrá una nueva forma en pantalla, junto


a las demás: una amoeba. Cuando el
usuario pulse sobre la amoeba, ésta
rotará como las otras, pero tocará un
archivo .hif
Programación Estructurada vs. Orientada a Objetos

Aitor
Jon
Amoeba
rotar (numForma) {
// rotar la forma 360º
} rotar(){
// código para
tocarSonido(numForma) { // rotar amoeba
// si la forma no es amoeba
}
// usar numForma para
// buscar el fichero AIF
// a tocar y hacerlo sonar tocarSonido(){
// si no // código para
// tocar .hif de la amoeba // tocar sonido
} //.hif en amoeba
}
Programación Estructurada vs. Orientada a Objetos

Punto de rotación de la amoeba


lo que al
en las versiones de Jon y Aitor: cliente se
le olvidó
citar...

Punto de rotación correcto para la


amoeba
Programación Estructurada vs. Orientada a
Objetos
Jon Aitor
rotar (numForma, xPt, yPt) {
// si la forma no es una amoeba Amoeba
// calcular punto de gravedad int puntoX
// rotar la forma 360º int puntoY
// si no
// usar xPt,yPt como el punto
rotar(){
// base de rotación
// código para rotar amoeba
}
// usando puntoX,puntoY
}
tocarSonido(numForma) {
// si la forma no es amoeba
// usar numForma para tocarSonido(){
// buscar el fichero AIF // código para tocar
// a tocar y hacerlo sonar // sonido .hif en amoeba
// si no }
// tocar .hif de la amoeba
}
¿qué
Cómo diseña Aitor... tienen las
4 clases
1
en común?

Cuadrado Círculo Triángulo Amoeba

rotar() rotar() rotar() rotar()

tocarSonido() tocarSonido() tocarSonido() tocarSonido()

Forma

rotar() 2
abstracción y
generalización
tocarSonido()
Cómo diseña Aitor...
Unimos las 4 clases
a la nueva clase
superclase Forma 3
Forma, formando
rotar() una relación de
HERENCIA
tocarSonido()

subclases

Cuadrado Círculo Triángulo Amoeba

rotar() rotar() rotar() rotar()

tocarSonido() tocarSonido() tocarSonido() tocarSonido()


Conclusiones

 Programación estructurada:
• Los datos y los procedimientos están separados y sin
relación.
• Presta atención al conjunto de acciones que
manipulan el flujo de datos desde la situación inicial
a la final.
• Anima al programador a pensar sobre todo en
términos de procedimientos y funciones, y en
segundo lugar en las estructuras de datos que esos
procedimientos manejan.
 Programación Orientada a Objetos

• Presta atención a la interrelación que existe entre los


datos y las acciones a realizar con ellos.
Problemas de la Programación Estructurada
• Modelo mental anómalo. Nuestra imagen del mundo se apoya
en los seres, a los que designamos con nombres sustantivos,
mientras que la programación clásica se basa en el
comportamiento, representado usualmente por verbos.
• Resulta difícil modificar y extender los programas, puesto que
suele haber datos compartidos por varios subprogramas
• Los programas son difíciles de mantener. Suelen tener errores
ocultos que no surgen hasta después de muchas horas de
funcionamiento
• Es difícil reutilizar programas. Es prácticamente imposible
aprovechar en una aplicación nueva las subrutinas que se
diseñaron para otra
• La coordinación y organización entre programadores para la
creación de aplicaciones de envergadura es compleja
La POO como solución
La Programación Orientada a Objetos constituye un nuevo
paradigma de programación que trata de encontrar solución a
los problemas mencionados.
• Representación mucho más cercana a la realidad 
Sistemas de software muy complejos se vuelven mucho más
simples de comprender
• En un sistema correctamente diseñado con OO es posible
realizar cambios al nivel de la clases, sin tener que realizar
cambios en ningún otro punto del sistema  Reduce el costo
total de mantenimiento
• El polimorfismo y la herencia  Favorecen la reutilización de
componentes individuales
• Muchos problemas pueden ser detectados y corregidos en
la fase de diseño  Reducción del trabajo de revisión y
mantenimiento del sistema
Aplicación OO: Gestión de un restaurante

Buenas noches!
entero consultarOcupación
Una mesa por
favor CLIENTE RECEPCIONISTA
entero asignarMesa()
Iñaki (1) Bautista

Tomaré crema de
verduras y besugo Antonio, acompaña
(2) al caballero a la
(3) mesa 2
anotarPedido(listaPlatos) atenderCliente(Iñaki)

cocinar (plato)
CAMARERO cocinarPedido(listaPlatos) COCINERO
Una crema de
(4)
verduras y besugo
Antonio Arzak
servir(unPlato)
(5)
Marchando una
crema de verduras
Tipos de Módulos

a) Módulos de definición

b) Módulos de servicio

c) Tipos Abstractos de Datos

d) Máquinas Abstractas de Estado


Tipos de Módulos
a) Módulos de Definición
• Declaración de constantes y variables
• Se declaran sobre clases abstractas
• Se declaran como estáticas
• Definiciones de constantes

b) Módulos de Servicio
• Ofrecen un servicio
• Agrupan un conjunto de operaciones
• Las operaciones de la interfaz se declaran sobre
clases no instanciables
• Las operaciones son declaradas estáticas
Tipos de Módulos
c) Módulos de Abstracción de Datos
• Representan TADs
• Se definen el tipo de datos y sus operaciones
• La implementación se realiza como una clase

d) Máquinas Abstractas de Estado (MAEs)


• A diferencia de los TADs, las operaciones de una
MAE se efectúan sobre un único objeto (la clase),
no se pueden generar diferentes objetos del
mismo tipo

You might also like