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.
##Exemplo
String foundMiscreant(String[] people) {
for (String person : people) {
if (person.equals("Don") || person.equals("John")) {
sendAlert();
return person;
}
}
return "";
}void checkSecurity(String[] people) {
sendAlert(people);
String found = foundPerson(people);
someLaterCode(found);
}
void sendAlert(String[] people) {
if (!foundPerson(people).isEmpty()) notifySecurity();
}
String foundPerson(String[] people) {
for (String person : people) {
if (person.equals("Don") || person.equals("John")) return person;
}
return "";
}##Por que refatorar
Esta técnica implementa a Separação entre Comando e Consulta (Command-Query Separation, CQS). 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.
##Benefícios
- 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.
##Como refatorar
-
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.