SeparaciónComandoPregunta
Escrito por Martin Fowler
Traducido por Miguel Figueroa
Revisado por Carmen Vidal
El término ' separación comando-pregunta' fue acuñado por Bertrand Meyer en su libro “Construcción de Software Orientado a Objetos” – uno de los libros de OO mas influyentes en los primeros días de la OO. (la primera edición es la que tuvo influencia, la segunda edición es buena pero se necesitarán varios meses en un gimnasio antes de poder levantarlo.)
La idea fundamental es que debemos dividir los métodos de un objeto en dos categorías bien definidas:
• Preguntas: Devuelve un resultado y no cambia el estado observable del sistema (libre de efectos secundarios).
• Comandos: Cambia el estado de un sistema pero no devuelve un valor.
Debido a que el término “comando” se utiliza extensamente en otros contextos prefiero llamarlos “modificadores”, también se puede ver el término “mutantes”.
La idea realmente valiosa en este principio es que es ayuda mucho si uno/se puede separar claramente los métodos que cambian el estado de los que no lo hacen. Esto es porque uno puede utilizar preguntas en muchas situaciones con mucha más confianza, introduciéndolas en cualquier sitio, cambiando su orden. Uno debe ser más cuidadoso con los modificadores.
La noción en el principio es que el tipo devuelto es lo que expone la diferencia. Es una buena convención porque la mayoría del tiempo funciona bien. Considere la siguiente expresión en Java para iterar a través de una colección: el método “next” da el elemento siguiente en la colección y avanza el iterador. Personalmente yo preferiría un estilo que tiene separado los métodos “avance” y “actual”.
A Meyer le gusta utilizar la separación comando-pregunta con seguridad, pero hay excepciones. Agregar a una pila es un buen ejemplo de un modificador que modifica el estado. Meyer dice correctamente que uno puede evitar tener este método, pero es una expresión útil. Así que prefiero seguir este principio cuando pueda, pero estoy preparado para romperlo para agregar en la pila.
Sería agradable si el lenguaje en sí mismo apoyara esta noción. Me puedo imaginar un lenguaje que detectara métodos que cambian el estado, o permita por lo menos que el programador los marque. Una razón por la que los lenguajes no pueden detectarlos automáticamente es que la regla sobre no cambiar el estado en realidad solamente se aplica al EstadoObservable del sistema. Usar marcas del programador parece más razonable pero es raro. El único caso que realmente he visto es el modificador “const” en C++. Puesto que no he utilizado C++ durante muchos años es difícil para mí el constatar cómo de últil es en la práctica. Mi sensación es que buenos usuarios de C++ usan mucho el “const” y les gusta.

