1 / 20

Programación Orientada a Objetos

Programación Orientada a Objetos. Temario Aserciones Definición. Uso de Pre-Condición y Post-Condición Activación Assert Diagrama de Clases. Aserciones.

halil
Download Presentation

Programación Orientada a Objetos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programación Orientada a Objetos Temario • Aserciones • Definición. • Uso de Pre-Condición y Post-Condición • Activación • Assert • Diagrama de Clases

  2. Aserciones Una ayuda a la hora de depurar nuestros proyectos puede ser el uso de assert. Supón que tenemos un método que recibe un parámetro que no puede ser null. Normalmente, hacemos este tipo de cosas: publicvoidmetodo (Objectparametro) { if(null==parametro) { System.out.println("El parametro es null"); return; } // Aqui el codigo correcto. }

  3. Aserciones • Esto protege nuestro codigo, pero nos impide detectar los fallos rápidamente. Al ejecutar, ese método no hará lo que tiene que hacer y veremos que algo en nuestra aplicación no funciona. Ponte a buscar en la Salida por qué y detectar ese "El parámetro es null" muchas líneas atrás en el System. • Como solución a esto, podemos usar los assert de java (disponibles desde java 1.4). El código con el assert sería así. publicvoidmetodo (Objectparametro) { assertparametro!=null; if(null==parametro) { System.out.println("El parametro es null"); return; } // Aqui el codigo correcto. }

  4. Aserciones • precondición lo que debe ser cierto cuando empieza a ejecutarse un fragmento de código • postcondiciónlo que debe ser cierto cuando termina la ejecución un fragmento de código • invariante (de bucle) lo que debe ser cierto mientras un fragmento de código se está ejecutanto; típicamente interesa centrar condiciones que deben satisfacerse en todas y cada una de las iteraciones de un bucle

  5. Aserciones • El fallo de una precondición quiere decir que el usuario de nuestro código no está pidiendo según lo previsto. Si, por ejemplo, desarrollamos un programa para calcular la raíz cuadrada de un número, exigiremos como precondición que el número sea positivo. • El fallo de una postcondición quiere decir que no hemos cumplido con nuestro compromiso. Si, por ejemplo, desarrollamos un programa para calcular la raíz cuadrada de un número con una cierta precisión, se nos exigirá a la salida que el resultado multiplicado por sí mismo difiera de la entrada en menos que la precisión prometida. • El fallo de un invariante de bucle significa que el algoritmo se ha perdido. Tomemos como ejemplo el caso de estar buscando una palabra en un diccionario por el método binario. El algoritmo consiste en abrir el diccionario por la mitad y determinar en qué mitad está la palabra, y así recurrentemente con la mitad de la mitad de la mitad, etc. En todo momento debe ser cierto que la palabra que buscamos esté en la fracción de diccionario que estamos buscando; es decir, que sea posterior a la primera palabra de la fracción, y anterior a la última.

  6. Activación y Desactivación de Aserciones • Activación/Desactivación Los asertos estan pensados para la comprobación de invariantes (condiciones que se cumplen siempre en un determinado trozo de código), por lo que tienen mas interés en la etapa de desarrollo. Por esto se puede desactivar y activar la comprobación de los asertos. Por defecto la comprobación de los asertos esta desactivada y se proporcionan dos opciones para el intérprete del JDK (java). • java -enableassertions (-ea), para activar la comprobación. • java -disableassertions (-da), para desactivar la comprobación.

  7. Diagrama de Clases • Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenimiento. • Un diagrama de clases esta compuesto por los siguientes elementos: • Clase: atributos, métodos y visibilidad. • Relaciones: Herencia, Composición, Agregación, Asociación y Uso.

  8. Diagrama de Clases Elementos • Clase Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.). En UML, una clase es representada por un rectángulo que posee tres divisiones: • Superior: Contiene el nombre de la Clase • Intermedio: Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public). • Inferior: Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public).

  9. Diagrama de Clases Relaciones entre Clases: Ahora ya definido el concepto de Clase, es necesario explicar como se pueden interrelacionar dos o más clases (cada uno con características y objetivos diferentes). Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser: uno o muchos: 1..* (1..n) 0 o muchos: 0..* (0..n) número fijo: m (m denota el número).

  10. Diagrama de Clases Herencia (Especialización/Generalización): Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected), ejemplo:

  11. Diagrama de Clases En la figura se especifica que Auto y Camión heredan de Vehículo, es decir, Auto posee las Características de Vehículo (Precio, VelMax, etc) además posee algo particular que es Descapotable, en cambio Camión también hereda las características de Vehiculo (Precio, VelMax, etc) pero posee como particularidad propia Acoplado, Tara y Carga. Cabe destacar que fuera de este entorno, lo único "visible" es el método Caracteristicas aplicable a instancias de Vehículo, Auto y Camión, pues tiene definición publica, en cambio atributos como Descapotable no son visibles por ser privados.

  12. Diagrama de Clases • Agregación: Para modelar objetos complejos, no bastan los tipos de datos básicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades: • Por Valor: Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comunmente llamada Composición (el Objeto base se contruye a partir del objeto incluido, es decir, es "parte/todo"). • Por Referencia: Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye. Este tipo de relación es comunmente llamada Agregación (el objeto base utiliza al incluido para su funcionamiento).

  13. Diagrama de Clases Un Ejemplo es el siguiente: En donde se destaca que: Un Almacen posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias). Cuando se destruye el Objeto Almacen también son destruidos los objetos Cuenta asociados, en cambio no son afectados los objetos Cliente asociados. La composición (por Valor) se destaca por un rombo relleno. La agregación (por Referencia) se destaca por un rombo transparente. La flecha en este tipo de relación indica la navegabilidad del objeto referenziado. Cuando no existe este tipo de particularidad la flecha se elimina.

  14. Diagrama de Clases Asociación: La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro. Ejemplo: Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente.

  15. Diagrama de Clases Dependencia o Instanciación (uso): Representa un tipo de relación muy particular, en la que una clase es instanciada (su instanciación es dependiente de otro objeto/clase). Se denota por una flecha punteada. El uso más particular de este tipo de relación es para denotar la dependencia que tiene una clase de otra, como por ejemplo una aplicación grafica que instancia una ventana (la creación del Objeto Ventana esta condicionado a la instanciación proveniente desde el objeto Aplicacion): Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicación).

  16. Diagrama de Clases Ejercicios Resueltos • A partir del siguiente código generar el diagrama de clase. packagediagramadeclases; publicclass Persona { privateintrut; privateString nombre; privateint edad; Persona(){} Persona(intrut, String nombre, int edad) { this.rut = rut; this.nombre= nombre; this.edad = edad; } publicintgetRut() { returnrut; } publicvoidsetRut(intrut) { this.rut = rut; } publicStringgetNombre() { return nombre; } publicvoidsetNombre(String nombre) { this.nombre = nombre; } publicintgetEdad() { return edad; } publicvoidsetEdad(int edad) { this.edad = edad; } }

  17. Diagrama de Clases Ejercicios Resueltos packagediagramadeclases; importjava.util.ArrayList; importjava.util.List; publicclassAlumno extends Persona { privateint rol; privateString escuela; public List<Nota> notas= new ArrayList<Nota>(); public Alumno(){} public Alumno(int rol, String escuela) { this.rol = rol; this.escuela = escuela; } publicintgetRol() { return rol; } publicvoidsetRol(int rol) { this.rol = rol; } publicStringgetEscuela() { return escuela; } publicvoidsetEscuela(String escuela) { this.escuela = escuela; } }

  18. Diagrama de Clases packagediagramadeclases; importjavax.swing.JOptionPane; publicclassMain { publicstaticvoidmain(String[] args) { Alumno al = new Alumno(); al.setRut(Integer.parseInt(JOptionPane.showInputDialog("Ingrese Rut"))); al.setNombre(JOptionPane.showInputDialog("Ingrese Nombre")); al.setEdad(Integer.parseInt(JOptionPane.showInputDialog("Ingrese Edad"))); al.setRol(Integer.parseInt(JOptionPane.showInputDialog("Ingrese Rol"))); al.setEscuela(JOptionPane.showInputDialog("Ingrese Escuela")); JOptionPane.showMessageDialog(null, "Alumno Ingresado"); Stringopcion=""; while(!(opcion.equals("s"))) { opcion = JOptionPane.showInputDialog("Ingrese Opcion\n a) Ingresar Nota\n s) Salir"); if(opcion.equals("a")) { Nota n = new Nota(); n.setRamo(JOptionPane.showInputDialog("Ingrese Rut")); n.setCalificacion(Double.valueOf(JOptionPane.showInputDialog("Ingrese Rut"))); n.setPonderacion(Double.valueOf(JOptionPane.showInputDialog("Ingrese Rut"))); } elseif (!(opcion.equals("s"))) { JOptionPane.showMessageDialog(null, "Opcion Incorrecta"); } } } }

  19. Diagrama de Clases Relaciones encontradas 1.- Alumno hereda de Persona (Alumno extends Persona) 2.- Alumno tiene una relación de composición con Notas (Alumno 0..1 tiene 0..* Notas) (publicList<Nota> notas) 3.- Alumno y Nota tiene una relación de dependencia con Main(Main hace new de las 2) (Alumno al = new Alumno() yNota n = new Nota()) 4.- Todas las clases están en el package o carpeta diagramaDeClases 5.- La clase Alumno importa Java.util.ArrayList y Java.util.List (Depende del Diagramador) 6.- La clase Main importa javax.swing.JOptionPane (Depende del Diagramador)

  20. Diagrama de Clases 4 3 1 2 3

More Related