Separar Consulta de Modificador.
¿Tienes un método que devuelve un valor pero también cambia algo dentro de un objeto?
Divide el método en dos métodos independientes. Como es de esperar, uno de ellos debe devolver el valor y el otro modifica el objeto.
##Example
##Why Refactor
Esta técnica de factorización implementa la Segregación de Responsabilidad de Comando y Consulta (Command and Query Responsibility Segregation). Este principio nos indica que separemos el código responsable de obtener datos del código que cambia algo dentro de un objeto.
El código para obtener datos se denomina consulta. El código para cambiar cosas en el estado visible de un objeto se denomina modificador. Cuando se combinan una consulta y un modificador, no tienes forma de obtener datos sin alterar su condición. En otras palabras, haces una pregunta y puedes cambiar la respuesta incluso mientras la estás recibiendo. Este problema se vuelve aún más grave cuando quien llama a la consulta puede desconocer los “efectos secundarios” del método, lo que a menudo conduce a errores en tiempo de ejecución.
Pero recuerda que los efectos secundarios solo son peligrosos en el caso de los modificadores que cambian el estado visible de un objeto. Estos podrían ser, por ejemplo, campos accesibles desde la interfaz pública de un objeto, una entrada en una base de datos, en archivos, etc. Si un modificador solo almacena en caché una operación compleja y la guarda en el campo privado de una clase, difícilmente puede causar efectos secundarios.
##Benefits
- Si tienes una consulta que no cambia el estado de tu programa, puedes llamarla tantas veces como quieras sin tener que preocuparte por cambios no intencionados en el resultado causados por el mero hecho de llamar al método.
##How to Refactor
-
Crea un nuevo método de consulta que devuelva lo que hacía el método original.
-
Cambia el método original para que devuelva únicamente el resultado de llamar al nuevo método de consulta.
-
Reemplaza todas las referencias al método original con una llamada al método de consulta. Inmediatamente antes de esta línea, coloca una llamada al método modificador. Esto te protegerá de los efectos secundarios en caso de que el método original se usara en la condición de un operador condicional o de un bucle.
-
Deshazte del código que devuelve el valor en el método original, que ahora se ha convertido en un auténtico método modificador.