Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — FCC 2025
- Código
- fc150540
- Banca
- FCC
- Órgão
- MPE PI
- Ano
- 2025
- Cargo
- Ana Min ( )
- ATemplate Method.
- BState.
- CMemento.
- DCommand.
- EObserver.
GabaritoC — Memento.
Gabarito: letra C. O código implementa o padrão Memento, pois a classe Editor armazena o histórico de estados (self.history) e permite restaurar o estado anterior através do método undo(), que remove o último estado salvo. O padrão Memento é um padrão comportamental do GoF que captura e externaliza o estado interno de um objeto sem violar o encapsulamento, permitindo que o objeto seja restaurado a esse estado posteriormente.
O padrão Memento é um dos 23 padrões de projeto do catálogo GoF (Gang of Four), classificado como padrão comportamental. Seu objetivo é fornecer a capacidade de desfazer (undo) operações, salvando o estado de um objeto em um momento específico e permitindo restaurá-lo quando necessário. No código apresentado, a classe Editor possui uma lista history que armazena os textos escritos. O método write() adiciona o texto atual ao histórico, e o método undo() remove e retorna o último texto salvo, restaurando o estado anterior. Essa é a essência do Memento: capturar o estado (o texto) e restaurá-lo (desfazer a escrita).
Na prática, o padrão Memento envolve três participantes principais: o Originator (o objeto cujo estado será salvo, aqui a classe Editor), o Memento (o objeto que armazena o estado, aqui a string text adicionada à lista) e o Caretaker (o objeto que gerencia os mementos, aqui a própria lista history). O Originator cria um memento com seu estado atual, e o Caretaker o armazena. Quando é necessário desfazer, o Caretaker entrega o memento de volta ao Originator, que restaura seu estado. No código, a lista history atua como Caretaker, e cada string armazenada é um Memento.
A distinção entre Memento e outros padrões é crucial. O Command também é usado para implementar undo, mas encapsula uma ação como um objeto, permitindo desfazer executando a operação inversa. O State altera o comportamento de um objeto quando seu estado interno muda, o que não ocorre aqui. O Template Method define o esqueleto de um algoritmo em uma operação, deixando alguns passos para subclasses. O Observer define uma dependência um-para-muitos entre objetos, notificando observadores sobre mudanças de estado. Nenhum desses padrões se aplica ao código, que é um exemplo clássico de Memento.
A pegadinha da banca é confundir Memento com Command, pois ambos podem ser usados para implementar undo. No entanto, o Command encapsula a ação em si, enquanto o Memento encapsula o estado. No código, não há encapsulamento de ações, apenas armazenamento e restauração de estados, o que caracteriza claramente o Memento.
A banca explora a confusão entre Memento e Command. Ambos podem implementar undo, mas o Command encapsula a ação (com método execute() e unexecute()), enquanto o Memento encapsula o estado (com métodos setState() e getState()). No código, a classe Editor apenas armazena e restaura estados, sem encapsular ações — por isso é Memento, não Command.
O Template Method define o esqueleto de um algoritmo em uma operação, postergando alguns passos para subclasses. Ele é usado para reutilizar a estrutura de um algoritmo, permitindo que subclasses implementem partes específicas. No código, não há definição de um algoritmo com passos a serem sobrescritos; há apenas armazenamento e restauração de estados. Portanto, o Template Method não se aplica.
O State permite que um objeto altere seu comportamento quando seu estado interno muda, parecendo que a classe do objeto mudou. Ele é usado para evitar condicionais complexas, delegando o comportamento a objetos de estado. No código, não há mudança de comportamento baseada em estado; a classe Editor sempre se comporta da mesma forma, independentemente do conteúdo de history. Portanto, o State não se aplica.
O Memento captura e externaliza o estado interno de um objeto sem violar o encapsulamento, permitindo que o objeto seja restaurado a esse estado posteriormente. No código, a classe Editor armazena o histórico de textos (self.history) e permite desfazer (undo()) removendo o último texto salvo. Isso é exatamente o que o Memento faz: salvar estados para permitir restauração. A lista history atua como Caretaker, e cada string armazenada é um Memento.
O Command encapsula uma solicitação como um objeto, permitindo parametrizar clientes com diferentes solicitações, enfileirar ou registrar solicitações e suportar operações reversíveis. Ele é usado para implementar undo, mas encapsula a ação em si, com métodos como execute() e unexecute(). No código, não há encapsulamento de ações; há apenas armazenamento e restauração de estados. Portanto, o Command não se aplica.
O Observer define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente. Ele é usado para manter consistência entre objetos relacionados. No código, não há notificação de dependentes; a classe Editor apenas gerencia seu próprio histórico. Portanto, o Observer não se aplica.
Gabarito: letra C — o padrão Memento é o mais claramente aplicado, pois o código captura e restaura o estado interno da classe Editor.
Link permanente: /questoes/fc150540