Sei sulla pagina 1di 26

Algoritmos y Estructura

de Datos

Semana 2

Razón social
00.00.2015
Logro de la sesión

Al finalizar la sesión, el estudiante identifica


y resuelve problemas algorítmicos de nivel
medio, utilizando un lenguaje de
programación.

2
Agenda
• Una situación parecida a la vida real – Introducción a la
POO
• Tips para el diseño de clases
• Construir y probar objetos
• Ejercicios

3
Una situación parecida a la vida real – Introducción a la POO
¿Cómo los objetos pueden cambiar nuestras vidas?
Érase una vez en un área de desarrollo de software, a dos programadores se les asignó una especificación y
se les dijo que la "construyeran". El gerente de proyecto realmente molesto, obligó a dos programadores a
competir prometiendo que quien lo entregue primero obtendrá un premio.

Los programadores eran Larry, especialista en programación estructurada y


La especificación Brad el especialista en programación orientada a objetos, ambos al revisar
las especificaciones sabían que esto era pan comido
Habrá formas en una GUI, un cuadrado,
un círculo y un triángulo. Cuando el
usuario hace clic en una forma, la forma
girará 360 ° en sentido horario (es decir,
completamente) y reproducirá un archivo
Programación Programación
de sonido AIF específico para esa forma estructurada OO
en particular

• Larry pensó para sí mismo: • Brad pensó para sí mismo:


“¿Cuáles son las cosas que "¿Cuáles son las “cosas” en
tiene que hacer este este programa ... quiénes son
programa? ¿Qué los jugadores clave?" Primero
procedimientos necesitamos? pensó en las formas. Por
”. Y él se contestó a sí mismo: supuesto, había otros objetos
"gira y toca Sonido". Así que en los que pensaba, como el
fue a construir los Usuario, el Sonido y el evento
procedimientos. Después de Hacer clic. Pero él ya tenía una
todo, ¿qué es un programa biblioteca de código para esas
sino un montón de piezas, por lo que se centró en
procedimientos? construir formas.
4
Una situación parecida a la vida real – Introducción a la POO
Programación estructurada Programación OO
Como había hecho miles de millones de veces antes, Brad escribió una clase para cada una de las tres
Larry comenzó a escribir sus Procedimientos formas
importantes. Escribió rotar y reproducir sonido en
muy poco tiempo. Cuadrado
rotar(){ Circulo
rotar(numForma){ //código para rotar
Triangulo
//hacer rotar la forma 360° rotar(){
//un cuadrado //código para rotar rotar(){
} } //un círculo //código para rotar
reproducirSonido(){ } //un triángulo
reproducirSonido(numForma){ //código para tocar el reproducirSonido(){ }
//usar numForma para encontrar //archivo AIF para el //código para tocar el reproducirSonido(){
//cuadrado //archivo AIF para el //código para tocar el
//cual sonido AIF reproducir y
} //círculo //archivo AIF para el
//reproducirlo
} //triángulo
} }

“Larry” acabó primero y se sintió ganador del premio y se La nueva especificación


confirmaba su creencia que aunque la programación OO era linda, Habrá una forma de ameba en la
era lenta. No obstante el gerente de proyecto indicó que ha habido un pantalla, con las demás formas. Cuando
cambio en las especificaciones y que aún no podía dar el premio y el usuario hace clic en la ameba, girará
que este no sería problema para los programadores con ese nivel de como los demás y reproducirá un archivo
de sonido .aif.
experiencia. Se sabe en la vida real que un cambio de
especificaciones sin problemas es una fantasía. 5
Una situación parecida a la vida real – Introducción a la POO
Programación Estructurada Programación OO

En el programa de Larry, el Brad sonrió, sorbió su margarita y


procedimiento de rotación aún escribió una nueva clase. A veces, lo
funcionaría; el código usaba una tabla que más le gustaba de OO era que no
de búsqueda para hacer coincidir un tenía que tocar el código que ya había
La nueva especificación
número de forma(numForma) con un probado y entregado. "Flexibilidad,
Habrá una forma de ameba en la gráfico de forma real. Pero extensibilidad, ..." reflexionó, sobre los
pantalla, con las demás formas. Cuando reproducirSonido tendría que cambiar. beneficios de OO.
el usuario hace clic en la ameba, girará Resultó no ser un gran problema, pero
como los demás y reproducirá un archivo aún así le hizo sentir náuseas tocar el
de sonido .aif. código probado previamente.

reproducirSonido(numForma){ Ameba
//if la forma no es una ameba rotar(){
//usar numForma para encontrar //código para rotar
//cual sonido AIF reproducir y //una ameba
//reproducirlo }
//else reproducirSonido(){
//reproducir el sonido .aif de //código para tocar el
//archivo AIF para la
//la ameba
//ameba
} }
6
Una situación parecida a la vida real – Introducción a la POO
“Larry” acabó primero otra vez por muy poco. Pero la sonrisa 1) determina el rectángulo que
en la cara de Larry se derritió cuando el gerente del proyecto rodea la forma
dijo (con ese tono de decepción): "Oh, no, no es así como se 2) Calcule el centro de ese
supone que gira la ameba ..." Resulta que ambos rectángulo y gire la forma
programadores habían escrito su código de rotación así: alrededor de ese punto.

Lo que la última especificación olvidó mencionar


convenientemente
Programación Estructurada rotar(numForma,xPt,yPt){
//if la forma no es una ameba
"Estoy tostado", pensó Larry, "Aunque, //calcular el punto
la forma de la ameba debe girar hmmmm. simplemente podría agregar //central
alrededor de un punto en un extremo, otro if/else al procedimiento de //basado en un
como una manecilla de reloj
rotación, y luego simplemente elaborar //rectángulo y luego
el código del punto de rotación para la //rotar
ameba. Eso probablemente no romperá
//else
nada". Finalmente pensó que era mejor
agregar argumentos de punto de //usar el xPt e yPt
rotación al procedimiento de rotación. // como el punto de
Mucho código fue afectado. Probó y // referencia y
volvió a compilar casi todo, y las cosas // luego rotar
que solían funcionar, no funcionaban }

7
Una situación parecida a la vida real – Introducción a la POO
Lo que la última especificación olvidó mencionar Programación OO Ameba
convenientemente
int xPunto
Sin perder el ritmo, Brad modificó el Int yPunto
método de rotación, pero solo en la rotar(){
clase Ameba. Nunca tocó el código //código para rotar
la forma de la ameba debe girar
alrededor de un punto en un extremo,
compilado, probado y en //una ameba usando
como una manecilla de reloj funcionamiento para las otras partes //los puntos x,y
del programa. Para darle a la ameba un }
punto de rotación, agregó un atributo reproducirSonido(){
que todas las amebas tendrían. //código para tocar el
Modificó, probó y entregó (de forma //archivo AIF para la
inalámbrica) el programa revisado en //ameba
poco tiempo }

LARRY: ¡Tienes un código duplicado! El procedimiento


de rotación está en las cuatro cosas de Forma.

BRAD: es un método, no un procedimiento. Y son clases,


Entonces, Brad el especialista en no cosas.

programación OO consiguió el LARRY: Lo que sea. Es un diseño estúpido. Debe


mantener cuatro "métodos" de rotación diferentes.
premio, ¿verdad? ¿Cómo puede ser eso bueno?

No tan rápido. Larry encontró BRAD: Oh, supongo que no viste el diseño final. Déjame
8
mostrarte cómo funciona la herencia OO, Larry.
una falla en el enfoque de Brad
Una situación parecida a la vida real – Introducción a la POO
Cuadrado Circulo Triangulo Ameba 01
rotar()
Miré lo que las cuatro clases
rotar() rotar() rotar()
reproducirSonido() reproducirSonido() reproducirSonido() tienen en común
reproducirSonido()

Forma
Son formas y todos giran y suenan. Así que abstraje las
02 características comunes y las puse en una nueva clase
rotar()
reproducirSonido()
llamada forma
Forma
rotar()
reproducirSonido()
03 Luego vinculé las cuatro clases de
formas con la nueva clase “Forma”,
en una relación llamada herencia

La clase Forma se llama la

Ameba
superclase de las otras cuatro
Cuadrado Circulo Triangulo
clases. Las otras cuatro son las
subclases de Forma. Las subclases
heredan los métodos de la superclase.
En otras palabras, si la clase Forma
Puede leer esto como "El cuadrado hereda de forma", "El círculo tiene la funcionalidad, entonces las
hereda de forma", etc. Eliminé rotar() y reproducirSonido() de las otras subclases obtienen automáticamente esa
formas, así que ahora solo hay una copia para mantener.
misma funcionalidad. 9
Una situación parecida a la vida real – Introducción a la POO
Superclase (más ¿Qué pasa con la rotación de la Ameba [rotar()]?
abstracta) Hice que la clase Ameba sobreescribiera los
Forma métodos rotar() y reproducirSonido() de la

Subclases (más
rotar()
reproducirSonido()
04 superclase Forma.
Sobreescribir sólo significa que una
específico) subclase redefine uno de sus métodos
heredados cuando necesita cambiar o
extender el comportamiento de ese método

Cuadrado Circulo Triangulo Ameba


rotar(){
//código específico
LARRY: ¿No era ese el problema? ¿que la ameba tenía un procedimiento de rotación y reproducción // para rotar una
completamente diferente? //ameba} Métodos
BRAD: Método.
LARRY: Lo que sea. ¿Cómo puede la ameba hacer algo diferente si "hereda" su funcionalidad de la
sobreescritos
clase Forma? reproducirSonido(){
BRAD: Ese es el último paso. La clase Ameba sobreescribe los métodos de la clase Forma. Luego, //código específico
en tiempo de ejecución, la JVM sabe exactamente cuál método rotar() ejecutar, cuando alguien le //para reproducir
dice a la Ameba que gire. //el sonido}
LARRY: ¿Cómo “le dices” a una ameba que haga algo? ¿No tiene que llamar al procedimiento, lo
siento, método, y luego decirle qué cosa rotar?
BRAD: Eso es lo realmente genial de OO. Cuando es hora de, por ejemplo, que el triángulo gire, el
código del programa invoca (llama) al método rotar() en el objeto triangulo. El resto del programa
El suspenso me está
realmente no sabe ni le importa cómo lo hace el triángulo. Y cuando necesite agregar algo nuevo al
programa, simplemente escriba una nueva clase para el nuevo tipo de objeto, para que los nuevos matando. ¿Quién se llevó
objetos tengan su propio comportamiento. 10
el premio?
Tips para diseño de clases
Cuando diseñe una clase, piense en los objetos que se crearán a partir de ese tipo de
clase. Pensar acerca de
• Cosas que el objeto conoce acerca de sí mismo (características - sustantivo)
• Cosas que hace/se hace con el objeto (comportamientos - verbo)

CarritoCompras Boton Alarma

contenidoCarrito etiqueta tiempoAlarma conoce


conoce conoce
color modoAlarma

adicionarACarrito() establecerColor() establecerTiempoAlarma()


removerDeCarrito() establecerEtiqueta() obtenerTiempoAlarma()
presionarBoton() hace silenciarAlarma() hace
girar() hace
pagar() liberarBoton() estaAlarmaconfigurada()

Las cosas que un objeto sabe sobre sí mismo se llaman variables de instancia, Representan el
estado de un objeto (los datos) y pueden tener valores únicos para cada objeto de ese tipo.
Las cosas que un objeto puede hacer son llamadas métodos
Cuando diseña una clase, piensa en los datos que un objeto necesitará saber sobre sí mismo, y también
11
diseñe los métodos que operan sobre esos datos.
Tips para diseño de clases - Ejercicio
Complete lo que un objeto de televisión podría necesitar conocer acerca
de si mismo y lo que hace - se hace con el objeto.
Television

Variables de
instancia

métodos

12
¿Cuál es la diferencia entre una clase y un objeto?
Una clase no es un objeto. (pero se usa para construirlos)
Una
Perro clase • Una clase es un plano para un objeto. Le dice
a la máquina virtual cómo hacer un objeto de
raza ese tipo en particular. Cada objeto hecho de
tamaño esa clase puede tener sus propios valores para
nombre las variables de instancia de esa clase. Por
ladrar() ejemplo, puede usar la clase Botón para hacer Clase
docenas de botones diferentes, y cada botón
Varios puede tener su propio color, tamaño, forma,
objetos etiqueta, etc.
Míralo de esta manera
Un objeto es como una entrada en su libreta de direcciones.
Una analogía para los objetos es un paquete de tarjetas como se muestra en la
figura (clase Agenda). Cada tarjeta tiene los mismos campos en blanco (las
variables de instancia). Cuando completa una tarjeta, está creando una instancia
(objeto), y las entradas que llena en esa tarjeta representan su estado. Los
métodos de la clase son las cosas que le haces a una tarjeta en particular;
getName (), changeName (), setName () podrían ser métodos para la clase Agenda.
Por lo tanto, cada tarjeta puede hacer lo mismo (getName (), changeName (),
etc.), pero cada tarjeta conoce cosas únicas de esa tarjeta en particular. 13
Construyendo nuestro primero objeto
01 Escribe tu clase ¿Qué se necesita para crear y usar un objeto?
Class Perro{
variables de • Necesitas dos clases. Una clase para el tipo
instancia
int tamaño; de objeto que desea usar (Perro, Despertador,
Perro Televisión, etc.) y otra clase para probar la
String raza;
String nombre; raza nueva clase. La clase de prueba es donde se
Un método
tamaño pone el método “main”, y en ese método main ()
void ladrar(){ creas y accedes a objetos de tu nuevo tipo de
System.out.println(“gua gua”);
nombre
clase. La clase de prueba tiene un solo
} ladrar()
trabajo: probar los métodos y las variables
}
del objeto de su nuevo tipo de clase.

03 En la clase de prueba, construye un objeto y


02 Escribe una clase de prueba accede a las variables y métodos del objeto
Sólo un Class PruebaPerro{
método Class PruebaPerro{
main public static void main(String[] args){
public static void main(String[] args){
Perro d = new Perro(); Construir un
//El código de prueba de la clase objeto Perro
d.tamaño=40;
// perro
Operador d.ladrar(); Usar el operador punto (.) para
// se escribe aquí punto establecer el tamaño del perro
}
}
} Y para llamar al método ladrar()
}
14
Construir y probar objetos tipo Cine - Ejercicio
La clase PruebaCine crea objetos (instancias) de la
Cine
clase Cine y utiliza el operador de punto para
titulo establecer las variables de instancia en un valor
específico. La clase PruebaCine también invoca
genero
(llama) un método en uno de los objetos. Complete los
rating siguientes cuadros con los valores que tienen los
playIt() tres objetos luego de ejecutar el método main()

titulo
Objeto uno genero

rating

titulo
genero
Objeto dos
rating

titulo
genero
Objeto tres 15
rating
Rápido! Sal del método main()
Está bien que un programa de prueba se ejecute dentro del método
principal, pero en una verdadera aplicación OO, necesita objetos que se
comuniquen con otros objetos
Una aplicación real de Java no es más que objetos
Los dos usos de main: que hablan con otros objetos. En este caso, hablar
• Para probar tu clase significa objetos que invocan métodos entre sí. A
• Para lanzar/iniciar su aplicación continuación un ejemplo de cómo podría comportarse
en Java una aplicación real en Java

El juego de adivinanzas
Implementar un programa Orientado a Objetos, que simule un juego de adivinanza, donde tres
jugadores deben intentar adivinar un número aleatorio entre 0 y 9 generado por el programa.
Los tres jugadores también deben intentar adivinar de forma aleatoria (no se debe ingresar
por teclado).

16
El juego de adivinanzas
La lógica:
1) La clase GameLauncher es donde comienza la aplicación; tiene el método main().
2) En el método main(), se crea un objeto GuessGame y se llama a su método startGame().
3) El método startGame() del objeto GuessGame es donde se desarrolla todo el juego. Crea tres
jugadores, luego "piensa" en un número aleatorio (el objetivo para que los jugadores adivinen).
Luego le pide a cada jugador que adivine, verifica el resultado e imprime información sobre los
jugadores ganadores o les pide que adivinen nuevamente.

El juego de adivinanzas
Involucra un objeto "juego" y tres objetos jugador". El juego
genera un número aleatorio entre 0 y 9, y los 3 objetos GuessGame
jugador intentan adivinarlo. Variables de
p1
instancia para
el número que los 3 jugadores p2
el jugador Player
GameLauncher p3
adivinó
number startGame()

método para
crea un objeto
adivinar
Main(String[] args) GuessGame y le
guess()
dice que inicie
17
el juego
El juego de adivinanzas - Solución
La clase GuessGame:

GuessGame tiene tres variables


de instancia para los tres
objetos Player

crear tres objetos Player y los asigna a sus


tres variables de instancia

declarar tres variables para mantener las


respuestas de los jugadores a la adivinanza

declarar tres variables para mantener un verdadero o


falso basado en la respuesta del jugador
Generar el número aleatorio (objetivo) que
los jugadores tienen que adivinar

llama al método guess () de cada objeto


Player (jugador)

18
El juego de adivinanzas - Solución
La clase GuessGame:
obtenga la respuesta de cada jugador (el
resultado de la ejecución de su método guess())
accediendo al valor del atributo o variable de
instancia “number” de cada objeto

Comprueba las respuestas de cada jugador para ver


si coincide con el número objetivo. Si un jugador
tiene razón, se configura la variable de ese
jugador como verdadera (recuerde que se configuró
como falsa por defecto)

Si el jugador uno O el jugador dos O el jugador tres tiene razón

De lo contrario, se sigue en el bucle intentado con la adivinanza

19
El juego de adivinanzas - Solución Salida:

La clase GameLauncher:

La clase Player:

20
Ejercicio – Ser el compilador
Cada uno de los archivos Java en esta diapositiva representa un archivo fuente completo. Su trabajo es jugar al compilador y
determinar si cada uno de estos archivos se compilará. Si no compilan, ¿cómo los arreglarías?.

A B

21
Ejercicio - Rompecabeza
Su trabajo es tomar fragmentos de código de la piscina y colocarlos en las líneas en blanco del código. Puedes usar el mismo
fragmento de código más de una vez, y no necesitará usar todos los fragmentos.

Su objetivo es crear una clase que compile,


ejecute y produzca el siguiente resultado

Pregunta extra Nota: ¡Cada fragmento del grupo se puede usar más de
Si la última línea de una vez!
salida fuera 24 en
lugar de 10, ¿cómo
completarías el
rompecabezas?

22
Ejercicio – ¿Quién soy?
Complete los espacios en blanco al lado de la oración con los nombres de uno o más de las opciones disponibles.

Clase Método Variable de instancia Objeto


Frase Opciones
Me comporto como una plantilla
Me gusta hacer cosas
Puedo tener muchos métodos.
Yo represento el "estado"
Tengo comportamientos
Estoy ubicado en objetos
Vivo en el montón (heap)
Estoy acostumbrado a crear instancias de
objetos
Mi estado puede cambiar
Declaro métodos.
Puedo cambiar en tiempo de ejecución 23
¿Preguntas?

24
Resumen
• La programación orientada a objetos nos permite extender un programa
sin tener que tocar el código previamente trabajado y probado.
(Herencia)
• Todo el código java es definido en una clase (Jerarquía)
• Una clase describe como construir un objeto de esa clase. Una clase es
como un plano.
• Un objeto puede cuidarse solo; no tiene que saber o importarle cómo el
objeto lo hace. (encapsulación)
• Un objeto sabe y hace cosas. Las cosas que un objeto sabe sobre si
mismo se llaman variables de instancia. Representan el estado de un
objeto.
• Las cosas que hace un objeto se llaman métodos. Representan el
comportamiento de un objeto. 25
FIN

26

Potrebbero piacerti anche