3 Padrões de Arquitetura de Software Simplificados e Exemplificados
Tags: architecture, design, patterns
Published: 2023-02-10 14:32:54

Como já abordado no post anterior, Arquitetura de Software é um aspecto crítico do desenvolvimento de software que envolve a definição da estrutura geral de um sistema para atender aos requisitos e restrições do problema a ser resolvido. Diversas vezes esses problemas são muito parecidos, fazendo assim possível aplicar determinados tipos de arquitetura existentes.

Hoje eu trago três padrões comuns de arquitetura de software, criados e utilizados para servir um propósito específico.

### 1. Model-View-Controller (MVC)

O MVC oferece uma clara separação de preocupações, o que torna o código mais fácil de entender, manter e modificar. Este padrão é amplamente utilizado no desenvolvimento de aplicativos desktop e web.

Este padrão separa a aplicação em três componentes principais:

1. Model: 
 - Os dados e a lógica de negócios da aplicação. Armazena e manipula dados e define as regras para como os dados podem ser usados.
2. View: 
 - Responsável por exibir os dados para o usuário. Fornece a interface do usuário e recebe entradas do usuário.
3. Controller: 
 - Fica entre os componentes Model e View. Recebe entradas do usuário da View, processa essas entradas e atualiza o Model de acordo.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wkn7j5qweqbxbegw3ar.png)

#### Vantagens
- Separação de preocupações, dividindo a aplicação em três componentes distintos.
- A apresentação de dados é separada das regras de negócio e do controle.

#### Desvantagens
- Pode se tornar complexo quando aplicado a aplicações grandes e complexas.
- Pode haver um forte acoplamento entre os componentes, o que pode tornar a aplicação mais difícil de manter e modificar.

#### Exemplo em um cenário real

Uma aplicação de player de música:

1. Model: 
 - A biblioteca de música, incluindo as músicas, playlists e metadados. Armazena e manipula os dados.
2. View: 
 - A interface do usuário do player de música, incluindo playlists, capas de álbuns e informações sobre a música. Exibe os dados para o usuário e recebe entradas do usuário, como tocar, pausar, pular e embaralhar.
3. Controller: 
 - O código que manipula as entradas do usuário, como tocar, pausar, pular e embaralhar, e atualiza o Model.

### 2. Arquitetura de Micro-serviços

Projetada para grandes aplicações de software, quebradas em pequenos serviços independentes que se comunicam entre si por uma rede. Cada micro-serviço é responsável por uma função específica, como autenticação de usuários, gerenciamento de catálogo de produtos ou gerenciamento de pedidos.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f41k32612jxbswxzd8ff.png)

#### Vantagens
- É possível escalar individualmente cada serviço, de acordo com as necessidades, sem afetar o funcionamento dos outros serviços.
- Cada serviço pode ser desenvolvido, implantado e atualizado independentemente, o que facilita a manutenção e evolução da aplicação.
- Se um serviço falhar, isso não afetará o funcionamento dos outros serviços, o que aumenta a disponibilidade e robustez da aplicação.

#### Desvantagens
- O gerenciamento e integração de vários serviços pode ser complexo e desafiador.
- A comunicação entre serviços através de uma rede pode resultar em latência e impactar o desempenho da aplicação.

#### Exemplo em um cenário real

Uma aplicação de e-commerce:

1. Serviço de autenticação de usuário: 
 - Responsável por gerenciar o login e autenticação dos usuários.
2. Serviço de catálogo de produtos: 
 - Gerencia a listagem de produtos disponíveis para compra, incluindo informações sobre preços, estoques e descrições.
3. Serviço de gerenciamento de pedidos: 
 - Responsável por gerenciar o processamento de pedidos, incluindo pagamentos, envios e atualizações do estoque.

### 3. Arquitetura Pipe-Filter

Um modelo que divide a aplicação em pequenos componentes conectados entre si, como tubos e filtros. Cada componente é responsável por realizar uma tarefa específica, como transformar ou filtrar dados. Os dados são passados de um componente para o outro em uma sequência, como se estivessem passando de um tubo para o outro.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rn3ihcburjbu3wradm1l.png)

#### Vantagens
- Permite que os componentes sejam adicionados ou removidos facilmente, permitindo que a aplicação cresça de acordo com as necessidades de processamento de dados.
- Cada componente é projetado para ser reutilizável, o que significa que ele pode ser facilmente reaproveitado em outras aplicações.
- A separação clara dos componentes torna a aplicação mais fácil de manter e modificar.

#### Desvantagens
- Pode se tornar complexa se aplicada a aplicações muito grandes e de alta complexidade.
- O processamento em paralelo dos componentes pode resultar em latência, o que pode afetar a performance da aplicação.

#### Exemplo em um cenário real

Um editor de texto:

Os dados de entrada (texto bruto) são processados através de uma série de filtros, cada um responsável por realizar uma tarefa específica, sendo elas:

1. Formatação do texto
2. Verificação ortográfica
3. Contagem de palavras

Cada filtro recebe o resultado do filtro anterior e produz uma saída para o próximo filtro até a saída final.

### Finalizando...

Este foram três padrões comuns na arquitetura de software, trarei outros num futuro próximo.

Espero que isso ajude você de alguma maneira! 😄

Happy Coding!

Links úteis:
[MVC](https://developer.mozilla.org/en-US/docs/Glossary/MVC)
[microservices](https://aws.amazon.com/pt/microservices/)
[pipes-and-filters](https://learn.microsoft.com/en-us/azure/architecture/patterns/pipes-and-filters)