Do Diagrama de Classes à Implementação Limpa com Testes Unitários.
Focamos em ESTADO.
Focamos em COMPORTAMENTO.
"Objetos são dados com comportamento; Closures são comportamento com dados."
Encapsulamento não é (apenas) criar getters e setters para tudo.
É sobre proteger invariantes e esconder detalhes de implementação.
pedido.Cliente.Endereco.Cep.
Num Tamagotchi, você não pode simplesmente dizer: bichinho.Fome = 0;
Isso violaria as regras internas (invariantes). E se a fome ficar negativa? E se ele morrer de tanto comer?
"Favoreça a composição sobre a herança." - Effective Java
O poder de tratar objetos diferentes da mesma maneira.
Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.
O jogo não sabe qual personagem você escolheu. Ele apenas sabe que é um Personagem.
Quando você aperta X, o controle envia o comando Atacar().
Atacar() ->
"Desfere golpe de espada!"
Atacar() ->
"Lança bola de fogo!"
<< interface >>: Contrato puro."Usa um"
"Tem um" (Fraco)
"É parte de" (Forte)
"Uma classe deve ter apenas um motivo para mudar."
Exemplo Ruim: Classe Relatorio que calcula dados E salva em PDF.
Refatoração: CalculadoraRelatorio e GeradorPDF.
"Aberto para extensão, fechado para modificação."
Exemplo Ruim: if (tipo == "Boleto") ... else if ...
Refatoração: Polimorfismo! IPagamento.Processar().
Alta Coesão (Coisas relacionadas juntas) e Baixo Acoplamento (Coisas independentes separadas).
"O ato de escrever um teste força você a considerar a interface e a usabilidade do código antes da implementação."
Com TDD = Constante (Graph line flat)
Sem TDD = Exponencial (Code rot)
Escreva o teste para uma funcionalidade que NÃO existe. O erro deve ser de compilação ou asserção.
Cometa pecados! Use constantes, `return true`, copie e cole. O objetivo é ver a barra verde rápido.
Agora sim: Remova duplicação, renomeie variáveis, aplique Patterns. O teste garante que nada quebrou.
O teste passa, mas não testa nada.
Se você precisa de 50 linhas para instanciar a classe, seu design está altamente acoplado.
Tentar testar métodos `private` ou `internal`. Teste apenas a interface pública!
Testes lentos (que tocam Banco de Dados ou Rede). Teste unitário deve rodar em milissegundos.
Hoje, quase ninguém escreve tudo na mão. O trabalho mudou: ler, entender e gerenciar os outputs gerados por agentes.
O prompt não é especificação final; os testes são.
Em chips modernos, há bilhões de transistores. É humanamente impossível gerenciar um por um. O engenheiro valida comportamento emergente por simulação, teste e especificação.
"O melhor recurso visual para aprender Padrões de Projeto e Refatoração."
🔗 Acessar Refactoring Guru 🚀 Repositório da Aula (aula_dotnet_cars)Essencial para entender Singleton, Factory, Strategy, Observer, etc.