Este repositório é uma coleção de exercícios e projetos relacionados à Programação Orientada a Objetos (POO). Ele é organizado em diferentes seções, cada uma focada em um aspecto específico da POO, como classes, objetos, herança, polimorfismo, entre outros.
eval=none g=1 l=1 s=1 [INTRO] Introdução Classes e Objetos
Objetivos de aprendizagem:
compreender objetos como entidades com estado e comportamento;
distinguir classe, objeto, atributo e método;
compreender a separação entre domínio e interface;
testar o comportamento observável do modelo por meio de requisições e respostas.
Conceitos:
classe e objeto;
estado e comportamento;
identidade;
construtor;
representação textual;
domínio, Shell e interface;
requisição, resposta e resultado.
Técnicas de programação:
controlar o acesso ao estado por meio de métodos;
nomear operações segundo suas intenções;
separar regras de domínio da apresentação;
testar por meio da interface pública;
representar falhas com booleanos ou enumerações;
utilizar retornos antecipados (early return).
Princípios relacionados:
responsabilidade: a classe que possui o estado também protege suas regras.
eval=self g=2 l=1 s=1 [GUIDE] Toalha que enxuga
Descrição: a toalha deve controlar seu estado de umidade e fornecer métodos para enxugar, torcer e consultar seu estado.
Domínio: o quanto a toalha enxuga depende do seu tamanho e ela não pode suportar água além de sua capacidade.
Objetivos: identificar estado e comportamento em uma classe coesa.
eval=diff g=2 l=1 s=1 [GUIDE] Animal que morre
Descrição: gerenciar um animal que nasce, cresce e morre. Faz barulho diferente conforme a espécie e o estado de vida.
Domínio: Envelhecer faz o animal morrer, impede ele de continuar envelhecendo e de fazer barulho após a morte.
Objetivos: modelar o ciclo de vida de um objeto por seu estado.
eval=diff g=2 l=1 s=1 [TRAIN] Enxugar: Toalha com testes
Descrição: evolução da atividade da toalha, mas agora com a camada de testes de requisição e resposta.
Domínio: o mesmo da toalha.
Objetivos: manipular entrada e saída de forma separada do domínio, testando apenas o comportamento observável.
eval=diff g=3 l=2 s=1 [ALONE] Carro dirigível
Descrição: o carro gerencia entrada, saída de pessoas, combustível e kilomentragem.
Domínio: o carro não pode controla o limite de pessoas e possui regras para que a ação de dirigir seja completada.
Objetivos: manipular erros como enumerações e treinar técnicas de early return.
eval=diff g=3 l=2 s=2 [CHECK] Calculadora à bateria
Descrição: a calculadora possui bateria, realiza operações matemáticas e as guarda no display.
Domínio: A calculadora não pode realizar operações sem bateria e nem dividir por zero.
Objetivos: manipular erros como enumerações e treinar técnicas de early return.
Projetos
toalha
animal
enxugar
carro
calculadora
ciclo de vida
.
SIM
.
.
.
early return
.
.
.
SIM
SIM
testes automáticos
.
.
SIM
SIM
SIM
erros comunicados via
bool
bool
bool
enum
enum
esforço
mínima
baixo
baixo
médio
médio
Encapsulamento e Invariantes
eval=none g=1 l=1 s=1 [INTRO] Introdução Encapsulamento e Invariantes
Objetivos de aprendizagem:
controlar atributos privados por operações do objeto;
reconhecer e preservar o estado válido de um objeto;
validar alterações na classe que possui a regra;
verificar que uma falha não altera o estado anterior;
separar a validação do domínio das mensagens da interface.
Conceitos:
encapsulamento e atributo privado;
invariante e estado válido;
getter, setter e consulta sem alteração;
validação, sucesso e falha;
construtor e valor inicial válido;
domínio, Shell e interface.
Técnicas de programação:
inicializar o objeto em um estado válido;
validar antes de alterar atributos;
retornar sucesso ou falha sem imprimir mensagens no domínio;
preservar o estado após uma operação recusada;
usar getters para consultas e setters somente quando houver regra de alteração;
testar valores válidos, inválidos, limites e sequências de operações.
Princípios relacionados:
responsabilidade: a classe que possui o estado também protege suas regras.
invariante: a classe deve preservar seu estado válido em todas as operações e não dar acesso externo a atributos privados.
dry: don't repeat yourself, não repita a validação em outro lugar que não seja o setter.
eval=self g=1 l=1 s=1 [GUIDE] Chinela de números pares
Descrição: a chinela controla seu tamanho por meio de operações de consulta e alteração.
Domínio: o tamanho deve ser par e permanecer entre 20 e 50; uma tentativa inválida não pode alterar o valor atual.
Objetivos: proteger uma regra simples com atributo privado, getter e setter validador.
eval=self g=1 l=1 s=2 [TRAIN] Camisa de tamanho fixo
Descrição: a camisa guarda um tamanho textual e informa os tamanhos permitidos.
Domínio: o objeto começa com um tamanho válido e aceita somente PP, P, M, G, GG ou XG, mantendo o estado anterior em caso de falha.
Objetivos: consolidar a validação de um conjunto de valores e a inicialização segura no construtor.
eval=diff g=2 l=1 s=2 [TRAIN] Roupa: camisa com testes
Descrição: a roupa recebe comandos para consultar e alterar seu tamanho por meio de um Shell.
Domínio: a classe aceita apenas tamanhos permitidos e retorna falha sem mudar o tamanho anterior; as mensagens pertencem ao Shell.
Objetivos: tornar a regra de tamanho testável ao separar domínio, comandos e apresentação de falhas.
eval=diff g=3 l=2 s=2 [ALONE] Hora 24h ou AM/PM
Descrição: o relógio controla hora, minuto e modo de exibição, além de avançar um minuto por vez.
Domínio: atributos com valores válidos; validação individual de cada atributo, passagem do tempo, mostrar a hora em 24h ou AM/PM não altera a hora interna.
Objetivos: o validações independentes de cada atributo e manter o estado interno variando a forma como a hora é exibida.
Projetos
chinela
camisa
roupa
relógio
validação de construtor
.
SIM
SIM
SIM
uso de arrays internos
-
SIM
SIM
.
testes automáticos
.
SIM
SIM
SIM
erros comunicados por
bool
bool
bool
bool
esforço
mínima
baixo
baixo
médio
Relações entre objetos: agregação e delegação
eval=none g=1 l=1 s=1 [INTRO] Introdução Agregação e Delegação
Objetivos de aprendizagem:
distinguir posse de agregação entre objetos;
representar referências opcionais e a multiplicidade de uma relação;
delegar uma regra ao objeto que possui os dados necessários;
coordenar objetos sem transferir indevidamente seus dados ou responsabilidades;
comunicar resultados do domínio sem imprimir mensagens nas classes.
Conceitos:
agregação, posse e ciclo de vida independente;
referência opcional, ausência e multiplicidade 0..1;
colaboração, coordenação e delegação;
resultado de domínio, booleano e enumeração;
transferência de recurso entre objetos.
Técnicas de programação:
representar a ausência de um objeto por T | null;
inserir e remover objetos, devolvendo o objeto removido quando necessário;
validar pré-condições antes de alterar o estado;
concentrar cálculos e alterações no objeto que possui o estado;
usar retornos explícitos para que o Shell apresente as falhas;
testar falhas, estado preservado e sequências de colaboração.
Princípios relacionados:
responsabilidade: cada objeto protege suas próprias regras, e o coordenador apenas organiza a colaboração.
delegação: cada componente é responsável por suas próprias regras, e o coordenador apenas organiza a colaboração.
eval=diff g=3 l=2 s=3 [GUIDE] Criança andando de Motoca
Descrição: a motoca controla tempo de uso e a pessoa que a ocupa, permitindo entrar, sair, comprar tempo e dirigir.
Domínio: há no máximo uma pessoa na motoca; ela continua existindo depois de sair, e a corrida depende de pessoa, tempo disponível e idade compatível com o tamanho da motoca.
Objetivos: modelar uma agregação opcional e delegar à pessoa a verificação de que pode dirigir.
eval=diff g=3 l=3 s=3 [TRAIN] Lapiseira de um Grafite
Descrição: a lapiseira recebe, remove e usa um grafite para escrever páginas.
Domínio: ela comporta no máximo um grafite de espessura compatível; o grafite calcula seu desgaste por dureza e nunca pode ficar menor que 10mm.
Objetivos: delegar o desgaste ao grafite e coordenar a escrita por resultados explícitos do domínio.
eval=diff g=3 l=4 s=3 [ALONE] Passeando e pagando o MotoUber
Descrição: o Uber coordena uma corrida com motorista, passageiro e custo acumulado.
Domínio: o motorista permanece associado ao Uber, o passageiro sai ao fim da corrida e cada pessoa mantém seu próprio dinheiro; em caso de saldo insuficiente, o Uber completa o pagamento ao motorista.
Objetivos: coordenar a transferência de dinheiro sem retirar essa responsabilidade de Person e representar os resultados da corrida.
Projetos
motoca
grafite
motouber
agregação nullable
SIM
SIM
SIM
objeto removido devolvido
SIM
SIM
SIM
regra delegada
SIM
SIM
SIM
testes automáticos
SIM
SIM
SIM
erros comunicados por
enum/null
enum/null
enum/null
esforço
baixo
médio
médio-alto
Desafios de agregação e estados
eval=none [INTRO] Desafios de agregação e estados
Objetivos de aprendizagem:
coordenar componentes com ciclos de vida independentes;
preservar invariantes distribuídas entre objetos que colaboram;
modelar transições que dependem da combinação de estados;
distinguir um estado temporário de um estado terminal;
registrar e preservar a causa de uma transição terminal.
Conceitos:
agregação, referência opcional e ciclo de vida independente;
fonte de energia, capacidade e carga;
coordenação de estados e transição condicional;
estado terminal, causa de morte e operação sem efeito;
enumeração, booleano e resultado de domínio.
Técnicas de programação:
delegar consumo, recarga e limites ao componente que possui esses dados;
coordenar operações sem alterar diretamente o estado interno de outro objeto;
validar pré-condições e preservar o estado após uma falha;
bloquear ações que não podem ocorrer depois de uma transição terminal;
construir e testar o comportamento em etapas, incluindo fronteiras e sequências de operações.
Princípio relacionado, quando necessário:
responsabilidade: cada componente preserva suas regras, enquanto o objeto coordenador decide quando combiná-las.
delegação: cada componente é responsável por suas próprias regras, e o coordenador apenas organiza a colaboração.
eval=diff g=1 l=1 s=1 [CHECK] Brinque até matar o Tamagotchi
Descrição: o jogo coordena brincadeiras, banho e sono de um pet com energia, limpeza e idade.
Domínio: o pet mantém energia e limpeza em seus limites, registra a primeira causa de morte e não aceita novas alterações depois de morto.
Objetivos: delegar ao pet as transições de estado e coordenar ações que respeitam o estado terminal.
eval=diff g=1 l=1 s=1 [TRAIN] Notebook com bateria e carregador
Descrição: o notebook pode receber bateria e carregador, ligar, desligar e acumular tempo de uso.
Domínio: bateria e carregador existem fora do notebook; a bateria mantém carga entre zero e sua capacidade, e o notebook muda seu comportamento conforme as fontes de energia conectadas.
Objetivos: coordenar consumo e recarga por etapas, delegando os limites de carga à bateria e reagindo à falta de energia.
Projetos
tamagotchi
charger
agregação de componente externo
SIM
SIM
invariantes no componente
SIM
SIM
coordenação de estados
SIM
SIM
transição terminal
SIM
.
testes automáticos
SIM
SIM
erros comunicados por
enum
enum/null
esforço
médio-alto
alto
eval=none [INTRO] Introdução Coleções lineares
Objetivos de aprendizagem:
manipular coleções lineares mantendo ordem, duplicatas e posições;
distinguir inserção, remoção, busca, filtro e percurso;
escolher entre alterar a lista, devolver um elemento ou criar uma nova coleção;
encapsular uma coleção quando ela pertence ao estado de um objeto;
coordenar o movimento de objetos entre coleções relacionadas.
Conceitos:
Array<T>, lista de objetos e multiplicidade 0..*;
índice, extremidades, ordem de chegada e ordem de remoção;
busca, filtro, cópia rasa e ordenação;
fila e operações sobre uma coleção;
coleção interna, composição e exposição controlada;
referência opcional e coleção de muitos objetos.
Técnicas de programação:
percorrer elementos diretamente ou com índice quando a posição importar;
inserir e remover nas extremidades, validando coleção vazia e limites;
interromper a busca após remover a primeira ocorrência;
filtrar uma coleção sem modificar indevidamente suas posições;
devolver cópias quando a coleção interna não puder ser alterada por clientes;
mover objetos entre listas sem recriá-los e delegar regras ao objeto que possui o estado.
Princípio relacionado, quando necessário:
encapsulamento: a classe proprietária protege a coleção e concentra as regras que mantêm seu estado válido.
eval=none [GUIDE] Listas em Python
Descrição: uma referência prática para criar, percorrer, inserir, remover, buscar, filtrar, copiar e ordenar listas de pessoas.
Domínio: uma lista mantém elementos ordenados por índice; algumas operações a alteram, enquanto cópia, filtro e ordenação podem produzir outra lista.
Objetivos: escolher operações idiomáticas de lista e reconhecer quando uma consulta ou alteração modifica a coleção original.
eval=diff g=2 l=1 s=1 [GUIDE] Coleção de pessoas
Descrição: uma lista de pessoas recebe comandos para inserir e remover nas extremidades, remover pelo nome e filtrar por idade.
Domínio: a coleção começa vazia, preserva a ordem e não muda ao remover de uma lista vazia ou buscar um nome inexistente; a remoção por nome afeta apenas a primeira ocorrência.
Objetivos: praticar diretamente as operações fundamentais de uma lista antes de encapsulá-las em uma classe.
eval=diff g=2 l=1 s=2 [TRAIN] Contato com telefones
Descrição: um contato mantém nome, favorito e uma coleção privada de telefones.
Domínio: somente telefones válidos entram na coleção, a ordem só muda pelas operações do contato e uma remoção por índice inválido preserva o estado.
Objetivos: encapsular uma coleção, delegar a validação do número a Phone e separar o domínio das mensagens do Shell.
eval=diff g=1 l=1 s=1 [TRAIN] Pula-pula com crianças
Descrição: o pula-pula controla uma fila de espera e uma lista de crianças brincando.
Domínio: as crianças mantêm sua ordem nas listas, entram e saem por operações de fila e podem ser removidas pelo nome em qualquer uma das duas coleções.
Objetivos: coordenar movimentos entre coleções lineares e perceber que a posição representa uma ordem variável, não um lugar fixo.
eval=diff g=1 l=1 s=1 [ALONE] Lapiseira com tambor de grafites
Descrição: a lapiseira possui um grafite em uso no bico e vários grafites reserva em um tambor.
Domínio: grafites compatíveis entram no fim do tambor, o próximo sai do começo para o bico e o grafite em uso preserva suas próprias regras de desgaste e tamanho mínimo.
Objetivos: combinar uma referência opcional com uma coleção linear, reutilizando e delegando as regras de Lead.
Projetos
listas
array
contato
pula-pula
lapiseira
relação entre objetos
.
.
composição
agregação
agregação
busca ou filtro
SIM
SIM
.
SIM
.
ordem como regra
SIM
SIM
SIM
SIM
SIM
coleção encapsulada
.
.
SIM
SIM
SIM
movimento entre coleções
.
.
.
SIM
SIM
testes automáticos
.
SIM
SIM
SIM
SIM
erros comunicados por
.
.
bool
bool/null
enum/null
esforço
mínima
baixo
médio
médio
médio
Posições fixas e ausência
eval=none [INTRO] Introdução Posições fixas e ausência
Objetivos de aprendizagem:
representar coleções cuja capacidade e posições são definidas desde a criação;
tratar o índice como parte da regra do domínio, e não apenas como detalhe da implementação;
distinguir posição ocupada de posição vazia;
comparar ausência representada por T | null e por um objeto que representa o estado vazio;
coordenar uma fila variável com posições fixas sem perder a consistência entre elas.
Conceitos:
vetor de tamanho fixo, capacidade e índice;
ocupação, ausência, nulidade e objeto vazio;
busca em uma coleção com posições vazias;
fila de espera e posição de atendimento;
saldo, quantidade e arrecadação como estados relacionados.
Técnicas de programação:
inicializar todas as posições com null ou com objetos vazios;
validar limites e ocupação antes de acessar ou alterar uma posição;
preservar o estado quando uma reserva, atendimento ou compra for recusada;
devolver cópias de coleções internas quando a capacidade precisar permanecer protegida;
movimentar um objeto da fila para uma posição fixa sem duplicá-lo;
testar índices inválidos, posições vazias, posições ocupadas e valores de fronteira.
Princípio relacionado, quando necessário:
encapsulamento: o objeto que possui as posições garante sua capacidade, ocupação e representação de ausência.
eval=diff g=1 l=1 s=1 [GUIDE] Cinema: posições fixas e ausência
Descrição: o cinema reserva, cancela e consulta cadeiras de uma sala.
Domínio: cada índice representa uma cadeira fixa que contém um Client ou null; não é possível reservar uma posição inexistente, já ocupada ou para um cliente que já está na sala.
Objetivos: modelar ausência em um vetor de tamanho fixo, validar posições e proteger a coleção interna com uma cópia.
eval=diff g=2 l=1 s=1 [TRAIN] Budega: fila e posições fixas
Descrição: o mercantil controla clientes em uma fila de espera e em caixas de atendimento.
Domínio: a fila cresce e diminui, mas os caixas têm quantidade e índices fixos; chamar um cliente remove-o da fila antes de ocupar um caixa, e falhas não mudam nenhuma coleção.
Objetivos: comparar uma fila variável com posições fixas e coordenar a movimentação de clientes entre elas.
eval=diff g=1 l=1 s=1 [ALONE] Junkfood: posições fixas e objeto vazio
Descrição: a máquina de vendas controla espirais fixas, saldo, compras, troco e arrecadação.
Domínio: cada posição sempre contém um Slot; uma espiral vazia é um objeto com quantidade zero, e uma compra só reduz saldo e quantidade quando há índice, produto e dinheiro válidos.
Objetivos: comparar o objeto vazio com null, preservar invariantes de saldo e quantidade e calcular arrecadação sem apagá-la ao devolver o troco.
Projetos
cinema
budega
junkfood
erros comunicados por
bool
bool
enum/null
capacidade fixa
SIM
SIM
SIM
tipo de ausência
null
null
objeto vazio
fila variável
.
SIM
.
validação de índice
SIM
SIM
SIM
testes automáticos
SIM
SIM
SIM
esforço
baixo
médio
médio-alto
eval=none [INTRO] Exceções
eval=diff g=3 l=1 s=1 [TRAIN] Bermuda: exceções para invariantes de tamanho
Objetivo: usar ValueError para comunicar uma alteração de estado inválida.
Conceitos: exceção padrão, raise, try/except e invariante.
Técnicas: validar no construtor e no setter, preservar estado e traduzir falhas no Shell.
Pré-requisito: encapsulamento, invariantes e try/except básicos.
eval=diff g=3 l=2 s=1 [TRAIN] Fusca: posições, exceções e direção
Objetivo: aplicar exceções nomeadas a regras de ocupação e direção.
Conceitos: posição fixa, composição, IndexError e exceção de domínio.
Técnicas: receber objetos, preservar posições, validar pré-condições e traduzir falhas no Shell.
Pré-requisito: composição, posições fixas e exceções básicas.
eval=diff g=1 l=1 s=1 [TRAIN] Guardando moedas e itens em um cofrinho
Descrição: o porquinho armazena moedas e itens até sua capacidade e pode ser quebrado para permitir extrações.
Domínio: moedas e itens são imutáveis; adições só ocorrem enquanto o porquinho está intacto e há volume disponível; depois da quebra, novas adições falham e moedas ou itens podem ser extraídos separadamente.
Objetivos: proteger capacidade e estado terminal, compor coleções de objetos imutáveis e preservar o estado após operações recusadas.
eval=diff g=1 l=1 s=1 [CHECK] Tabuleiro: coleções na simulação de turnos
Objetivo: coordenar coleções durante uma simulação de turnos.
Conceitos: composição, ordem de eventos, estado terminal e invariantes.
Técnicas: separar componentes coesos e testar sequências completas de interação.
Pré-requisito: coleções, composição, invariantes e sequências de operações.
Conceitos abordados neste módulo:
Map<K, V>;
chave única;
identidade versus posição;
acesso eficiente por identificador;
inserção duplicada;
remoção e busca por chave;
escolha entre lista e mapa;
manutenção de uma única fonte de verdade.
Não é ensinar mapa apenas como nova estrutura, mas discutir:
O elemento é localizado por posição, por busca ou por identidade única?
Conceitos principais: identidade, chave e, quando houver duplicação real, DRY.
Neste bloco, você aprenderá a manter diferentes formas de acesso aos mesmos objetos, preservando uma única fonte de verdade e a consistência entre as estruturas.
Conceitos abordados neste módulo:
contrato comum;
implementações diferentes;
substituição de condicionais por delegação;
composição versus herança;
tipos abstratos ou interfaces;
extensibilidade;
substituição segura.
Possíveis princípios, apresentados gradualmente:
OCP, quando um novo comportamento puder ser adicionado sem alterar a coordenação;
LSP, quando houver substituição por subtipos;
ISP, apenas quando uma interface estiver grande demais;
DIP, quando o domínio precisar deixar de depender de uma implementação concreta.
eval=self g=1 l=1 s=1 [ALONE] Zoo: contrato comum e comportamento polimórfico
Objetivo: tratar espécies diferentes por meio de um contrato comum.
Conceitos: classe abstrata, herança, substituição e despacho polimórfico.
Técnicas: implementar métodos abstratos e escrever clientes dependentes da abstração.
Pré-requisito: classes, herança, composição e delegação.
eval=self g=1 l=1 s=1 [TRAIN] Pagamento: composição de métodos de pagamento
Objetivo: aplicar polimorfismo por composição a métodos de pagamento.
Conceitos: contrato abstrato, delegação, composição e exceções de domínio.
Técnicas: injetar comportamento, processar coleções heterogêneas e isolar falhas.
Pré-requisito: classes abstratas, composição e exceções básicas.
eval=diff g=2 l=1 s=1 [TRAIN] Shapes: interface e substituição geométrica
Objetivo: tratar formas geométricas por meio de uma interface comum.
Conceitos: interface, contrato, substituição e polimorfismo.
Técnicas: usar Protocol, manter coleção heterogênea e delegar cálculos às formas.
Pré-requisito: contratos, coleções e delegação.
eval=self g=3 l=1 s=1 Estacionamento — polimorfismo por tipo de veículo
Objetivo: variar o cálculo da tarifa sem espalhar condicionais na coordenação.
Conceitos: classe abstrata, método abstrato, composição e delegação polimórfica.
Técnicas: implementar tarifas substituíveis, proteger a coleção por operações do domínio e tratar falhas nomeadas.
Pré-requisito: polimorfismo, coleções e exceções básicas.
eval=diff g=3 l=1 s=1 Cofre — polimorfismo por contrato de valor
Objetivo: modelar moedas e itens por um contrato comum em uma coleção heterogênea.
Conceitos: protocolo, polimorfismo, enum, imutabilidade e invariantes de estado.
Técnicas: filtrar e substituir a coleção, calcular agregados e nomear falhas de domínio.
Pré-requisito: contratos, enums, coleções e invariantes.
eval=diff g=3 l=1 s=1 Cadastro — contas com regras polimórficas
Objetivo: aplicar regras mensais diferentes sem condicionar a coordenação pelo tipo da conta.
Conceitos: classe abstrata, herança, mapas, composição e delegação polimórfica.
Técnicas: manter invariantes de saldo, realizar transferência atômica e atualizar uma coleção heterogênea.
Pré-requisito: herança, mapas, polimorfismo e invariantes.
eval=diff g=1 l=1 s=1 Twitter — colaboração entre usuários e timelines
Objetivo: coordenar relações entre usuários e distribuição de tweets sem centralizar todas as regras.
Conceitos: composição, delegação, relações bidirecionais, coleção compartilhada e estado derivado.
Técnicas: encapsular timeline, manter vínculos consistentes e tratar remoção e referências.
Pré-requisito: mapas, polimorfismo, coleções e relações bidirecionais.
eval=diff g=1 l=1 s=1 Salário — regras de cálculo polimórficas
Objetivo: substituir regras de salário por categoria sem condicionais na folha.
Conceitos: abstração, herança, método abstrato, delegação e estado derivado.
Técnicas: encapsular políticas de cálculo, validar limites e dividir bônus dinamicamente.
Pré-requisito: polimorfismo, abstrações e cálculo de valores.
eval=diff g=2 l=1 s=1 Mensagem — inbox e leitura destrutiva
Objetivo: separar cadastro, envio e leitura em um modelo pequeno e testável.
Conceitos: composição, coleção de objetos, imutabilidade e comando/consulta.
Técnicas: consumir uma fila de mensagens, validar identidades e manter o domínio sem impressão.
Pré-requisito: classes, coleções e encapsulamento básico.
eval=self g=1 l=1 s=1 Comunicador — envio autorizado por composição
Objetivo: acrescentar mensagens sem misturar inbox e autorização ao domínio hospitalar.
Conceitos: composição, delegação, encapsulamento e estado consumível.
Técnicas: restringir receivers, entregar mensagens e testar leitura destrutiva.
Pré-requisito: composição, autorização e filas de mensagens.
eval=self g=2 l=1 s=1 Paciente — vínculos bidirecionais no hospital
Objetivo: manter consistente o vínculo entre pacientes e médicos.
Conceitos: associação bidirecional, multiplicidade, identidade e invariantes.
Técnicas: validar especialidade antes de atualizar os dois lados.
Pré-requisito: associações bidirecionais, multiplicidade e invariantes.
eval=diff g=3 l=1 s=1 WhatsApp — grupos e estado de leitura por participante
Objetivo: modelar mensagens não lidas de forma independente para cada membro de um grupo.
Conceitos: composição, multiplicidade, estado derivado e delegação.
Técnicas: controlar convites, participação, leitura destrutiva e notificações.
Pré-requisito: composição, coleções e leitura destrutiva.
eval=self g=3 l=1 s=1 Grupo — contrato comum para chats
Objetivo: tratar grupo e conversa individual por um contrato comum de chat.
Conceitos: classe abstrata, herança, especialização por comportamento e composição.
Técnicas: compartilhar envio/leitura, restringir capacidades e manter estado por participante.
Pré-requisito: classes abstratas, herança e polimorfismo.
eval=self g=1 l=1 s=1 Vetores — coleção linear e índices
Objetivo: preservar ordem e duplicatas em uma coleção linear.
Conceitos: sequência, índice, busca e mutação controlada.
Técnicas: inserir, alterar, localizar e tratar limites.
Pré-requisito: listas, índices e validação de limites.
eval=self g=2 l=1 s=1 Anotações — sessão e notas privadas
Objetivo: proteger notas por meio de uma sessão autenticada.
Conceitos: encapsulamento, estado de sessão, composição e imutabilidade.
Técnicas: validar credenciais, controlar acesso e associar notas ao usuário.
Pré-requisito: mapas, encapsulamento e validação de credenciais.
eval=self g=1 l=1 s=1 Trem — composição e alocação de passageiros
eval=self g=1 l=1 s=1 Produto — Composite e Decorator
eval=none g=1 l=1 s=1 Git — fluxo de trabalho e recuperação
Objetivo: compreender commits, histórico, restauração e resolução de conflitos.
Conceitos: versionamento, integração e recuperação.
Técnicas: usar Git local e remoto e documentar decisões.
Pré-requisito: comandos básicos de Git e trabalho com repositórios.
eval=diff g=3 l=1 s=1 Operações de saque, depósito, extrato
Objetivo: modelar um histórico financeiro que preserve operações e permita extorno seletivo.
Conceitos: encapsulamento, invariantes, comandos e consultas.
Técnicas: registrar eventos, validar saldo e operar por índices sem apagar histórico.
Pré-requisito: coleções, exceções e encapsulamento.