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
Tarefae 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
- Separação física em módulos/arquivos
model.py,view.pyecontroller.py. - Comprovação de que o Model não possui chamadas de exibição gráfica (
printouHTML). - Suíte de testes unitários validando o Controller de forma autônoma.