Daves Balthazar

021 – Padrão de Projeto ITERATOR

PARA LISTAS EM FLUTTER

Playlist do Curso de Padrão de Projeto de Software (Design Patterns)

Em programação de computadores, um iterador se refere tanto ao objeto que permite ao programador percorrer um container, (uma coleção de elementos) particularmente listas,[1][2][3] quanto ao padrão de projetos Iterator, no qual um iterador é usado para percorrer um container e acessar seus elementos. O padrão Iterator desacopla os algoritmos dos recipientes, porém em alguns casos, os algoritmos são necessariamente específicos dos containers e, portanto, não podem ser desacoplados.

Vários tipos de iteradores são frequentemente fornecidos via uma interface de container. Embora a interface e a semântica de um determinado iterador são fixas, os iteradores são muitas vezes implementados em termos das estruturas subjacentes a uma implementação de container e são frequentemente acoplados ao container para permitir a semântica operacional do iterador. Note que um iterador segue uma rota e também dá acesso a elementos de dados do container, mas não realiza iteração (ou seja, não tem total liberdade, como sugere sua terminologia). Um iterador é comportamentalmente semelhante ao cursor de um banco de dados. Iterators datam da linguagem de programação CLU de 1974.

Iteradores externos e o padrão iterador
Um iterador externo pode ser imaginado como um tipo de ponteiro que possui duas operações primárias: referenciar um elemento particular na coleção de objetos (chamado elemento de acesso) e modificar a si mesmo para apontar para o próximo elemento (chamado elemento de travessia). Também deve existir uma maneira de criar um iterador para apontar para algum primeiro elemento bem como alguma maneira de determinar quando o iterador esgotou todos os elementos no container. Dependendo da linguagem e do uso pretendido, iteradores podem também fornecer operações adicionais ou exibir comportamentos diferentes.

O propósito primário de um iterador é permitir que um usuário processe cada elemento de um container enquanto isola o usuário da estrutura interna de um container. Isto permite que o container armazene elementos da maneira que ele desejar permitindo que o usuário trate-o como se ele fosse uma simples lista ou sequencia. Uma classe iterador normalmente é projetada em estreita coordenação com a classe container correspondente. Normalmente, o container fornece os métodos para criação de iteradores.

Observe que um contador de loop algumas vezes é referenciado como um iterador de loop. Um contador de loop, entretanto, apenas fornece a funcionalidade de travessia e não a funcionalidade de acesso ao elemento.

Geradores
Ver artigo principal: Gerador (ciência da computação)
Uma maneira de implementar iteradores é usar um tipo especial de subrotina, conhecida como um gerador, que pode produzir valores para o seu chamador várias vezes (em vez de retornar apenas um). A maioria dos iteradores são naturalmente expressíveis como geradores, mas devido aos geradores preservarem seu estado local entre as chamadas, eles são particularmente bem adaptados para iteradores stateful complexos, como atravessadores de árvore. Um exemplo de um gerador que retorna os números de Fibonacci usando declaração de produção (yield) da linguagem Python pode ser visto abaixo:

def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a+b

for numero in fibonacci(): # Utilização do gerador como um iterador
print numero
Iteradores implícitos
Algumas linguagens orientadas a objetos como C#, Delphi (versões mais recentes), Go, Java (versões mais recentes), Lua, Perl, Python, Ruby, fornecem uma maneira intrínseca de iteração através de elementos de um objeto container sem a introdução de um objeto iterador explícito. Um objeto iterador real pode existir na realidade, mas se ele existir ele não é exposto dentro do código fonte da linguagem.

As linguagens que suportam compreensão de lista ou construções similares podem também fazer uso de iteradores implícitos durante a construção da lista de resultado, como em Python:
Como sendo um padrão para percorrer listas, conjuntos, mapas etc:

É o que você chamaria de “cursor” se estivesse escrevendo stored procedures em algum banco SQL. Portanto não é um conceito novo ou extraordinariamente difícil de manipular.

Se você sabe que o seu List é um ArrayList, então não há problemas em usar o índice em vez de usar um Iterator. Para todos os outros tipos (LinkedList, Set, Map etc.) você tem de usar o Iterator.