CC 1002 Introduccin a la Programacin Clase 20

  • Slides: 21
Download presentation
CC 1002: Introducción a la Programación Clase 20 Nelson Baloian, José A. Pino

CC 1002: Introducción a la Programación Clase 20 Nelson Baloian, José A. Pino

Interacciones entre Objetos • Para construir aplicaciones interesantes los objetos pueden combinarse entre sí,

Interacciones entre Objetos • Para construir aplicaciones interesantes los objetos pueden combinarse entre sí, • Para realizar una tarea común. • Consideremos un reloj digital que tiene una pantalla en la cual se muestran las horas y los minutos, separados por dos puntos (: ). • Así, estos relojes son capaces de mostrar la hora desde las 00: 00 (medianoche) hasta las 23: 59 (un minuto antes de medianoche).

Abstracción y modularidad • En vez de implementar el reloj desarrollando una única clase,

Abstracción y modularidad • En vez de implementar el reloj desarrollando una única clase, vamos a identificar subcomponentes en el problema que se puedan descomponer en clases separadas. • La técnica que usaremos es la abstracción: Dividiremos el problema en sub-problemas, y luego cada sub-problema en sub-problemas hasta que los problemas individuales sean lo suficientemente simples como para poder desarrollarlos con una clase sencilla (a esto se le denomina modularidad). • Una vez que hayamos resuelto uno de estos su-bproblemas, no nos preocuparemos más de los detalles de este, sino que consideraremos esta solución como un elemento que podemos reutilizar en el sub-problema siguiente.

Abstracción y modularidad • Modularidad y abstracción se complementan entre sı. • La modularidad

Abstracción y modularidad • Modularidad y abstracción se complementan entre sı. • La modularidad es el proceso de dividir problemas grandes en partes más pequeñas, mientras que la abstracción es la habilidad de ignorar detalles para enfocarse en el plano general. • En la programación orientada a objetos, estas componentes y subcomponentes son objetos • El identificar qué tipo de objetos (qué clases) se deben incluir en un sistema para un problema dado no siempre es una tarea sencilla.

Reloj digital • En vez de 4 dígitos separados por “: ” podemos pensar

Reloj digital • En vez de 4 dígitos separados por “: ” podemos pensar en dos números de dos dígitos cada uno • Un par empieza en 0, aumenta en 1 cada hora, y vuelve a 0 cuando alcanza su límite 23. El otro par vuelve a 0 cuando su valor alcanza el límite 59 • El reloj esta formado por dos objetos que pueden mostrar valores enteros que comienzan en 0 hasta cierto límite, cuando se reinicia a 0 • Entonces, primero implementaremos una clase para manejar un par de números, luego darle un método para obtener su valor, y dos métodos para asignar un valor y aumentarlo. • Una vez que hayamos definido esta clase, bastara con crear dos objetos de esta clase (cada cual con su límite) para el reloj completo.

Diagramas de clases y objetos • Queremos primero construir una representación para un par

Diagramas de clases y objetos • Queremos primero construir una representación para un par de números que almacene dos valores: lımite y el valor actual. • Representemos los valores como enteros en la clase Par. De. Numeros: • Y como dijimos, la clase Reloj tendrá dos Par. De. Numeros:

Un Diagrama • La estructura de objetos descrita puede visualizarse usando el siguiente diagrama

Un Diagrama • La estructura de objetos descrita puede visualizarse usando el siguiente diagrama de objetos. • En este diagrama apreciamos que un objeto de la clase Reloj se instancia utilizando dos objetos de la clase Par. De. Numeros.

El Diagrama de clases • La estructura de objetos descrita puede visualizarse usando el

El Diagrama de clases • La estructura de objetos descrita puede visualizarse usando el siguiente diagrama de objetos. • En este diagrama apreciamos que un objeto de la clase Reloj se instancia utilizando dos objetos de la clase Par. De. Numeros.

Implementación Par. De. Numeros (1) # Campos : # limite : int # valor

Implementación Par. De. Numeros (1) # Campos : # limite : int # valor : int class Par. De. Numeros : # Constructor : crea un objeto que almacena # dos números y se reinicia # a cero cuando se sobrepasa el limite def __init__ (self , limite ): self. limite = limite self. valor = 0 # get. Valor : None -> int # Retorna el valor actual def get. Valor ( self ): return self. valor

Implementación Par. De. Numeros (2) # set. Valor : int -> None # efecto

Implementación Par. De. Numeros (2) # set. Valor : int -> None # efecto : Reemplaza el valor del par por nuevo valor def set. Valor (self , nuevo. Valor ): if(nuevo. Valor>=0) and ( nuevo. Valor<self. limite): self. valor = nuevo. Valor # to. String : -> str # Retorna el valor almacenado en un string que # contiene los numeros del par; si el valor es menor # que diez , se le debe anteponer un cero def to. String ( self ): if self. valor < 10: return "0" + str ( self. valor ) else : return str( self. valor )

Implementación Par. De. Numeros (3) # aumentar : None -> None # efecto :

Implementación Par. De. Numeros (3) # aumentar : None -> None # efecto : Aumenta en una unidad el valor almacenado # en el par , # reiniciando a cero si se sobrepasa el limite def aumentar ( self ): self. valor = ( self. valor + 1) % self. limite

Implementación Reloj (1) # Campos : # horas : Par. De. Numeros # minutos

Implementación Reloj (1) # Campos : # horas : Par. De. Numeros # minutos : Par. De. Numeros # pantalla : str class Reloj : # Constructor : crea un objeto reloj. # Si no recibe parametros , inicia el reloj # a las 00: 00; si recibe , a la hora indicada def __init__ (self , horas =0, minutos =0): self. horas = Par. De. Numeros (24) self. minutos = Par. De. Numeros (60) self. set. Reloj (horas , minutos )

Implementación Reloj (2) # tic: None -> None # Se llama cada minuto, hace

Implementación Reloj (2) # tic: None -> None # Se llama cada minuto, hace avanzar el reloj un minuto def tic ( self ): self. minutos. aumentar () if self. minutos. get. Valor () == 0: self. horas. aumentar () self. actualizar. Pantalla () # set. Reloj : int -> None # efecto : Fija la hora y minuto a los especificados def set. Reloj (self , hora , minuto ): self. horas. set. Valor ( hora ) self. minutos. set. Valor ( minuto ) self. actualizar. Pantalla ()

Implementación Reloj (3) # tic: None -> None # get. Hora : None ->

Implementación Reloj (3) # tic: None -> None # get. Hora : None -> str # Devuelve la hora actual del reloj en formato HH: MM def get. Hora ( self ): return self. pantalla # actualizar. Pantalla : None -> None # efecto : Actualiza el string interno que lleva # cuenta de la hora actual def actualizar. Pantalla ( self ): self. pantalla = self. horas. to. String () + ": ” + self. minutos. to. String ()

Objetos que crean objetos • ¿de dónde salen estos tres objetos? • Al crear

Objetos que crean objetos • ¿de dónde salen estos tres objetos? • Al crear un objeto Reloj en el constructor se ejecutan dos instrucciones que crean objetos de la clase Par. De. Numeros class Reloj : # Constructor : crea un objeto reloj. # Si no recibe parametros , inicia el reloj # a las 00: 00; si recibe , a la hora indicada def __init__ (self , horas =0, minutos =0): self. horas = Par. De. Numeros (24) self. minutos = Par. De. Numeros (60) self. set. Reloj (horas , minutos )

Constructores • Como ya hemos visto, la sintaxis para crear un nuevo objeto es:

Constructores • Como ya hemos visto, la sintaxis para crear un nuevo objeto es: • Nombre. De. Clase(lista-de-parámetros) • La construcción de un objeto hace dos cosas: • 1. Crea un nuevo objeto de la clase llamada (en este caso Reloj) • 2. Ejecuta el constructor de la clase • Si el constructor de la clase está definido para tener parámetros, entonces deben ser suministrados al crear el objeto. • Por ejemplo, el constructor de la clase Par. De. Numeros fue definido para esperar un parámetro del tipo entero:

Llamadas a Métodos internos • La ultima lınea del método tic de la clase

Llamadas a Métodos internos • La ultima lınea del método tic de la clase Reloj contiene la siguiente declaración: self. actualizar. Pantalla () • Esta declaración es una llamada a un método. Como hemos visto hasta el momento, la clase Reloj tiene un método con la siguiente firma: def actualizar. Pantalla ( self ): • La llamada de arriba invoca a este método. Ya que este método está en la misma clase que la llamada al método (en tic), también la denominamos llamada de método interna. • Este tipo de llamadas tienen la siguiente sintaxis: self. nombre. Del. Metodo ( lista -de - parametros ) • En nuestro ejemplo, el método no tienen ningún parámetro, así que la lista de parámetros esta vacía ()

Llamadas a Métodos externos • Examinemos el siguiente método en tic: self. minutos. aumentar

Llamadas a Métodos externos • Examinemos el siguiente método en tic: self. minutos. aumentar () • Esta declaración llama al método aumentar del objeto minutos. Luego, cuando uno de los métodos del objeto Reloj es llamado, a su vez él llama a un método de otro objeto para hacer parte del trabajo. • Una llamada a un método de otro objeto se denomina llamada de método externa. • La sintaxis de una llamada de este tipo esta dada por: objeto. nombre. De. Metodo ( lista -de - parametros ) • Esta notación es conocida como notación de punto. Consiste en el nombre de un objeto, un punto, el nombre del método a llamar, y los parámetros de la llamada. Es particularmente importante apreciar que aquí hablamos del nombre de un objeto y no del nombre de la clase: Usamos el nombre minutos en vez de Par. De. Numeros.

Testing de clases • La prueba de programas orientados al objeto es más compleja

Testing de clases • La prueba de programas orientados al objeto es más compleja que probar programas funcionales: los objetos contienen variables de estado mutables y los métodos de un objetos se usan en combinación. • Por estas dos razones, un test usualmente necesita definir un escenario de prueba más largo que una simple llamada a una función. • Ahora presentamos una primera manera de probar clases sencillas; La idea es que cada clase de un programa pueden tener una clase de prueba que se encarga de: 1. crear objetos de la clase a probar, y poner estos objetos en estados queremos probar; 2. ejercitar la funcionalidad de dichos objetos con varias secuencias de métodos; y 3. verificar que el comportamiento es correcto.

Testing para Par. De. Numeros

Testing para Par. De. Numeros

Testing para Reloj

Testing para Reloj