Pular para conteúdo

Projeto 14: Arquitetura MVC e Separação de Camadas em Domínio 🏛️

Escopo do Projeto

Objetivo: Conceber uma aplicação estruturada no padrão arquitetural Model-View-Controller (MVC): isolamento de regras de negócio (Model), apresentação limpa (View) e mediação de eventos de entrada (Controller).


🎯 1. Contexto & Desafio Prático

O padrão MVC é a base da engenharia de software para interfaces com usuário. Você construirá uma aplicação de gerenciamento de tarefas (Task Manager) com persistência em arquivo JSON, mantendo a regra de que a View nunca acessa o Model diretamente sem a intermediação do Controller.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Model Coeso): Modelar a entidade Tarefa e o repositório com regras de transição de status (Pendente -> Concluída).
  • R2 (View Desacoplada): Desenvolver a interface de terminal ou web que apenas recebe dados formatados e renderiza na tela.
  • R3 (Controller Mediador): O Controller processa comandos do usuário, chama os métodos de domínio do Model e solicita a atualização da View.
  • R4 (Testes sem Interface): Testar todas as regras de negócio do Model e do Controller sem depender da renderização gráfica da View.

📐 3. Diagrama Conceitual & Arquitetura

graph TD
    User["Interação do Usuário"] --> Controller["Controller (Orquestrador)"]
    Controller -->|Atualiza Estado / Regras| Model["Model (Entidades & Regras de Negócio)"]
    Model -->|Notifica Mudança de Dados| View["View (Apresentação Visual / Template)"]
    View -->|Renderiza Saída| User
    style User fill:#e1f5fe,stroke:#01579b
    style Controller fill:#fff3e0,stroke:#e65100
    style Model fill:#e8f5e9,stroke:#2e7d32
    style View fill:#f3e5f5,stroke:#7b1fa2

💻 4. Especificação Técnica & Código de Referência

// mvc_architecture.py
class TaskModel:
    def __init__(self):
        self.tasks = []
    def add_task(self, title: str):
        self.tasks.append({"title": title, "done": False})
    def get_all(self):
        return list(self.tasks)

class TaskView:
    def display_tasks(self, tasks):
        print("\n=== LISTA DE TAREFAS ===")
        for i, t in enumerate(tasks, 1):
            status = "[X]" if t['done'] else "[ ]"
            print(f"{i}. {status} {t['title']}")

class TaskController:
    def __init__(self, model: TaskModel, view: TaskView):
        self.model = model
        self.view = view
    def handle_add_task(self, title: str):
        if not title.strip():
            print("Erro: Título da tarefa não pode ser vazio")
            return
        self.model.add_task(title)
        self.view.display_tasks(self.model.get_all())

📦 5. Critérios de Avaliação e Entrega

  1. Separação física em módulos/arquivos model.py, view.py e controller.py.
  2. Comprovação de que o Model não possui chamadas de exibição gráfica (print ou HTML).
  3. Suíte de testes unitários validando o Controller de forma autônoma.