La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación.

Presentaciones similares


Presentación del tema: "Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación."— Transcripción de la presentación:

1 Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.2 Unidad Didáctica 13

2 UD13: Factorías e Iterables Índice  Patrones de diseño  Factorías  Motivación  Implementación  Ejemplos  Ejercicios  Iterables  Motivación  Implementación  Ejemplos  Ejercicios  Resumiendo… 2

3 Patrones de diseño Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

4 UD13: Factorías e Iterables Patrones de diseño I 4  En el mundo del desarrollo software existen problemas recurrentes con soluciones que siguen un mismo patrón.  Se han desarrollado técnicas para solucionar estos problemas denominándolos patrones de diseño o patrones de software.  Los patrones de software se pueden definir como:  soluciones probadas para determinados tipos de problemas que se presentan a menudo en distintos contextos pero con características similares.

5 UD13: Factorías e Iterables Patrones de diseño II 5  Ventajas de los patrones de software:  Probados, porque han sido usados en múltiples problemas anteriormente.  Reutilizables, porque los problemas que resuelven aparecen repetidos en las aplicaciones.  Expresivos, porque establecen un conjunto común de soluciones aceptadas por los programadores.

6 UD13: Factorías e Iterables Patrones de diseño III 6 También existen los antipatrones: ◦ Cortar y pegar ◦ Código spaguetti  Flujo de ejecución complicado y demasiado variable (múltiples return, sentencias de salto…). ◦ Objeto todopoderoso  Una sola clase concentra toda la funcionalidad de la aplicación. ◦ Poltergeist  Emplear objetos cuyo único propósito es pasar información a terceros. ...

7 UD13: Factorías e Iterables Patrones de diseño IV 7 Tipos de patrones: 1. Creacionales  Ejemplo: Factorías 2. Estructurales  Ejemplo: Adaptadores 3. De comportamiento  Ejemplo: Iteradores

8 Factorías Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

9 UD13: Factorías e Iterables Factorías: Motivación I 9 Programador El programador necesita manejar racionales en su aplicación Interfaces Racional…otras… Clases RacionalImplRacionalImpl2…otras… Biblioteca disponible El programador debe buscar qué interfaz y qué clase necesita

10 UD13: Factorías e Iterables Factorías: Motivación II 10  Problemas del enfoque tradicional: 1. El programador necesita acceso total a las clases y debe escoger una. 2. Cambiar su elección implica cambiar muchas líneas de código.  La factoría permite al programador: 1. Usar el tipo de la interfaz sin preocuparse de su implementación. 2. Sustituir una implementación por otra modificando sólo el código de la factoría.

11 UD13: Factorías e Iterables Factorías: Implementación 11  Las factorías serán clases que contendrán uno o varios métodos estáticos que devuelvan objetos del tipo adecuado.  Generalmente habrá un método estático por cada constructor de la clase que se utiliza.  Con los constructores, se construyen los objetos que devuelve cada método de la factoría.

12 UD13: Factorías e Iterables Factorías: Ejemplos I 12 package utiles; public class Racionales { public static Racional create() { return new RacionalImpl(); } public static Racional create(Integer numerador) { return new RacionalImpl(numerador); } public static Racional create(Integer numerador, Integer denominador) { return new RacionalImpl(numerador,denominador); }

13 UD13: Factorías e Iterables Factorías: Ejemplos II 13 package utiles; public enum TipoRacional { BASICO, SIMPLIFICADO } package utiles; public class Racionales { private static TipoRacional opcion = TipoRacional.BASICO; public static void setOpcion(TipoRacional n) { opcion = n; } …

14 UD13: Factorías e Iterables 14 Factorías: Ejemplos III … public static Racional create() { Racional r = null; switch (opcion) { case BASICO: r = new RacionalImpl(); break; default: r = new RacionalImpl2(); } return r; } public static Racional create(Integer num) { Racional r = null; switch (opcion) { case BASICO: r = new RacionalImpl(num); break; default: r = new RacionalImpl2(num); } return r; } public static Racional create(Integer num, Integer den){ Racional r = null; switch (opcion) { case BASICO: r = new RacionalImpl(num, den); break; default: r = new RacionalImpl2(num, den); } return r; }

15 UD13: Factorías e Iterables Factorías: Ejercicios  Defina una clase denominada Sets que controle la creación de objetos de tipo Set:  Cree un método para los constructores del tipo HashSet sin parámetros y a partir de un objeto tipo Collection.  Defina una clase denominada Lists que controle la creación de objetos de tipo List:  En función de un atributo configurable, cada método devolverá un objeto de tipo ArrayList o LinkedList. 15

16 Iterables Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

17 UD13: Factorías e Iterables Iterables: Motivación 17 El programador quiere recorrer todos los datos contenidos en un objeto de un tipo Agregado agregado Agregado ¿Puede usarse el for extendido? Y en caso de que se pueda… ¿Cómo sabe la sentencia for cómo extraer los datos del objeto? ¿Cómo sabe cuándo no quedan más datos que recorrer? for ( T elem : agregado) { mostrar(elem); }

18 UD13: Factorías e Iterables Iterables: Implementación I 18 Para que un tipo agregado pueda recorrerse mediante un for extendido, debe implementar la interfaz java.lang.Iterable. public interface Iterable { Iterator iterator(); }

19 UD13: Factorías e Iterables Iterables: Implementación II 19 El método iterator() de Iterable devuelve un iterador. La interfaz Iterable permite que el objeto que la implementa se convierta en una factoría de iteradores. Un iterador es un objeto especializado en hacer recorridos. Para que en Java un objeto se considere un iterador, tiene que implementar la interfaz java.util.Iterator: public interface Iterator { boolean hasNext(); T next(); void remove(); }

20 UD13: Factorías e Iterables Iterables: Implementación III 20  ¿Para qué sirve cada método de un iterador?  boolean hasNext();  Devuelve true si aún quedan elementos por recorrer y false en caso contrario.  T next();  Devuelve el siguiente elemento del recorrido.  Actualiza el estado del iterador para devolver el siguiente elemento de la secuencia en la próxima llamada.  void remove();  Operación opcional que elimina el último elemento devuelto por el iterador.  En FP, nuestros iteradores NO MODIFICARÁN el objeto que se recorre.  Si se invoca el método remove, se lanzará la excepción UnsupportedOperationException

21 UD13: Factorías e Iterables Iterables: Implementación IV 21 Agregado Iterable Supongamos que la clase Agregado implementa Iterable agregado (Agregado ) Iterator it = ag.iterator(); it (Iterator ) T o = it.next(); o (T)

22 UD13: Factorías e Iterables 22 for( T elem : agregado) { mostrar(elem); } for(Iterator it = agregado.iterator(); it.hasNext();) { T e = it.next(); mostrar(e); } Iterator it = agregado.iterator(); while (it.hasNext()) { mostrar(it.next()); } Iterables: Implementación V  Traducciones internas del for extendido usando iteradores:

23 UD13: Factorías e Iterables Iterables: Implementación VI 23  Para implementar una clase que sea Iterable, debemos seguir los pasos: 1. La clase implementará la interfaz Iterable, siendo T el tipo de los elementos que se van a recorrer. 2. Para cada tipo de recorrido que queramos permitir, implementaremos una clase interna, la cual debe implementar Iterator.

24 UD13: Factorías e Iterables Iterables: Implementación VII 24 3. El método iterator() devolverá un nuevo objeto de la clase interna oportuna. 4. Los métodos hasNext() y next() de cada clase interna deben implementarse de acuerdo al tipo de recorrido que se esté llevando a cabo. 5. El método remove() (en FP) lanzará siempre la excepción UnsupportedOperationException.

25 UD13: Factorías e Iterables Iterables: Ejemplos I 25 import java.util.Iterator; import java.util.NoSuchElementException; public class ArrayIterableImpl implements Iterable { private T[] array; public ArrayIterableImpl(T[] array) { this.array = array; } public Iterator iterator() { return new IteradorArray(); } private class IteradorArray implements Iterator { private Integer pos; public IteradorArray() { pos = 0; } public boolean hasNext() { return pos < array.length; } public T next() { if (!hasNext()) { throw new NoSuchElementException(); } T actual = array[pos]; pos++; return actual; } public void remove() { throw new UnsupportedOperationException(); }

26 UD13: Factorías e Iterables Iterables: Ejercicios  Secuencia aritmética  Cree una clase denominada SecuenciaAritmetica que implemente Iterable.  Los objetos SecuenciaAritmetica se recorrerán mediante un iterador mostrando:  Un valor de la secuencia entre dos números dados que se recogerán como parámetros en el constructor.  El siguiente valor será el resultado de añadir la razón aritmética (también recogida en el constructor) al valor actual.  Nota: este ejercicio se explicará en la unidad didáctica sobre Iterables Virtuales. 26

27 UD13: Factorías e Iterables Resumiendo… I 27 Una factoría es una clase que nos permite construir objetos de uno o varios tipos, sin necesidad de conocer cuál o cuáles son las clases concretas que los implementan. En FP, implementaremos las factorías mediante clases que contienen métodos estáticos, generalmente uno por cada constructor de la clase que utilicemos.

28 UD13: Factorías e Iterables Resumiendo… II 28 Para que los datos contenidos por un objeto de una clase puedan ser recorridos mediante un for extendido, la clase debe implementar la interfaz Iterable. Al implementar la interfaz Iterable, la clase incorporará un método iterator() que devuelve un iterador sobre la clase. Dicho iterador determina el tipo de recorrido que se llevará a cabo. El método iterator() puede invocar a su vez al método iterator() de otro objeto, o construir un nuevo objeto de una clase interna que implemente la interfaz Iterator. Pueden existir varios tipos de recorrido para una clase. Para cada tipo de recorrido, debemos disponer de clases distintas que implementen la interfaz Iterator.


Descargar ppt "Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación."

Presentaciones similares


Anuncios Google