Questão de Engenharia de Software — Geral — FUNDATEC 2025
- Código
- qa699982
- Banca
- FUNDATEC
- Órgão
- SBC
- Ano
- 2025
- Cargo
- POSCOMP ( )
- ADecorator.
- BFactory Method.
- CProxy.
- DBuilder.
- EStrategy.
GabaritoE — Strategy.
Gabarito: letra E. O padrão Strategy é o que atende exatamente ao cenário descrito: ele permite definir uma família de algoritmos (o cálculo determinístico atual e o modelo treinado de IA), encapsulá-los em classes separadas e torná-los intercambiáveis em tempo de execução, sem que os módulos clientes conheçam a implementação específica. A essência está na troca dinâmica de comportamento via uma interface comum, que é o coração do Strategy.
O problema apresentado é um clássico de design de software: existe um algoritmo que calcula um valor aproximado, e o desenvolvedor precisa substituí-lo por um modelo de IA, permitindo alternar entre eles em tempo de execução e adicionar novas formas de cálculo futuramente. Isso é exatamente o que o padrão Strategy resolve. Ele define uma família de algoritmos, encapsula cada um deles em uma classe própria e os torna intercambiáveis. O cliente (o módulo que apresenta o resultado) depende apenas de uma interface comum, não da implementação concreta. Assim, a troca entre o cálculo determinístico e o modelo de IA é feita simplesmente alterando qual objeto Strategy está sendo usado, sem modificar o código do cliente.
A chave para identificar o Strategy é a combinação de três requisitos: encapsulamento do algoritmo, intercambialidade em tempo de execução e extensibilidade para novos algoritmos. O padrão atende a todos: o algoritmo fica encapsulado em uma classe Strategy; a troca em tempo de execução é feita pela composição (o contexto mantém uma referência à interface Strategy e pode ser alterada); e novos algoritmos são adicionados criando novas classes que implementam a mesma interface, sem tocar no código existente. Isso segue o princípio do Open/Closed (aberto para extensão, fechado para modificação).
Vamos comparar com os outros padrões para fixar a distinção:
Critério | Strategy | Decorator | Factory Method | Proxy | Builder |
|---|---|---|---|---|---|
Objetivo | Trocar algoritmos em tempo de execução | Adicionar responsabilidades dinamicamente | Encapsular a criação de objetos | Controlar acesso a um objeto | Construir objetos complexos passo a passo |
Estrutura | Interface + classes que implementam algoritmos | Envolve o objeto com classes decoradoras | Método que cria objetos | Intercepta chamadas ao objeto real | Diretor + construtor (builder) |
Troca em tempo de execução | Sim, via composição | Sim, mas adiciona comportamento, não troca o algoritmo | Não, a criação é fixa | Não, o proxy é transparente | Não, o produto é construído de uma vez |
Foco | Comportamento (algoritmo) | Responsabilidade (funcionalidade extra) | Criação (instanciação) | Acesso (controle) | Construção (montagem) |
A pegadinha da banca está em confundir o Strategy com o Factory Method. O Factory Method também lida com a criação de objetos, mas seu foco é como os objetos são criados, não como eles se comportam. No cenário, o problema não é criar o algoritmo, mas trocar o algoritmo em execução. O Strategy é o padrão comportamental que resolve isso. O Decorator, por sua vez, adiciona responsabilidades a um objeto, mas não troca o algoritmo principal — ele envolve o objeto com funcionalidades extras. O Proxy controla o acesso a um objeto, e o Builder constrói objetos complexos passo a passo. Nenhum deles se encaixa na necessidade de trocar a rotina de cálculo por um modelo de IA em tempo de execução.
Guarde o critério decisivo: se o requisito é trocar o algoritmo em tempo de execução, o padrão é Strategy. É exatamente essa a fronteira que separa as alternativas.
O Decorator adiciona responsabilidades a um objeto dinamicamente, envolvendo-o com classes decoradoras. Ele é usado para estender funcionalidades, não para trocar o algoritmo principal. No cenário, o objetivo é substituir a rotina de cálculo por outra, não adicionar comportamento a ela. O Decorator não permite trocar o algoritmo em tempo de execução; ele apenas agrega funcionalidades.
O Factory Method é um padrão criacional que encapsula a criação de objetos, permitindo que subclasses decidam qual classe instanciar. Ele resolve o problema de como criar o objeto, mas não o de trocar o algoritmo em execução. No cenário, o foco é a intercambialidade do cálculo, não a sua criação. O Factory Method não atende ao requisito de troca dinâmica.
O Proxy fornece um substituto ou representante de outro objeto para controlar o acesso a ele. Ele é usado para adicionar uma camada de controle (como lazy loading, acesso remoto, segurança), mas não para trocar o algoritmo. No cenário, não há necessidade de controle de acesso; a necessidade é de intercambialidade de algoritmos.
O Builder é um padrão criacional que separa a construção de um objeto complexo de sua representação, permitindo que o mesmo processo de construção crie diferentes representações. Ele é usado para montar objetos passo a passo, não para trocar algoritmos. No cenário, o problema não é a construção do objeto, mas a troca do comportamento de cálculo.
O Strategy define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. O contexto (o módulo que apresenta o resultado) mantém uma referência à interface Strategy e pode trocar o algoritmo em tempo de execução. Isso atende perfeitamente aos requisitos: encapsulamento do cálculo, troca dinâmica entre o algoritmo determinístico e o modelo de IA, e extensibilidade para novas formas de cálculo. É o padrão comportamental ideal para esse cenário.
Para identificar o Strategy na prova, procure por palavras-chave como "trocar em tempo de execução", "família de algoritmos", "intercambiável" e "encapsular o algoritmo". Se a questão mencionar "adicionar responsabilidades", pense em Decorator; se mencionar "criar objetos", pense em Factory Method; se mencionar "controlar acesso", pense em Proxy; se mencionar "construir passo a passo", pense em Builder. O Strategy é o único que foca na troca de comportamento.
Gabarito: letra E
Link permanente: /questoes/qa699982