Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Semana 2
PRIMERA UNIDAD 1
Competencias
Contenido
Mapa Conceptual
Abstraccin
Encapsulamiento
Principios
POO Modularidad
Herencia
Polimorfismo
Fundamentos de las
estructuras de datos
Definicin
Algoritmos divide y
vencieras Naturaleza
Algoritmos
recursivos
Tipos
1
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Los principios de la programacin orientada a objetos segn Booch, son los siguientes:
Abstraccin.
Encapsulamiento.
Modularidad.
Herencia.
Polimorfismo.
Abstraccin
La abstraccin es uno de los medios ms importantes, mediante el cual nos enfrentamos con la
complejidad inherente al software. La abstraccin es la propiedad que permite representar las
caractersticas esenciales de un objeto, sin preocuparse de las restantes caractersticas (no esenciales).
Abstraccin es la tcnica de quitarle a una idea o a un objeto todos los acompaamientos innecesarios
hasta que los deja en una forma esencial y mnima. Una buena abstraccin elimina todos los detalles
poco importantes y le permite enfocarse y concentrarse en los detalles importantes.
Una abstraccin se centra en la vista externa de un objeto, de modo que sirva para separar el
comportamiento esencial de un objeto de su implementacin. Definir una abstraccin significa describir
una entidad del mundo real, no importa lo compleja que pueda ser y, a continuacin, utilizar esta
descripcin en un programa.
El elemento clave de la programacin orientada a objetos es la clase. Una clase se puede definir como
una descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado
especfico y por la posibilidad de realizar una serie de operaciones. Por ejemplo, una pluma estilogrfica
es un objeto que tiene un estado (llena de tinta o vaca) y sobre la cual se pueden realizar algunas
operaciones (escribir, poner o quitar la tapa, llenar de tinta si est vaca, etc.).
La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero el uso de clases
para gestionar dichas abstracciones en lenguajes de programacin ha facilitado considerablemente su
aplicacin.
La abstraccin es un principio de software importante. Una clase bien diseada expone un conjunto
mnimo de mtodos cuidadosamente considerados que proporcionan el comportamiento esencial de
una clase en una forma fcil de usar. Crear buenas abstracciones de software no es fcil. Encontrar
buenas abstracciones generalmente requiere de un entendimiento muy claro del problema y de su
contexto, gran claridad de pensamiento y amplia experiencia.
Existe un principio muy importante relacionado con la abstraccin, y esta es, la Dependencia mnima. Las
mejores abstracciones de software hacen que las cosas complejas sean simples. Logran esto al ocultar
por completo los aspectos no esenciales de una clase. Estos aspectos no esenciales, una vez que han sido
debidamente ocultados, no se pueden ver, ni usar, ni depender de ellos. Este principio de dependencia
mnima es lo que hace que la abstraccin sea tan importante. El cambio es normal en el desarrollo de
software. Lo mejor que puede hacer es minimizar el impacto de un cambio cuando ste sucede. Y cuanto
menos dependa de algo, menos se ver afectado cuando cambie.
Los lenguajes orientados a objetos proporcionan la Encapsulacin. La encapsulacin se puede utilizar
para aplicar el concepto de Abstraccin.
2
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Ejemplo
Por ejemplo tienes un carro y quieres "abstraerlo" para hacer un programa en el que puedas realizar
operaciones en base al carro.
Puedes crear una clase con las caractersticas del carro por ejemplo.
class carro {
int cantidadDePuertas;
int modelo;
Color colorcito;
String linea;
public carro (int cantidadDePuertas, int modelo, Color colorcito, String linea){
this.cantidadDePuertas = cantidadDePuertas;
this.modelo = modelo;
this.colorcito = colorcito;
this. linea = linea;
}
3
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Encapsulamiento
La encapsulacin tambin le permite controlar la forma en que se utilizan los datos y los procedimientos.
Puede utilizar modificadores de acceso, como Private o Protected, para evitar que los procedimientos
externos ejecuten mtodos de clase o lean y modifiquen datos en propiedades y campos. Usted debe
declarar los detalles internos de una clase como Private para evitar que sean utilizados fuera de su clase;
a esta tcnica se le llama ocultamiento de datos. En la clase BankAccount, la informacin del cliente,
como el saldo de la cuenta, se protege de esta forma. Una de las reglas bsicas de la encapsulacin es
que los datos de la clase slo se pueden modificar o recuperar a travs de los procedimientos o mtodos
Property. Ocultar los detalles de implementacin de sus clases evita que se usen de maneras no
deseadas, y le permite modificar esos elementos posteriormente sin riesgo de tener problemas de
compatibilidad. Por ejemplo, versiones posteriores de la clase BankAccount enlistadas ms adelante,
podran cambiar el tipo de datos del campo AccountBalance sin peligro de daar la aplicacin que
depende de que este campo tenga un tipo de dato especfico.
Ejemplo
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las
variables de instancia y los mtodos definidos en la clase:
public
4
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia
protegidos.
private
void MetodoDeMiPaquete(){}
Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaran
friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo
paquete, pero no por los externos al paquete. Es lo mismo que protected.
Modularidad :
La Modularidad es la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas
mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de
las restantes partes.
La modularizacin consiste en dividir un programa en mdulos que se puedan compilar por separado,
pero que tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la
Modularidad de diversas formas.
La Modularidad es la propiedad de un sistema que permite su descomposicin en un conjunto de
mdulos cohesivos y dbilmente acoplados. Por supuesto no todos los mdulos son iguales: tomar un
programa monoltico y separarlo de forma aleatoria en archivos no es ptimo. Se debe tener en cuenta
los conceptos asociados de dependencia, acoplamiento, cohesin, interfaz, encapsulacin y abstraccin.
Una vez identificado lo que es un buen mdulo, se puede contemplar la reutilizacin de un buen mdulo
como componente.
El Mdulo A depende del Mdulo B si cualquier cambio en el Mdulo B implica que el Mdulo A tambin
tenga que ser modificado. A veces se dice que el Mdulo A es un cliente del Mdulo B, o que el Mdulo B
acta como servidor del Mdulo A. En general, es normal que un mismo mdulo sea tanto cliente como
servidor. Esto significa, que depende de algunos mdulos, mientras que otros mdulos dependen de l.
Incluso es posible que un par de mdulos se tengan uno al otro de cliente; sin embargo, ste es un
ejemplo de dependencia circular, que debe evitarse cuando sea posible debido a que impide la
reutilizacin.
La dependencia a veces se conoce como acoplamiento. Un sistema con muchas dependencias tiene
fuerte acoplamiento. Los buenos sistemas tienen dbil acoplamiento, porque en ese caso los cambios en
una parte del sistema son menos probables de propagarse a travs del sistema.
Los mdulos correctos a menudo tienen la propiedad de que sus interfaces proporcionan una
abstraccin de algn elemento conocido de manera intuitiva que puede, no obstante, ser difcil de
implementar. Este tipo de mdulos se dice que tienen una fuerte cohesin. El mdulo realiza un
conjunto coherente de cosas, pero dentro de lo posible el desarrollador del cliente est protegido de la
informacin irrelevante relativa a cmo el mdulo hace lo que hace.
Resumiendo: Abstraccin es cuando un cliente de un mdulo no necesita saber ms de lo que hay en la
interfaz. Encapsulacin es cuando un cliente de un mdulo no es capaz de saber ms de lo que hay en la
interfaz.
Si un mdulo, de cualquier tamao y complejidad, es una buena abstraccin (tiene fuerte cohesin y
dbil acoplamiento) puede ser factible reutilizarlo en sistemas posteriores, o sustituirlo en el sistema
existente.
5
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Ejemplo
PROGRAMA
Programa Principal
datos
Mdulo1 Mdulo2
Datos + Datos1 Datos + Datos2
Jerarqua o Herencia
La Jerarqua es una propiedad que permite la ordenacin de las abstracciones. Las dos jerarquas ms
importantes de un sistema complejo son: estructura de clases (jerarqua es-un (is-a):
generalizacin/especializacin) y estructura de objetos (jerarqua parte-de (part-of): agregacin-
composicin).
Las jerarquas de generalizacin/especializacin se conocen como herencia. Bsicamente, la herencia
define una relacin entre clases, en donde una clase comparte la estructura o comportamiento definido
en una o ms clases (herencia simple y herencia mltiple, respectivamente).
Ejemplo
Deposito Persona
DepositoFijo DepositoAhorr
o
La composicin, es un tipo de relacin esttica por valor, el tiempo de vida del objeto est condicionado
por el tiempo de vida del lo incluye, por ejemplo almacn est compuesto por cuentas, el objeto base se
construir a partir del objeto incluido. Es una relacin por tipo de valor, se representa por un rombo
relleno. Si se borra el objeto almacn tambin se borra el objeto cuenta.
Ejemplo
6
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
La agregacin es una relacin por referencia, de tipo dinmica, el tipo de vida del objeto incluido es
independiente del que lo incluye. El objeto base utiliza al incluido para su funcionamiento. Si se borra el
objeto almacn sigue existiendo el objeto cliente.
Ejemplo:
Polimorfismo
Por ejemplo, cuando se describe la clase mamferos se puede observar que la operacin comer es una
operacin fundamental en la vida de los mamferos, de modo que cada tipo de mamfero debe poder
realizar la operacin o funcin comer. Por otra parte, una cabra o una vaca que pastan en un campo, un
nio que se come un caramelo y un len que devora a otro animal, son diferentes formas que utilizan
diferentes mamferos para realizar la misma funcin (comer).
El polimorfismo requiere ligadura tarda o postergada (tambin llamada dinmica), y esto slo se puede
producir en lenguajes de programacin orientados a objetos. Los lenguajes no orientados a objetos
soportan ligadura temprana o anterior (tambin llamada esttica), esto significa que el compilador
genera una llamada a un nombre especfico de funcin y el enlazador (linker) resuelve la llamada a la
direccin absoluta del cdigo que se ha de ejecutar. En POO, el programa no puede determinar la
direccin del cdigo hasta el momento de la ejecucin. Cuando se enva un mensaje a un objeto, el
cdigo que se llama no se determina hasta el momento de la ejecucin. El compilador asegura que la
funcin existe y realiza verificacin de tipos de los argumentos y del valor de retorno, pero no conoce el
cdigo exacto a ejecutar.
Ejemplo
package com.practica.polimorfismo;
import java.util.ArrayList;
import java.util.List;
7
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
calcularArea(lista);
}
7. Algoritmos recursivos
Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s
mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser
relativamente ms sencilla que el caso considerado.
- el N 0 es natural
- El N n es natural si n-1 lo es.
Naturaleza de la recursividad
1 para N = 0
1) N! =
8
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
1 si N = 0 N = 1
2) fibonacci(N) =
fibonacci(N-1)+ fibonacci(N-2) si N > 1
Caracterstica de la recursividad
Siempre existe una forma de salir de la definicin.
Una condicin de salida que es la condicin que no produce otra autollamada. Es un caso donde el
problema puede resolverse sin tener que hacer uso de una nueva llamada a s mismo. Evita la
continuacin indefinida de las partes recursivas.
Una llamada a s mismo (recursiva); normalmente con el valor de los parmetros que cambian en
cada llamada. Relaciona el resultado del algoritmo con resultados de casos ms simples. Se hacen
nuevas llamadas a la funcin, pero estn ms prximas al caso base.
EJEMPLO
ITERATIVO:
RECURSIVO:
9
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
TIPOS DE RECURSIN
Recursividad directa
O recursividad simple es aquella en cuya definicin slo aparece una llamada recursiva. Se
puede transformar con facilidad en algoritmos iterativos. Recursividad mltiple: Se da cuando
hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms difcil
de hacer de forma iterativa.
Recursividad anidada:
En algunos de los argumentos de la llamada recursiva hay una nueva llamada a s misma.
LA PILA DE RECURSIN
La memoria del ordenador se divide (de manera lgica, no fsica) en varios segmentos (4):
10
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
Segmento de cdigo: Parte de la memoria donde se guardan las instrucciones del programa en
cdigo de mquina.
Segmento de datos: Parte de la memoria destinada a almacenar las variables estticas.
Montculo: Parte de la memoria destinada a las variables dinmicas.
Pila del programa: Parte destinada a las variables locales y parmetros de la funcin que est siendo
ejecutada.
Se reserva espacio en la pila para los parmetros de la funcin y sus variables locales.
Se guarda en la pila la direccin de la lnea de cdigo desde donde se ha llamado a la funcin.
Se almacenan los parmetros de la funcin y sus valores en la pila.
Al terminar la funcin, se libera la memoria asignada en la pila y se vuelve a la instruccin actual.
En el caso recursivo, cada llamada genera un nuevo ejemplar de la funcin con sus correspondientes
objetos locales:
EJERCICIOS
a). Torres de Hanoi: Problema de solucin recursiva, consiste en mover todos los discos (de
diferentes tamaos) de una aguja a otra, usando una aguja auxiliar, y sabiendo que un disco no
puede estar sobre otro menor que ste.
11
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
/* Solucion:
1- Mover n-1 discos de A a B
2- Mover 1 disco de A a C
3- Mover n-1 discos de B a C
*/
void Hanoi( n, inicial, aux, final )
{
if( n>0 )
{
Hanoi(n-1, inicial, final, aux );
printf("Mover %d de %c a %c", n, inicial, final );
Hanoi(n-1, aux, inicial, final );
}
}
METODOS RECURSISVOS
Primero debemos decir que la recursividad no es una estructura de datos, sino que es una tcnica
de programacin que nos permite que un bloque de instrucciones se ejecute n veces. Remplaza en
ocasiones a estructuras repetitivas.
Este concepto ser de gran utilidad para el captulo de la estructura de datos tipo rbol.
12
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo existe la llamada a s
mismo decimos que el mtodo es recursivo.
Cuando un mtodo se llama a s mismo, se asigna espacio en la pila para las nuevas variables locales
y parmetros.
Al volver de una llamada recursiva, se recuperan de la pila las variables locales y los parmetros
antiguos y la ejecucin se reanuda en el punto de la llamada al mtodo.
Programa:
void repetir() {
repetir();
}
Problema 2:
Implementacin de un mtodo recursivo que reciba un parmetro de tipo entero y luego llame en forma
recursiva con el valor del parmetro menos 1.
Programa
13
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
void imprimir(int x) {
System.out.println(x);
imprimir(x-1);
}
Desde la main se llama a la funcin imprimir y se le enva el valor 5. El parmetro x recibe el valor 5.
Se ejecuta el algoritmo de la funcin, imprime el contenido del parmetro (5) y seguidamente se
llama a una funcin, en este caso a s misma (por eso decimos que es una funcin recursiva),
envindole el valor 4.
El parmetro x recibe el valor 4 y se imprime en pantalla el cuatro, llamando nuevamente a la
funcin imprimir envindole el valor 3.
Si continuamos este algoritmo podremos observar que en pantalla se imprime:
5 4 3 2 1 0 ?1 ?2 ?3 . . . . . . . . .
hasta que se bloquee el programa.
Tener en cuenta que cada llamada a una funcin consume 4 bytes por la llamada y en este caso 4
bytes por el parmetro x. Como nunca finaliza la ejecucin completa de las funciones se desborda la
pila esttica por las sucesivas llamadas.
14
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos
ser tomado como un algoritmo de divide y vencers. El nombre decrementa y vencers ha sido
propuesta para la subclase simple de problemas.
La correccin de un algoritmo de divide y vencers, est habitualmente probada una induccin
matemtica, y su coste computacional se determina resolviendo relaciones de recurrencia.
15