Saudações, leitores!
No mundo da Orientação a Objetos, uma dúvida um tanto quanto comum entre os desenvolvedores é identificar, selecionar e implementar Design Patterns no desenvolvimento de um software. Se você também partilha dessa dúvida, acompanhe o artigo!
Introdução
Design Patterns (Padrões de Projeto) são modelos orientados a objetos que podem ser empregados para simplificar ou solucionar determinadas ocasiões no software. O uso destes padrões provê uma melhor estrutura dos elementos do projeto, como a criação, estrutura e comportamento das classes.
Para implementar Design Patterns, é importante possuir conhecimentos sólidos em Programação Orientada a Objetos e um bom nÃvel de abstração. Mesmo assim, à s vezes nos encontramos em situações em que sabemos que um Design Pattern será útil, mas não sabemos especificamente qual deles.
O objetivo desse artigo é apresentar três dicas para ajudar a identificar o Design Pattern adequado para a solução, bem como o local no qual ele deve ser implementado no código-fonte.
1) UML
Uma linguagem de modelagem pode ser uma das melhores ferramentas para prever a aplicação de um Design Pattern. Os diagramas UML permitem expor os aspectos (tanto técnicos quanto de negócios) de um projeto de software, facilitando a visão como um todo. Um projetista pode, por exemplo, relacionar o conceito de um Design Pattern com a saÃda de um diagrama UML para encontrar a melhor implementação.
Para incrementar ainda mais essa dica, vou tentar apresentar alguns exemplos reais!
Imagine que, ao elaborar um Diagrama de Caso de Uso, foi possÃvel verificar que dez casos de uso dependem de um evento em comum para realizar suas ações. Logo, poderÃamos implementar um Observer e registrar estes dez casos de uso como “observadores” do evento. Dessa forma, quando o evento for disparado, os dez casos de uso serão notificados.
Em outra situação, suponha que o Diagrama de Atividades revelou que diferentes objetos são acessados ao realizar um cálculo de juros atualizados a cada ano. Para este caso, um Visitor seria adequado para acumular os valores conforme os objetos concretos são acessados, aliás, “visitados”.
2) Brainstorming
Em uma equipe de desenvolvimento, geralmente cada desenvolvedor tem ideias, conceitos e lógica diferentes dos outros. Além disso, é bem provável que cada um tenha conhecimentos em regras de negócio distintas. Dito isso, reunir todos os desenvolvedores para discutir a aplicação de Design Patterns nas funcionalidades do software é uma técnica interessante. No Scrum, esse brainstorming pode ser realizado na Sprint Planning, enquanto as funcionalidades do Sprint Backlog ainda estão sendo avaliadas.
O brainstorming permite que a identificação de Design Patterns seja feita de forma coletiva, ou seja, um dos desenvolvedores pode apresentar a natureza de uma determinada regra de negócio, enquanto o outro sugere a aplicação de um dos Design Patterns como solução. Em vista disso, podemos afirmar que essa técnica também promove o especialização dos desenvolvedores na área de Engenharia de Software.
Importante: essa dica foi elaborada baseada em fatos reais!
3) TDD
Quando um desenvolvedor programa com TDD, ele realiza várias refatorações no código-fonte, correto? Pois bem, essas refatorações podem gerar novos nÃveis de abstração no software, abrindo as portas para a aplicação de Design Patterns. Por exemplo, ao extrair um método de uma classe, criar heranças ou instanciar vários objetos, é possÃvel observar as responsabilidades de cada classe e a dependência que existem entre elas. Baseado nessa abstração, o desenvolvedor pode aplicar alguns padrões de criação (Creational Design Patterns), como Abstract Factory, Builder ou Factory Method. Além da refatoração em si, ele estará contribuindo com a redução da complexidade, reutilização de código e minimizando a dependência entre classes.
Muitas vezes, durante a refatoração, o desenvolvedor acaba por aplicar algum Design Pattern sem notar. Algum tempo depois, quando o desenvolvedor toma conhecimento da existência do Design Pattern, imediatamente percebe que já o utilizou antes, mesmo que implicitamente. Isso já aconteceu comigo com o Singleton. Claro, não implementei exatamente como a teoria sugere, mas o cenário e a ideia foram praticamente os mesmos.
Antes de finalizar o artigo, gostaria também de destacar que, para a aplicação correta e adequada de Design Patterns, é desejável que o desenvolvedor saiba o objetivo principal de cada um deles. Não é preciso saber implementá-los de cabeça, mas só pelo fato de conhecer o propósito de cada um deles já é o suficiente! Pra ser sincero, eu ainda estou nessa luta para compreender a finalidade de todos eles…
Abraço, pessoal!
Até a próxima semana.
Bom dia André! Parabens mais uma excelente dica…e matéria.
André, o DER pode ser usado tambem no PD?
Estou pensando em usar DER + Scrum + TDD oque voce acha? embora estou caminhando na OO com Lazaruz.
Bom dia, Benedito!
Sim, o DER também pode ser utilizado para definir os Design Patterns, porém, eu recomendaria o Diagrama de Classes, principalmente por apresentar caracterÃsticas pertinentes a Orientação a Objetos. A respeito da junção do Scrum e TDD, sou totalmente de acordo. Se houver processos de gerenciamento e de desenvolvimento bem definidos, o Ãndice de bugs no software pode ser bastante reduzido.
Obrigado pelo comentário!
Ótimo artigo André, estou procurando justamente por bons artigos sobre design patterns e poo com delphi e o seu blog está sendo de grande ajuda.
Olá, Manoel!
Sinto-me grato por ajudá-lo. Continue acompanhando o blog!
Abraço!
Olá André, seu blog é muito massa, sempre passo por aqui pra ler alguma coisa, e sempre acho muita coisa bacana.
Os padrões de projeto mesmo é um deles, lendo a revisão dos Design Patterns e estudando POO.
Tenho um ERP (muito estruturado) que assusta muito! E quebrar esse paradigma é muito difÃcil, mas estou me esforçando.
Bom, lendo um livro sobre o assunto ele diz que devemos separar o que varia.
Quando se fala disso está falando de acoplamento? Variáveis globais?
Poderia dar exemplo disso?
Desculpe se a pergunta parecer um pouco idiota!
Abraço.
Olá, Cleiton!
Rapaz, não existe pergunta idiota! Todos nós, programadores, estamos sempre sujeitos a novas dúvidas a todo momento. 😉
Quebrar o paradigma estrutural e mergulhar na Orientação a Objetos realmente é um grande desafio, mas não é impossÃvel. Já fiz uma refatoração de um projeto que estava estruturado, embora pequeno, e o resultado foi bastante significativo.
Bom, sobre o trecho do livro, acredito que o autor estava se referindo ao padrão de projeto Template Method, que consiste em criar um algoritmo que contém métodos “fixos” na classe base e comportamentos que “variam” nas classes herdadas, reduzindo a duplicação de código.
Grande abraço!
Bom dia, boa tarde e boa noite meu amigo! Antes de tudo quero te agradecer por todas as vezes que me salvou rsrsrs
Enfrento o seguinte problema meu amigo, até pesquisei um pouco, mas não obtive sucesso.
Bom, eu tenho uma API interna com vários endpoints, minha aplicação local consulta essa API para diversos processos relacionados ao faturamento, hoje essas requisições ficam dispersas no meu controller e queria centralizá-las em uma única classe, existe algum design pattern que me auxilia nessa questão?
Opa, Luiz, boa noite!
Primeiramente, obrigado pelo agradecimento! 🙂
Luiz, pelo que pude compreender, o Façade talvez seria a melhor opção. A classe Façade seria esse “centralizador” que você está buscando, enquanto as SubSystem Classes seriam os endpoints, caso você queira também separá-los em classes por contexto.
Outra opção seria o Strategy, que permite selecionar um algoritmo (estratégia) em tempo de execução. Esses algoritmos poderiam ser os endpoints, enquanto o centralizador seria o Context.
Espero que lhe ajude. Abraço!