🏗️ Atividade 13: Arquitetura de Software e Padrões
🎯 Objetivo da Aula
Ao final desta atividade, você será capaz de:
- Diferenciar monólitos, camadas MVC e arquiteturas desacopladas modernas.
- Projetar o fluxo de dados entre Controller, Service e Repository do Spring Boot.
- Compreender o uso do Thymeleaf + HTMX para gerar interfaces reativas sem o peso de frameworks complexos de SPA.
- Aplicar o padrão de projeto Factory para criação desacoplada de objetos de negócio.
🏢 O Cenário Prático (Seu Desafio)
Na TecProExpress, a equipe de desenvolvimento estava sofrendo: toda vez que precisavam mudar o banco de dados de MySQL para PostgreSQL, tinham que reescrever a validação de rotas, o cálculo do frete e as telas do aplicativo! Tudo estava tão bagunçado e misturado (acoplado) que um erro de digitação no botão da tela derrubava o cálculo do financeiro!
"Seu desafio como Arquiteto de Software é reorganizar a plataforma. Você desenhará a estrutura do sistema em camadas estritas e isoladas no Spring Boot. Além disso, os motoristas exigem notificações de novas rotas via SMS, e-mail ou push móvel. Você implementará o padrão Factory para que o sistema escolha o tipo correto de envio de notificação sem acoplar a lógica de entrega."
🧠 Fundamentos: A Teoria Traduzida
Para que um sistema sobreviva a anos de manutenção, ele deve ser desacoplado (cada peça cuida de apenas um assunto).
A Estrutura em Camadas (Spring Boot)
- View / Interface (Thymeleaf + HTMX): Renderiza o HTML dinâmico no servidor com Thymeleaf e realiza requisições parciais assíncronas com HTMX, mantendo o carregamento rápido e leve.
- Controller (Camada de Apresentação): Recebe os cliques (requisições HTTP), extrai dados do formulário e chama a lógica. Ele nunca calcula regras de negócio!
- Service (Camada de Negócio): Onde as regras morrem. É o "cérebro" do sistema (Ex: calcula desconto, valida se o motorista está ativo).
- Repository / DAO (Camada de Dados): Onde ocorrem as queries SQL (
SELECT,INSERT), salvando e buscando os dados no banco de dados.
📊 Visualizando a Lógica MVC + Camadas
📖 Exemplo Guiado: O Padrão Factory (Notificações)
Quando uma nova rota é atribuída, precisamos despachar um alerta ao entregador. Mas não queremos acoplar as classes SmsNotification, EmailNotification e PushNotification no código principal. Usaremos a NotificationFactory.
// 1. Interface comum de Notificação
public interface Notification {
void send(String message, String target);
}
// 2. Implementações específicas
public class SmsNotification implements Notification {
public void send(String message, String target) {
System.out.println("Disparando SMS para " + target + ": " + message);
}
}
public class EmailNotification implements Notification {
public void send(String message, String target) {
System.out.println("Enviando E-mail para " + target + ": " + message);
}
}
// 3. A Fábrica (Factory) que desacopla a criação
public class NotificationFactory {
public static Notification createNotification(String type) {
if (type == null) return null;
if (type.equalsIgnoreCase("SMS")) return new SmsNotification();
if (type.equalsIgnoreCase("EMAIL")) return new EmailNotification();
throw new IllegalArgumentException("Tipo de notificação desconhecido: " + type);
}
}
🛠️ Código do Service utilizando a Factory no Spring Boot:
@Service
public class DeliveryService {
@Autowired
private DeliveryRepository repository;
public void processarEntrega(Long deliveryId, String notificationType) {
// Busca a entrega no banco
Delivery delivery = repository.findById(deliveryId)
.orElseThrow(() -> new RuntimeException("Entrega não encontrada"));
// Lógica de Negócio: Atualiza status
delivery.setStatus("EM_ROTA");
repository.save(delivery);
// Uso do Padrão Factory para enviar notificação sem acoplamento
Notification notification = NotificationFactory.createNotification(notificationType);
notification.send("Sua entrega está em rota!", delivery.getMotoristaContato());
}
}
🔍 Detalhamento do Processo:
- Se amanhã o diretor da TecProExpress exigir o envio de notificações por WhatsApp, basta criar a classe
WhatsAppNotificatione adicioná-la dentro daNotificationFactory. O arquivoDeliveryServicecontinuará intacto, provando que nosso sistema atende ao Princípio do Aberto/Fechado (OCP) do SOLID! 🚀
🛠️ Prática Obrigatória 1: Desenho Arquitetural
Cenário: O projeto semestral da sua equipe.
- Desenhe um diagrama
flowchartno Mermaid representando a arquitetura em camadas do seu projeto de grupo. - Mapeie e rotule as caixas indicando onde ficará a sua Interface (Thymeleaf/HTMX), seus Controllers, seus Services (Regras de Negócio) e seus Repositories.
- Garanta que a camada de interface fale exclusivamente com o Controller, e o Controller fale exclusivamente com o Service.
🏁 Resultado Esperado (Para sua Referência)
Um diagrama de arquitetura de camadas profissional documentado em formato Mermaid no corpo do seu arquivo Markdown de entrega.
🛠️ Prática Obrigatória 2: Modelando o Padrão Factory
Cenário: Desacoplando o fluxo criacional de classes do seu projeto.
- Identifique uma regra do seu sistema que exige diferentes comportamentos ou envios dependendo de uma escolha do usuário (Ex: Modos de Pagamento Pix, Crédito, Boleto, Calculadoras de Frete Rápido, Econômico, Sedex, Relatórios PDF, CSV).
- Escreva a estrutura de classes (pode ser em pseudo-código ou Java) contendo a Interface comum, duas classes filhas implementadoras e a Factory de decisão criacional.
📤 Instruções de Entrega (Microsoft Teams)
Após validar suas especificações arquiteturais:
- Salve o arquivo de código e diagramas com o nome
Atividade_13.mdna pastaes-atv-13-arquitetura/do seu repositório GitHub. - Certifique-se de fazer o commit e push para o repositório público.
- Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.
💡 Checkpoint de Lógica
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Arquitetura em Camadas (Mermaid Flowchart) | Diagrama confuso ou misturando responsabilidades de Controller e Repository. | Mapeia as camadas mas sem rotular o fluxo estrito (UI ➔ Controller ➔ Service ➔ Repository). | Diagrama Mermaid de arquitetura em camadas perfeitamente desacoplado e rotulado. |
| Design Pattern Factory (Desacoplamento) | Modela criacionalmente sem usar interfaces ou abstração. | Cria a Factory mas mantendo alto acoplamento na classe chamadora. | Modelagem impecável do padrão Factory respeitando o Princípio Aberto/Fechado (OCP) do SOLID. |
| Entrega no GitHub | Entrega fora da pasta `es-atv-13-arquitetura/`. | Arquivo entregue mas sem renderização do diagrama Mermaid. | Submete `Atividade_13.md` com código limpo e Mermaid renderizado com sucesso. |
🔄 Atividade 12: Diagrama de Transição de Estados (UML)
Bem-vindo a mais uma etapa prática do seu treinamento em Engenharia de Software. Na atividade anterior, você aprendeu sobre processos e fluxos lógicos. Hoje, nosso foco muda para o ciclo de vida de uma entidade do sistema. Você aprenderá como modelar os Estados pelos quais um dado transiciona, garantindo que o software nunca entre em inconsistência lógica. 🛡️🧩
🌐 Atividade 14: Modelagem de APIs REST e Swagger
Bem-vindo a mais uma etapa prática de Engenharia de Software! Agora que você conhece as camadas internas do software, aprenderá como expor e conectar o seu sistema ao mundo externo. Hoje, vamos nos tornar arquitetos de comunicação móvel e web, projetando contratos de integração baseados em APIs RESTful, payloads de dados JSON e documentando tudo com o padrão profissional global Swagger (OpenAPI). 🛡️🧩