ConstructiCat Logo
CodeBust.
Browse section ▾

Separar Consulta de Modificador.

Problem

Você tem um método que retorna um valor mas também altera algo dentro de um objeto?

Solution

Divida o método em dois métodos separados. Como você esperaria, um deles deve retornar o valor e o outro modifica o objeto.

##Example

Antes
Customer getTotalOutstandingAndSetReadyForSummaries()
Depois
Customer getTotalOutstanding()setReadyForSummaries()

##Why Refactor

Esta técnica implementa a Segregação de Responsabilidade entre Comando e Consulta (Command and Query Responsibility Segregation). Esse princípio nos diz para separar o código responsável por obter dados do código que altera algo dentro de um objeto.

O código para obter dados é chamado de consulta. O código para alterar coisas no estado visível de um objeto é chamado de modificador. Quando uma consulta e um modificador são combinados, você não tem como obter dados sem fazer alterações em sua condição. Em outras palavras, você faz uma pergunta e pode mudar a resposta mesmo enquanto ela está sendo recebida. Esse problema fica ainda mais grave quando a pessoa que chama a consulta pode não saber dos “efeitos colaterais” do método, o que frequentemente leva a erros em tempo de execução.

Mas lembre-se de que os efeitos colaterais só são perigosos no caso de modificadores que alteram o estado visível de um objeto. Estes podem ser, por exemplo, campos acessíveis a partir da interface pública de um objeto, registros em um banco de dados, em arquivos, etc. Se um modificador apenas armazena em cache o resultado de uma operação complexa e o guarda em um campo privado de uma classe, dificilmente causará algum efeito colateral.

##Benefits

  • Se você tem uma consulta que não altera o estado do seu programa, pode chamá-la quantas vezes quiser sem precisar se preocupar com alterações indesejadas no resultado causadas pelo simples fato de você chamar o método.

##How to Refactor

  1. Crie um novo método de consulta para retornar o que o método original fazia.

  2. Altere o método original para que ele retorne apenas o resultado da chamada ao novo método de consulta.

  3. Substitua todas as referências ao método original por uma chamada ao método de consulta. Imediatamente antes dessa linha, coloque uma chamada ao método modificador. Isso o protegerá de efeitos colaterais caso o método original fosse usado na condição de um operador condicional ou laço.

  4. Livre-se do código que retorna o valor no método original, que agora se tornou um verdadeiro método modificador.