Pular para o conteúdo principal

Para que Servem os Design Patterns?

Design Patterns ou Padrões de Projeto são sugestões de modelagem de classes (utilizando o Paradigma de Orientação a Objetos) que visam resolver problemas comuns do Paradigma de Programação Estruturado.

Na programação estruturada é comum termos uma situação em que após a execução de um comando que retorna um valor colocar-se um if para verificar a validade do valor retornado. Em seguida, executa-se algumas chamadas de função não inerentes ao fluxo das regras de negócio principal, mas necessárias para o fluxo de regras de negócio secundárias. Regras, estas, relacionadas ao valor gerado pela execução de comando inicial. Vejamos o fluxograma abaixo para entender melhor.

O fluxo principal do negócio seria: Cadastrar novo produto, Atender os clientes, Efetuar a venda, e por último Entregar o produto vendido ao cliente. Todas as lojas tem como objetivo principal vender produtos, para faturar, e obter lucro. Como ilustrado no diagrama de atividades abaixo.


Observe que existe uma grande diferença entre o diagrama de ativos onde é cada noção do sistema tá descrito nele e como o fluxo é bem mais simples. Até então não sabemos qual é a maneira mais adequada para criar os objetos organizar a estrutura eles e controlar o comportamento deles. Ainda existe muita coisa subtendida nessas abstrações.

Digamos ainda que uma loja insira em seu catálogo um novo produto ou atualize o estoque dele. Mas, ela também deseje realizar tarefas secundárias importantes, como: escrever no log a operação feita, criar anúncios nas redes sociais, atualizar anúncios no marketplaces ou ainda enviar uma campanha de e-mailmarketing para os clientes, dentre outras; não fazem parte do Fluxo principal de regras de negócio de vendas de mercadorias. Recebemos aqui que existem várias sob atividades e subfluxos que Precisamos desenhar para atender a necessidade do sistema. O diagrama UML de atividades a seguir demonstra o caso.


Essas são operações que precisam ser executadas todas as vezes que um produto novo é inserido no ecommerce (ou um produto que estava indisponível para venda), devido a falta de mercadorias no estoque, se tornou disponível. Vejamos um exemplo de código que ilustra esse cenário. 


Essa é a forma como geralmente costumamos programar utilizando o Paradigma Estruturado. Nele temos alguns problemas, como por exemplo: uma bifurcação (if) que não deveria existir, e atividades aninhadas (escrever no log, postar no Instagram e enviar e-mails). Pelo fato desse código estar estruturado a cada vez que precisar de manutenção tem de se alterar essa função. Essa função também tem responsabilidades demais, pois ela envia e-mails, posta em rede social, e escreve no log enquanto deveria apenas salvar produto que está sendo cadastrado. Escrever código dessa forma faz com que o sistema fique mais vulnerável a bugs. Claramente, essa função não respeita os princípios SOLID.

Além disso, surgem várias dúvidas sobre como organizar e manter esse código. Essas dúvidas são divididas em 3 categorias. Os problemas criacionais, estruturais e comportamentais.
Nos padrões criacionais decidimos quais são as melhores formas de resolver problemas de criação de objetos. Nos padrões estruturais temos soluções que estruturam o código para suportar determinada carga de trabalho. Já nos padrões comportamentais evitamos que o software consiga se comportar de maneira inadequada, por isso, controlamos o comportamento dele.
Nos próximos posts apresentarei cada um dos padrões de projeto demonstrando quais problemas eles resolvem e como programar cada padrão.

Comentários

Postagens mais visitadas deste blog

UML e comunicação entre Componentes

(conteúdo gerado com I.A.) Antes de abordarmos o conceito de Componentes, vale a pena analisar como um programador iniciante costuma estruturar uma aplicação. Geralmente, a escolha é construir um monólito tradicional, agrupando todas as classes de domínio (como Categoria, Produto, Compra, Venda, Pagamento, etc.) em uma única pasta de Entidades. Da mesma forma, criam-se pacotes globais para Repositórios, Serviços e Controllers. O grande problema dessa abordagem é que ela gera um forte acoplamento entre as classes e as camadas do sistema. À medida que a aplicação cresce, isso desencadeia uma série de dificuldades: Manutenção e modelagem complexas: As responsabilidades se misturam. Rapidamente, o código passa a ter diversos trechos onde as classes assumem funções que não deveriam ter, tornando a evolução do sistema confusa. Escalabilidade ineficiente: Para escalar o backend, é necessário replicar a aplicação inteira e todo o banco de dados. Além de consumir mais recursos, isso traz o ri...

Quando escolher Flask ou Quart no Python

Atualmente , considerando o suporte assíncrono já presente no Flask, a escolha entre Flask e Quart para uma API Server depende de vários fatores técnicos. Vejamos alguns critérios: Fonte:  https://pt.stackoverflow.com/questions/51268/qual-a-diferen%C3%A7a-entre-comunica%C3%A7%C3%A3o-ass%C3%ADncrona-e-s%C3%ADncrona Suporte Assíncrono : Flask : O Flask oferece suporte assíncrono por meio de extensões de terceiros, como  flask[async] . No entanto, seu desempenho assíncrono é inferior aos frameworks nativamente assíncronos. Quart : O Quart é uma reimplantação do Flask baseada no padrão ASGI (Asynchronous Server Gateway Interface). Ele utiliza E/S assíncrona em todo o código e é mais adequado para bases de código predominantemente assíncronas. Desempenho : Flask : Como aplicação WSGI, o Flask usa um único worker para cada ciclo de solicitação/resposta. Quando uma solicitação chega a uma visualização assíncrona, o Flask inicia um loop de eventos em uma thread, executa a função da vi...

Metodo para criar relacionamento entre tabelas sem dar erro cíclico EFCore

Quando estamos modelando o banco de dados no Entity Framework Core (ou em qualquer outra ferramenta) é muito comum criarmos o erro cíclico. Este erro ocorre devido ao banco de dados não conseguir determinar onde o relacionamento termina, causando um erro de loop. Vejamos uma situação real onde foi gerado esse problema: Um Professor leciona em várias Turmas, Um Professor leciona uma ou mais Disciplinas, Um Professor leciona determinadas Disciplinas em determinadas Turmas, Uma Turma tem muitos Professores, Em todas as Turmas tem 9 Disciplinas. Em todas as turmas podem ter até 9 Professores. Só por essa descrição já é possível perceber que os relacionamentos podem ser complexos de entender. E tem-se também o problema da navegação em via dupla: Professor-Turmas, Turma-Professores. Então, como modelar essas tabelas sem que o banco entre em loop? Para resolver esse problema no Entity Framework Core e evitar o erro de "Multiple Cascade Paths" (caminhos múltiplos de cascata) comum n...