El patrón Iterador es un patrón de diseño de comportamiento que te permite recorrer elementos de una colección sin exponer su representación subyacente, es decir, lista, árbol, etc…

¿Qué problema resuelve el patrón iterador?

Uno de los problemas clásicos, que resuelve el patrón iterador, es el relacionado con “colecciones”. Las colecciones son uno de los tipos de datos más utilizados en programación. Una colección es un contenedor para un grupo de objetos. El problema es que algunas colecciones se basan en pilas, árboles, grafos, y otras estructuras de datos complejas.

Si tienes una colección basada en una lista, o en un árbol, por ejemplo, puede ser complicado recorrer cada elemento de la colección sin acceder a los mismos elementos una y otra vez. Y los algoritmos transversales que puedas añadir a la colección pueden desdibujar su responsabilidad principal: almacenar de forma eficiente los datos.

La idea del patrón iterador es extraer el comportamiento transversal de una colección en un objeto separado llamado iterador.  El iterador, además de implementar el algoritmo, encapsula todos los detalles transversales (posición actual, elementos que quedan, etc…)

¿Cuándo usar el patrón iterador?

Podrías usar el patrón iterador cuando tu colección tenga una estructura de datos compleja “bajo el capó”, pero quieres ocultar su complejidad a los clientes. El iterador encapsula los detalles de trabajar con una estructura de datos compleja, proporcionando al cliente varios métodos simples para acceder a los elementos de la colección.

También podrías usar este patrón para reducir la duplicación del código transversal en tu aplicación. El código de los algoritmos de iteración no triviales tiende a ser muy voluminoso. Por tanto, mover el código transversal a los iteradores puede ayudarte a hacer que el código de la aplicación sea más ágil y limpio.

Y por último, usa el patrón iterador cuando quieras que tu código pueda atravesar diferentes estructuras de datos, o cuando no conozcas de antemano los tipos de las estructuras.

Pros y contras del patrón iterador

Los siguientes son algunos de los “pros y cons” de este patrón.

Pros

Contras

  • Principio de responsabilidad única. Puedes limpiar el código del cliente y las colecciones extrayendo algoritmos transversales voluminosos en clases separadas

  • Principio abierto/cerrado. Puedes implementar nuevos tipos de colecciones e iteradores y pasarlos al código existente sin romper nada

  • Puedes iterar sobre la misma colección en paralelo porque cada objeto iterador contiene su propio estado de iteración

  • Puedes retrasar una iteración y continuarla cuando sea necesario

  • Aplicar este patrón puede ser una exageración si tu aplicación solo funciona con colecciones simples

  • Usar un iterador puede ser menos eficiente que pasar directamente por los elementos de algunas colecciones especializadas

“Show me the code”

El patrón iterador es bastante complejo, pero muy popular y común en código PHP. Muchos frameworks y bibliotecas lo utilizan para proporcionar una forma estándar de recorrer sus colecciones. De hecho, PHP tiene una interfaz Iterator incorporada que puedes usar para crear iteradores personalizados compatibles con el resto del código PHP.

Si quieres tener una idea de cómo se ve el patrón Iterator, puedes ver el ejemplo de refactoring.guru. En el ejemplo del mundo real verás como se utiliza la interfaz Iterator incorporada de PHP y se accede de forma fácil a ficheros CSV.

¿Utilizas el patrón Iterador en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuentes:

Compartir es construir