Nesse post vamos conhecer o padrão arquitetural Porto. Voltado principalmente para aplicações back-end, ele usa conceitos de diversos outros padrões para definir um padrão modular, com baixo acoplamento e altamente testável.
Curso Python - Orientação a objetos
Conhecer o cursoO Que é Porto?
O Porto é um padrão arquitetural criado por Mahmoud Zalt. Seu principal objetivo é ajudar os desenvolvedores a criarem aplicações de médio e grande porte de forma manutenível e reutilizável.
Ele utiliza conceito de outros padrões já largamente usados e conhecidos, como DDD (Domain Driven Design), Modular, Micro Kernel, MVC (Model View Controller), Layered e ADR (Action Domain Responder). O Porto também se utiliza de uma série de princípios, como SOLID, programação orientada a objetos, LIFT, DRY (Don’t repeat yourself), CoC (Convention over configuration), GRASP (General Responsibility Assignment Software Patterns), generalização, alta coesão e baixo acoplamento.
Ele foi criado pensando nos principais problemas do desenvolvimento web back-end, porém pode ser utilizado também em outros tipos de aplicação. Uma das suas principais vantagens é que ele permite a criação de aplicações monolíticas de forma organizada e caso necessário ainda facilita a divisão em micro serviços, graças ao modo como é estruturado.
Como funciona o padrão arquitetural Porto?
O padrão arquitetural Porto pode ser usado independente de tecnologia e está baseado em duas camadas principais, Ship (navio) e Containers. Ele ainda considera uma terceira camada que chama Sea (oceano) que basicamente consiste no código de baixo nível, como, frameworks e bibliotecas que nossa aplicação interage.
Abaixo podemos ver uma imagem ilustrando as camadas:
A camada Ship (navio) é a camada intermediária da nossa aplicação. Ela faz a ligação entre o código de baixo nível da camada Sea (oceano) e a camada de alto nível Containers. Sua responsabilidade principal é interagir com recursos do framework e bibliotecas, além de possuir elementos base para a camada de containers.
A camada de containers possui o código de alto nível da aplicação. Ela interage com a camada de nível intermediário (Ship). Sua responsabilidade é cuidar das regras de negócio do projeto.
O problema das múltiplas interfaces
O desenvolvimento de aplicações que possuem múltiplas UI User Interface (interface de usuário) é uma realidade no mercado. Na maioria dos casos, as aplicações são desenvolvidas para no mínimo duas UI. A interface web e a interface para dispositivos móveis, através de aplicativos específicos para Android e IOS.
Baseado nesse cenário as aplicações back-end precisam servir a diferentes aplicações. Isso pode ser um grande problema, uma vez que por mais que as interfaces de usuário tenham na maioria dos casos os mesmos requisitos, existem situações onde os requisitos são diferentes. Essa situação pode causar um gargalo no projeto, já que temos várias equipes de aplicações front-end solicitando desenvolvimento de novos recursos.
O problema descrito acima, pode ser tratado de diversos modos, como utilizando o padrão back-ends for front-ends, onde temos um back-end para cada interface de usuário ou até mesmo usando diferentes API gateway quando estamos usando micro-serviços.
O padrão arquitetural Porto como uma alternativa
As abordagens levantadas acima são interessantes, porém elas trazem um custo a mais para o projeto, manter diferentes back-ends para diferentes front-ends pode ser muito custoso. E a abordagem de micro-serviços não se aplica a qualquer tipo de projeto, uma vez que existe um ganho significante de complexidade de controle dos serviços em relação a uma aplicação monolítica.
O padrão arquitetural Porto trás características que nos ajuda no cenário descrito acima. Ele é estruturado de forma a permitir que a aplicação back-end possa responder a diferentes interfaces de usuário usando as mesmas regras de negócio. Ele também permite que a aplicação seja estruturada inicialmente como monolito que pode ser migrado, caso necessário, com o crescimento da aplicação para o modelo de micro-serviços.
Por que conhecer o padrão estrutural Porto?
O padrão arquitetural Porto é importante como uma nova proposta para o mercado, uma vez que ele tenta atacar gaps que outros padrões conhecidos possuem.
O modo como ele foi estruturado, garante uma série de atributos de qualidade ao projeto. Elementos como modularidade dão ao padrão uma característica bem interessante, a possibilidade de transformar uma aplicação monolítica em micro serviços, algo extremamente difícil nos padrões amplamente utilizados no mercado
Devido a sua filosofia de responsabilidade única, classes pequenas e padrões bem definidos de entradas e saída. O padrão Porto permite a criação de aplicações altamente testáveis e manuteníveis.
Outro aspecto muito interessante, é o fato da regra de negócio da aplicação estar desacoplado da UI (User Interface). Desse modo é possível que uma aplicação utilize a mesma lógica para responder diferentes tipos de aplicações. Por exemplo, uma API, uma aplicação web e uma aplicação console.
Padrão arquitetural Porto na comunidade
A tendência é de acordo com que mais pessoas conheçam o padrão, ele ganhe espaço no mercado, uma vez que é possível implementá-lo na maioria das tecnologias usadas para desenvolvimento de aplicações back-end.
A comunidade de desenvolvimento de software está sempre aberta a novos padrões como é o caso do Porto, porém como é algo normal em tecnologia, é necessário um tempo de maturação até que as empresas comecem adotar em produtos reais.
Formação Desenvolvedor Laravel Full-Stack
Conhecer a formaçãoConsiderações finais
Atualmente o Porto ainda é uma padrão arquitetural que está mais presente na comunidade PHP, mais especificamente na comunidade Laravel, uma vez que seu criador faz parte dessa comunidade e também mantém uma implementação do padrão sobre o Laravel chamado Apiato.
Apesar de estruturado sobre diversos outros padrões e componentes conhecidos do mercado, o Porto ainda não foi implementado largamente. Isso faz com que não seja possível comprovar de maneira prática seus atributos de qualidade.