---
title: "Separar Consulta de Modificador"
type: "refactoring-technique"
slug: "separate-query-from-modifier"
url: "http://localhost:3000/pt-br/separate-query-from-modifier.md"
category: "Simplifying Method Calls"
description: "Problema: Você tem um método que retorna um valor mas também altera algo dentro de um objeto? Solução: Divida o método em dois métodos separados. Como você esperaria, um deles deve retornar o valor e o outro modifica o objeto."
---
# Separar Consulta de Modificador

> Problema: Você tem um método que retorna um valor mas também altera algo dentro de um objeto? Solução: Divida o método em dois métodos separados. Como você esperaria, um deles deve retornar o valor e o outro modifica o objeto.

## 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.

## 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_.
## Relations

**Helps you do**

- [Substituir Variável Temporária por Consulta](/pt-br/replace-temp-with-query.md)

