Pular para o conteúdo principal

Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — FCC 2025

Engenharia de SoftwarePadrões de Projeto (Engenharia de Software)
Código
fc150540
Banca
FCC
Órgão
MPE PI
Ano
2025
Cargo
Ana Min ( )
Considere o seguinte bloco de código Python, em condições ideais: class Editor:     def __init__(self):         self.history = []     def write(self, text):         self.history.append(text)     def undo(self):         if self.history:             return self.history.pop()         return None   O padrão de projeto mais claramente aplicado nesse bloco de código é o
  1. ATemplate Method.
  2. BState.
  3. CMemento.
  4. DCommand.
  5. EObserver.
Revelar gabarito e comentário

GabaritoC — Memento.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Padrões de Projeto: 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.

NÃO CAIA NESSA!

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.

1Objetivo
Capturar estado interno
Restaurar estado posterior
Sem violar encapsulamento
2Participantes
Originator (Editor)
Memento (texto salvo)
Caretaker (lista history)
3Undo
Armazena estados
Restaura último estado
4vs Command
Memento encapsula estado
Command encapsula ação
Memento (comportamental)
LEVELsoulevel.com.br
Memento (comportamental): Objetivo (Capturar estado interno, Restaurar estado posterior, Sem violar encapsulamento); Participantes (Originator (Editor), Memento (texto salvo), Caretaker (lista history)); Undo (Armazena estados, Restaura último estado); vs Command (Memento encapsula estado, Command encapsula ação)

Alternativa A — ❌ Incorreta

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.

Alternativa B — ❌ Incorreta

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.

Alternativa C — ✅ Correta ⟵ GABARITO

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.

Alternativa D — ❌ Incorreta

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.

Alternativa E — ❌ Incorreta

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