Separar Consulta de Modificador.
Você tem um método que retorna um valor mas também altera algo dentro de um objeto?
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
##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
-
Crie um novo método de consulta para retornar o que o método original fazia.
-
Altere o método original para que ele retorne apenas o resultado da chamada ao novo método de consulta.
-
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.
-
Livre-se do código que retorna o valor no método original, que agora se tornou um verdadeiro método modificador.