Fala dev, tranquilo? Comigo está tudo bem, depois de quase 2 meses voltei a escrever artigos aqui para o blog, o motivo da pausa basicamente foi para descansar e restaurar as energias, aliás, aproveitando o artigo gostaria de dar um conselho aos devs que estão iniciando, DESCANSEM, excesso de trabalho não faz bem a ninguém e pode te causar sérios problemas, se até seu servidor da uma caída de vez em quando para descansar porque você não pode?
Dessa vez vim trazer mais um artigo da série “A Fábrica de Arquitetos” e hoje vou trazer o padrão Iterator.
…
O que é?
Frequência de uso: 5/5 – Muito Alto
O Iterator Pattern é um padrão da família dos comportamentais que permite você criar sua própria estrutura de dados sequencial (listas, filas, pilhas).
Tenho certeza de que você já precisou manipular os dados de uma lista, fila ou pilha em algum projeto e acabou se deparando com um cenário no qual faltava métodos ou recursos para realizar o que você queria.
Então imagine o seguinte cenário, você está trabalhando em uma aplicação para consultório médico, no qual você tem cadastrado no seu banco de dados diversos pacientes.
Ao consultar seu banco de dados você recebe uma lista de pacientes de retorno e em determinado ponto você precisa saber quem é o próximo paciente, o anterior a quantidade total e seus respectivos dados.
Você deve estar imaginando (Ah, é só acessar o índice anterior, o próximo índice, usar o. Count para saber a quantidade total e acessar seus dados), sim, essa solução funciona, porém, e se você tivesse que fazer isso em mais de um ponto no código, será que ficaria elegante?
Outro cenário problemático, e se ao invés de só obter os dados do paciente você precisasse realizar algum filtro rápido ou alguma manipulação complexa, você iria repetir esse código? É CLARO QUE NÃO!
Para esses cenários temos o Iterator Pattern para nos salvar!
Logo abaixo vou deixar o diagrama do padrão
…
Show me the code!
Bom entendemos que criar estruturas sequenciais complexas é algo necessário no dia – a – dia de qualquer projeto, agora vamos pegar o nosso exemplo anterior, do sistema para consultório médico.
Então temos primeiramente nossa entidade Paciente.
Patient.cs
Como vocês podem ter visto no diagrama, esse padrão se divide em 2 principais componentes, as coleções personalizadas (coleções nas quais os iteradores irão manipular) e os iteradores.
Então vamos – lá, vamos começar pela coleção personalizada.
IEntityCollection.cs
PatientCollection.cs
Perceba que temos uma interface genérica IEntityCollection que servirá de contrato para todas as coleções (no nosso caso só iremos ter uma, a PatientCollection, mas poderia ter mais).
Depois temos nossa coleção personalizada PatientCollection no qual utilizamos um operador de índice this[int index] onde ao dar GET temos um ponteiro para o elemento dentro do ArrayList.
Assim temos nossa coleção personalizada de pacientes, agora precisamos criar nosso iterador, ele servirá para realizar as operações de manipulação dos dados da coleção.
IEntityIterator.cs
PatientIterator.cs
Novamente temos uma interface genérica IEntityIterator que servirá de contrato para todos iteradores (no momento só temos o PatientIterator).
E no nosso iterador PatientIterator temos operações personalizadas (First, IsDone, IsLast, Next e Previous, além de poder iterar de quantos em quantos elementos necessitar) com base na coleção personalizada que temos.
Poderíamos ter muitas outras operações, criei somente essas para ser mais didático.
Por fim, basta consumir nosso iterador.
Program.cs
Note como fica elegante, temos nossa lista personalizada, adicionamos os itens a lista, criamos nosso iterador com base na lista personalizada e por fim realizamos as operações necessárias.
Agora quando for necessária uma operação complexa basta cria – lá no iterador e usar onde for necessário sem repetição de código!
Por fim o resultado foi:
OBS: Esse padrão poderia ter sido aplicado de forma mais genérica, passando como tipo somente a entidade na qual fossem necessárias as operações base e criando os iteradores personalizados, porém achei essa implementação complexa demais para um artigo básico.
…
Conclusão
No artigo de hoje vimos um dos padrões mais usados pela comunidade de desenvolvimento, principalmente pelo fato de quase todo sistemas de software ter a necessidade de lidar com listas, principalmente os que usam linguagens orientadas a objeto.
Espero que tenha ficado claro e objetivo o quanto esse padrão é útil no dia – a – dia.
Agradeço a atenção e bons estudos!!!!!
Caso precise entrar em contato, me mande uma mensagem aqui.
Baixe o projeto clicando aqui.
AVISO
Minha nova plataforma já está em construção! irá conter todos os recursos dessa plataforma, cursos pagos e gratuitos, treinamentos, mentorias e muito mais, caso queira ter acesso antecipado (gratuito) e ser um dos primeiros a testar me mande um email em lucas.eschechola@outlook.com, obrigado!
…