Soluções — Decomposição e Responsabilidade
Aula 4 — Programação Orientada a Objetos
Dica(Resposta) Teste 1 — A Classe Deus (God Class)
- ✔ Verdadeiro — É a descrição direta do
Pedidodo início da aula, que reúne cálculo (negócio), impostos, formatação, persistência e e-mail — cinco responsabilidades de atores/departamentos diferentes num único arquivo. - ✔ Verdadeiro — É a heurística apresentada na aula para detectar violações do SRP — precisar de “E” (ou “OU”) para descrever a classe numa frase é o sinal de alerta.
- ✗ Falso — É o oposto do que a aula demonstra — concentrar tudo aumenta a fragilidade (mudar imposto, banco ou layout do recibo, todos exigem alterar
Pedido), o acoplamento com infraestrutura e a carga cognitiva; “concentrado” não é sinônimo de “fácil de manter”. - ✔ Verdadeiro — É um dos quatro problemas listados na aula — testar o cálculo do total de um
Pedidoque também salva no banco e envia e-mail dispara, na prática, esses efeitos colaterais reais.
Dica(Resposta) Teste 2 — Coesão e Acoplamento
- ✗ Falso — Fundir métodos que não compartilham nenhum atributo é exatamente o cenário de LCOM alto (interseção de uso vazia) discutido com
GestorDeUsuario— a fusão não cria nenhuma relação lógica entre as responsabilidades, apenas empilha duas classes de baixa coesão dentro de uma única caixa. - ✗ Falso — Esse cenário extremo é a própria definição operacional de acoplamento muito ALTO — o vínculo entre
AeBé tão forte queBnão pode evoluir livremente sem quebrarA; baixo acoplamento seria o oposto,Apermanecendo estável mesmo com mudanças internas emB. - ✔ Verdadeiro — É a mesma estrutura da analogia da aula (caixa só com chaves de fenda = alta coesão) transferida para um novo domínio: cada bancada concentra ferramentas relacionadas à mesma especialidade, sem misturar propósitos diferentes.
- ✔ Verdadeiro — Coesão é uma propriedade interna de uma única classe (o quanto suas responsabilidades pertencem juntas); acoplamento é uma propriedade da relação entre duas classes. As duas métricas costumam melhorar juntas na prática ao se aplicar o SRP, mas são logicamente independentes — nada impede, em princípio, duas classes de baixa coesão internas e baixo acoplamento mútuo.
Dica(Resposta) Teste 3 — SRP e o Teste do “E”
- ✗ Falso — O número de métodos públicos não mede razões de mudança — um único método público pode esconder múltiplas responsabilidades misturadas internamente, como o antigo
Pedido.finalizarPedido(), que num só método fazia cálculo, processamento de pagamento e notificação por e-mail. - ✔ Verdadeiro — É o próprio Teste do “E” apresentado na aula como heurística de diagnóstico do SRP.
- ✗ Falso — SRP fala de razões de mudança, não de contagem de métodos; uma classe coesa pode legitimamente ter vários métodos públicos relacionados (como
Conta.debitar()/creditar()), desde que todos sirvam à mesma responsabilidade e à mesma razão de mudança. - ✔ Verdadeiro — É exatamente o exemplo
finalizarPedido()apresentado como violação — calcular, processar pagamento e notificar são três razões de mudança independentes misturadas no mesmo método.
Dica(Resposta) Teste 4 — Injeção de Dependência
- ✗ Falso — O ganho de testabilidade vem de quem decide a implementação concreta, não de onde ou como a referência é guardada. Criar as dependências com
newdentro do próprio construtor continua acoplandoPedidoa classes concretas específicas e impede substituí-las por mocks no teste — encapsular o atributo não resolve esse problema. - ✔ Verdadeiro — É o ganho central apresentado — se o construtor exige
PagaveleServicoEmailcomo parâmetros, é impossível instanciar umPedidosem esses colaboradores. - ✗ Falso — A DI reduz o acoplamento com implementações concretas —
Pedidoconhece apenas o contratoPagavel/ServicoEmail, não uma classe concreta específica; e o objeto não precisa saber “quem o instanciou”, apenas recebe as dependências já prontas. - ✔ Verdadeiro — É exatamente o problema que motiva a refatoração — sem DI, testar a lógica de orquestração exigiria cobrar um cartão de verdade ou enviar um e-mail real.
Dica(Resposta) Teste 5 — A Teoria do Ator no SRP
- ✗ Falso — Mesma estrutura do exemplo
Funcionario(CFO vs. RH): “score de crédito” é um conceito, mas dois atores diferentes (Risco e Produto) solicitam mudanças por motivos independentes — um ajusta o modelo de risco, o outro ajusta o layout de exibição. Pela Teoria do Ator, isso são duas razões de mudança, não uma. - ✗ Falso — É exatamente o oposto — serem setores diferentes é o que torna a mistura arriscada: uma mudança de layout de relatório solicitada pelo RH força recompilar e re-testar a lógica de folha de pagamento do Financeiro, mesmo sem nenhuma relação de negócio entre as duas.
- ✔ Verdadeiro — É a consequência prática destacada no exemplo
Funcionario— misturar as lógicas acopla os ciclos de lançamento de departamentos diferentes. - ✔ Verdadeiro — A Teoria do Ator identifica razões de mudança por quem solicita a mudança; se só existe um ator possível na organização inteira, todas as classes compartilhariam, por esse critério, a mesma “razão para mudar” — o poder discriminador da teoria só aparece quando há múltiplos atores reais e distintos, como CFO e RH no exemplo da aula.
Dica(Resposta) Teste 6 — A Métrica LCOM
- ✗ Falso — É o oposto — se todo método usa o mesmo conjunto de atributos, a interseção de uso entre os métodos é máxima, então a falta de coesão é mínima: o LCOM seria o mais BAIXO possível, indicando uma classe bem coesa (o antônimo do exemplo
GestorDeUsuario, em que a interseção de uso era vazia). - ✗ Falso — LCOM significa Lack of Cohesion in Methods — um valor alto indica FALTA de coesão, não o contrário; é o sinal de que a classe deveria ser dividida, como no exemplo
GestorDeUsuario. - ✔ Verdadeiro — É exatamente o cenário de
GestorDeUsuario(nomeusado só porsalvarNome(),ipConexaousado só porlogAcesso()) — interseção de uso vazia, o código “implorando” para virar duas classes (RepositorioUsuarioeAuditoriaAcesso). - ✔ Verdadeiro — É a conclusão apresentada na aula sobre a métrica — uma prova quantitativa de falta de coesão, complementando o julgamento qualitativo do Teste do “E”.
Dica(Resposta) Teste 7 — O Lado Sombrio do SRP
- ✗ Falso — O cenário descrito é, sim, Cirurgia de Espingarda — mas a solução da aula vai na direção OPOSTA: agrupar o que muda junto e pelos mesmos motivos, consolidando campos relacionados (como os dados do comprador) numa única classe coesa (
DadosComprador), em vez de fragmentar ainda mais. - ✔ Verdadeiro — É um dos dois riscos do “lado sombrio” apresentados na aula — retirar toda a responsabilidade do objeto em nome da separação de responsabilidades reduz a classe a um contêiner passivo.
- ✗ Falso — É o oposto — a aula argumenta que assegurar a integridade do próprio saldo é a responsabilidade primária de
Conta; o SRP equilibrado (Modelo Rico) mantémdebitar()/creditar()dentro da própria classe. - ✗ Falso — Dois métodos que operam sobre o mesmo atributo, pelo mesmo motivo de negócio (preservar a integridade do saldo), não são duas razões de mudança — são a mesma razão exercida de duas formas. É exatamente o exemplo de “Modelo Rico” equilibrado da aula, o oposto de uma violação.
Dica(Resposta) Teste 8 — Associação: Dependência (“Usa um”)
- ✗ Falso — Guardar a referência permanentemente como atributo é justamente o que transforma a relação em Agregação (ou Composição) — o traço definidor de Dependência é não persistir a referência para uso futuro, usando o objeto apenas durante a execução do método.
- ✗ Falso — É o oposto — na Dependência, o objeto normalmente é recebido como parâmetro e não guardado; o vínculo é passageiro, como usar e devolver uma caneta emprestada do balcão.
- ✔ Verdadeiro — Mesma estrutura transferida para outro domínio: uso temporário de um objeto recebido como parâmetro, sem armazená-lo como atributo — a marca definidora da Dependência.
- ✔ Verdadeiro — É o próprio exemplo de código da aula — a lista é usada só para conferir o total, sem ser guardada em
this.itens.
Dica(Resposta) Teste 9 — Associação: Agregação (“Tem um”)
- ✗ Falso — A marca definidora de Agregação é justamente a parte sobrevivendo à destruição do todo (o
Produtocontinua existindo no catálogo); se destruir oCarrinhotambém apagasse osProduto, a relação teria as propriedades de Composição, não de Agregação. - ✗ Falso — É o oposto — a aula é explícita: “Se o carrinho for destruído, o Smartphone ainda existe no catálogo!”; ciclos de vida independentes são a essência da Agregação.
- ✔ Verdadeiro — Como a Agregação não implica posse exclusiva, o mesmo
Produtodo catálogo pode estar, ao mesmo tempo, referenciado por váriosCarrinhode clientes diferentes — diferente da Composição, em que a posse é exclusiva. - ✔ Verdadeiro — A escala de força estrutural apresentada na aula vai de Dependência (mais fraca) a Agregação a Composição (mais forte); Agregação permite ciclos de vida independentes, enquanto Composição os atrela.
Dica(Resposta) Teste 10 — Associação: Composição (“É parte de”)
- ✗ Falso — Posse exclusiva do todo sobre a parte é o traço definidor de Composição; se a parte passasse a ser compartilhada por dois todos, ela deixaria de ter um único proprietário, e a relação teria as propriedades de Agregação, não mais de Composição.
- ✔ Verdadeiro — Mesma estrutura de ciclo de vida atrelado vista em
Cliente/Cartao(nasce e morre com o todo), aplicada a um domínio novo —HistoricoDisciplinarnão tem sentido de existir fora doFuncionarioque o originou. - ✔ Verdadeiro — É o exemplo citado na aula para ilustrar Composição — as páginas não têm sentido de existir fora do documento a que pertencem.
- ✗ Falso — É o oposto do argumento central da aula — a sintaxe de declarar
private Cartao cartaoé idêntica nos dois casos; o que decide é uma regra de domínio de negócio, como o que deve acontecer aos dados do cartão quando a conta do cliente é excluída.
Dica(Resposta) Teste 11 — Delegação
- ✗ Falso — Navegar até
getBanco().getGerente()atravessa fronteiras de objetos que não são amigos diretos deCliente(nem mesmo deCartao), recriando o naufrágio de código dentro do próprio método — o fato de o método também delegar corretamente a operação principal aoCartaonão perdoa essa navegação extra. - ✗ Falso — É o oposto — é o exemplo do “naufrágio de código”/violação de Demeter que a aula usa como ponto de partida a ser corrigido, não um exemplo de delegação correta.
- ✔ Verdadeiro — É a correção apresentada — o chamador passa a falar só com
Cliente(um amigo direto de si mesmo), que por sua vez delega ao seu próprioCartao. - ✔ Verdadeiro — É a síntese apresentada no final do bloco — Associação (ter) somada a Delegação (usar) torna a composição tão poderosa quanto a herança, porém mais flexível.
Dica(Resposta) Teste 12 — Tell, Don’t Ask e a Síntese da Aula
- ✗ Falso — É o oposto — sondar dois atributos por fora para decidir é exatamente o padrão Ask que a aula contrasta com Tell; o equivalente alinhado com
pedido.clientePodePagar()seria um método comoproduto.podeVender(quantidade), que decide internamente e devolve só a resposta. - ✗ Falso — É o oposto da síntese da aula — Associação define a estrutura (quem contém quem), SRP orienta como dividir responsabilidades entre essas estruturas, e Delegação é o comportamento que torna essa divisão funcional; os três se encaixam na mesma arquitetura viva.
- ✔ Verdadeiro — É um dos benefícios centrais do SRP e da decomposição em especialistas discutidos ao longo da aula — evita a “carga cognitiva alta” citada como problema da Classe Deus.
- ✔ Verdadeiro — É a mesma lógica de estabilidade de contrato vista com
Pagavel— trocarCartaopor outro meio de pagamento, ou alterar a lógica interna do especialista, não afeta quem apenas delega a ele.