Aula 3 — Programação Orientada a Objetos
2026-08-30
Até aqui: anatomia de uma peça isolada (Aulas 1–2).
A partir de agora: como as peças se conectam — a Orientação a Objetos como design de comunicações.
Roteiro: colaboração → interface vs. implementação → Lei de Demeter → Plug-and-Play.
Produto, ItemCarrinho, CarrinhoCarrinho não sabe de preço nem imposto — só confia no contrato subtotal().
Dividir em especialistas evita Objetos Deus e permite testar cada peça isolada.
Trocar o gateway por REST ou gRPC: Compra nem percebe.
Mesma assinatura pública → zero impacto em quem chama calcularPrecoDeVenda().
Se Carrinho tivesse um getter para precoCusto e calculasse a margem por fora, o que exatamente quebraria quando a regra de margem mudasse?
Escreva sua resposta e compare com um colega antes de avançar (2 min). Para ajudar, julgue V ou F nos 4 itens abaixo — a questão só conta se acertar todos:
ItemCarrinho.subtotal() deveria ler diretamente o atributo precoBase de Produto para ser mais eficiente.calcularPrecoDeVenda() dentro de Produto centraliza a política de margem num único lugar do sistema.Dica
ItemCarrinho.subtotal() deveria ler diretamente o atributo precoBase de Produto para ser mais eficiente — isso violaria o encapsulamento; subtotal() deve perguntar via getPreco().calcularPrecoDeVenda() dentro de Produto centraliza a política de margem num único lugar do sistema — é o mesmo argumento do Bloco 3, mudança de regra sem efeito cascata.Voltando à pergunta: se Carrinho tivesse copiado precoCusto para calcular a margem por fora, a lógica de margem ficaria duplicada em toda classe que precisa de um preço — mudar a regra exigiria caçar e atualizar cada cópia, exatamente o efeito cascata que a caixa preta de Produto evita.
Não é o número de pontos — é a fronteira invadida. Se Carteira mudar, Checkout quebra, mesmo sem relação direta com ela.
Checkout fica cego para a existência de uma Carteira. Trocar por ApplePay: zero impacto.
Por que “número de pontos na linha” é um jeito ruim de explicar a Lei de Demeter, e “fronteira invadida” é melhor?
Escreva sua resposta e compare com um colega antes de avançar (2 min). Para ajudar, julgue V ou F nos 4 itens abaixo — a questão só conta se acertar todos:
pedido.getCliente().getCarteira().getSaldo() é um exemplo saudável de reuso de getters.pedido.clientePodePagar().Dica
pedido.getCliente().getCarteira().getSaldo() é um exemplo saudável de reuso de getters — é o exemplo clássico de violação (train wreck).pedido.clientePodePagar() — delegação em cadeia é exatamente a solução apresentada.Voltando à pergunta: contar pontos falha porque encadear getters de objetos que já são “amigos” (por exemplo, uma fluent interface de configuração) não viola nada, e uma única navegação até um objeto que não é amigo direto já é problema; “fronteira invadida” aponta a causa real — depender da estrutura interna de um vizinho que não deveria ser alcançado diretamente.
PagavelCheckout Aceita Qualquer PagavelAmanhã surge o Pix → só Pix implements Pagavel. Checkout não muda.
O erro revela que o sistema “sabe demais”: exige identidade específica, não capacidade funcional.
Se Checkout.finalizar recebesse CartaoDeCredito em vez de Pagavel, o que exatamente o erro de compilação de um novo Pix estaria diagnosticando sobre o design?
Escreva sua resposta e compare com um colega antes de avançar (2 min). Para ajudar, julgue V ou F nos 4 itens abaixo — a questão só conta se acertar todos:
Checkout.finalizar(Pagavel metodo) aceita qualquer classe futura que implemente Pagavel, sem recompilação.Boleto onde se espera CartaoDeCredito é sempre culpa do compilador, não do design.CartaoDeCredito) em vez da interface (Pagavel) aumenta o acoplamento do sistema.Dica
Checkout.finalizar(Pagavel metodo) aceita qualquer classe futura que implemente Pagavel, sem recompilação — é o próprio benefício do Plug-and-Play.Boleto onde se espera CartaoDeCredito é sempre culpa do compilador, não do design — é um diagnóstico de acoplamento forte no design, não um bug do compilador.CartaoDeCredito) em vez da interface (Pagavel) aumenta o acoplamento do sistema — exigir a classe concreta é o próprio sintoma de acoplamento forte.Voltando à pergunta: o erro de compilação diagnostica que o sistema amarrou uma operação de negócio a uma identidade concreta específica em vez de a uma capacidade — é o sintoma exato de acoplamento forte que a Interface resolve, elevando o parâmetro para o nível de abstração certo.
Próxima aula: decompor uma única classe que faz coisas demais — o Princípio da Responsabilidade Única.
UNICAMP — Instituto de Computação