Atividade 13: Iterator
Exercício 1: Aplicações
Seção intitulada “Exercício 1: Aplicações”Para cada cenário abaixo, indique se o padrão Iterator é apropriado ou não e justifique em 2–3 frases.
- Um app de música precisa percorrer uma playlist por várias ordens (sequencial, embaralhada, só favoritas), sem que o restante do código conheça a estrutura interna da coleção.
- Um explorador de arquivos precisa percorrer uma árvore de pastas e arquivos sem que a interface exponha como os nós estão ligados.
- Um sistema precisa ler um arquivo gigante por partes (streaming), entregando um registro por vez em vez de carregar tudo na memória.
- Um array fixo de tamanho conhecido, percorrido sempre por um único laço
forsimples dentro da própria classe dona do array. - Uma conexão de banco de dados que precisa expor as linhas de um
ResultSetuma a uma, escondendo o cursor e a estrutura da tabela.
Para cada item, responda:
- “Faz sentido usar Iterator” ou “Não faz sentido usar Iterator”.
- Explique rapidamente o porquê (travessia própria, encapsulamento da estrutura, várias travessias, coleção fixa e simples, overengineering, etc.).
Exercício 2: Rastreando o anti-pattern em um projeto real
Seção intitulada “Exercício 2: Rastreando o anti-pattern em um projeto real”Baixe o projeto, importe na IDE e rode o Main:
Baixar projeto_iterator_antipattern.zip
É um app de música (Maven, Java 17) que percorre uma playlist de várias formas (tocar tudo, embaralhar, sugerir favoritas). O código funciona, mas expõe a estrutura interna da coleção e espalha a travessia pelos clientes.
mvn compilejava -cp target/classes br.venson.net.designpatterns.iterator.MainNo Eclipse/IntelliJ, basta importar a pasta do projeto e executar a classe
Main.
Analise o código e responda:
Playlist.getFaixas()devolve a própria lista interna. Quais são as consequências de encapsulamento disso? Que clientes passam a depender da estrutura da playlist?- Ao rodar o
Main, observe a ordem da playlist antes e depois detocarEmbaralhado. Explique por que a ordem original mudou. - A travessia por índice se repete em três clientes (
Player,Recomendador,RelatorioPlaylist). O que acontece se aPlaylisttrocar sua estrutura interna (array, lista ligada, páginas)? Quantos pontos quebram? - Proponha uma refatoração com o padrão Iterator, deixando explícitos:
- a interface de iterador (
temProxima()/proxima()); - o iterador concreto que guarda a posição;
- o agregado
Playlist, que cria o iterador.
- a interface de iterador (
- Como a solução permite novas formas de travessia (embaralhada, só favoritas) sem duplicar laços e sem expor a estrutura interna?
Entrega: um diagrama de classes (antes/depois), o código refatorado e um parágrafo justificando cada decisão de design.