b'\n_START_ARTICLE_\nCommand\xe2\x80\x93query separation\n_START_PARAGRAPH_\nCommand\xe2\x80\x93query separation (CQS), en castellano Separaci\xc3\xb3n de comandos y consultas, es un principio de la programaci\xc3\xb3n inform\xc3\xa1tica imperativa. Fue ideado por Bertrand Meyer como parte de su trabajo pionero sobre el lenguaje de programaci\xc3\xb3n Eiffel._NEWLINE_El principio afirma que cada m\xc3\xa9todo debe ser un comando que realiza una acci\xc3\xb3n, o una consulta que devuelve datos al llamante, pero no ambos. En otras palabras, hacer una pregunta no debe cambiar la respuesta. M\xc3\xa1s formalmente, los m\xc3\xa9todos deben devolver un valor s\xc3\xb3lo si son referencialmente transparentes y, por tanto, no poseen efectos colaterales. Es de destacar que la aplicaci\xc3\xb3n r\xc3\xadgida de esta especificaci\xc3\xb3n hace que el seguimiento del n\xc3\xbamero de veces que las consultas han sido emitidos sea esencialmente imposible; est\xc3\xa1 claramente destinado como una gu\xc3\xada de programaci\xc3\xb3n en lugar de una regla para una buena codificaci\xc3\xb3n, como la de evitar el uso de un GOTO desde un bucle anidado.\n_START_SECTION_\nConexi\xc3\xb3n con el dise\xc3\xb1o por contrato\n_START_PARAGRAPH_\nCommand\xe2\x80\x93query separation est\xc3\xa1 particularmente bien adaptado a una metodolog\xc3\xada de dise\xc3\xb1o por contrato (DbC), en la que el dise\xc3\xb1o de un programa se expresa como aserciones incluidas en el c\xc3\xb3digo fuente, que describen el estado del programa en determinados momentos cr\xc3\xadticos. En DbC, las aserciones se consideran anotaciones de dise\xc3\xb1o - no l\xc3\xb3gica del programa - y como tal, su ejecuci\xc3\xb3n no deber\xc3\xada afectar al estado del programa. CQS es beneficioso para el DbC porque cualquier m\xc3\xa9todo que retorna valores (cualquier consulta) puede ser llamado por cualquier aserci\xc3\xb3n sin temor a modificar el estado del programa._NEWLINE_En t\xc3\xa9rminos te\xc3\xb3ricos, esto establece una medida de sensatez, por la que se puede razonar sobre el estado de un programa sin modificar al mismo tiempo ese estado. En t\xc3\xa9rminos pr\xc3\xa1cticos, CQS permite que todas las comprobaciones de aserciones puedan ser pasadas por alto en un sistema de trabajo para mejorar su rendimiento sin inadvertidamente modificar su comportamiento. CQS tambi\xc3\xa9n puede prevenir la aparici\xc3\xb3n de ciertos tipos de heisenbugs.\n_START_SECTION_\nImpacto m\xc3\xa1s amplio en la ingenier\xc3\xada de software\n_START_PARAGRAPH_\nIncluso m\xc3\xa1s all\xc3\xa1 de la conexi\xc3\xb3n con el dise\xc3\xb1o por contrato, los seguidores de CQS consideran que tiene un efecto de simplificaci\xc3\xb3n en un programa, haciendo que sus estados (a trav\xc3\xa9s de consultas) y cambios de estado (a trav\xc3\xa9s de comandos) sean m\xc3\xa1s comprensibles, tanto como el que la amonestaci\xc3\xb3n de Edsger Dijkstra contra sentencias goto hizo para el flujo de control._NEWLINE_CQS est\xc3\xa1 bien adaptado a la metodolog\xc3\xada orientada a objetos, pero tambi\xc3\xa9n se puede aplicar fuera de la programaci\xc3\xb3n orientada a objetos. No hay nada intr\xc3\xadnsecamente orientado a objetos sobre la separaci\xc3\xb3n de efectos colaterales y valores de retorno, y as\xc3\xad CQS puede aplicarse con provecho a cualquier paradigma de programaci\xc3\xb3n que requiere razonamiento sobre los efectos colaterales.\n_START_SECTION_\nCommand Query Responsibility Segregation\n_START_PARAGRAPH_\nCommand Query Responsibility Segregation (CQRS) aplica el principio CQS utilizando objetos Query y Command independientes para recuperar y modificar datos, respectivamente.\xe2\x80\x8b\xe2\x80\x8b\n_START_SECTION_\nInconvenientes\n_START_PARAGRAPH_\nCQS puede hacer que sea m\xc3\xa1s dif\xc3\xadcil la implementaci\xc3\xb3n de software reentrante y multihilo correctamente. Esto suele ocurrir cuando un patr\xc3\xb3n no-thread-safe se utiliza para implementar la command query separation._NEWLINE_Un simple ejemplo de un patr\xc3\xb3n que rompe CQS pero es \xc3\xbatil para software multi-hilo:_NEWLINE_private int x;public int increment_and_return_x(){_NEWLINE_  lock x;   // por alg\xc3\xban mecanismo_NEWLINE_  x = x + 1;_NEWLINE_  int x_copy = x;_NEWLINE_  unlock x; // por alg\xc3\xban mecanismo_NEWLINE_  return x_copy;}_NEWLINE_Un patr\xc3\xb3n CQS com\xc3\xban utilizable s\xc3\xb3lo en aplicaciones de un solo hilo:_NEWLINE_private int x;public int value(){_NEWLINE_  return x;}void increment(){_NEWLINE_  x = x + 1;}_NEWLINE__NEWLINE_Patr\xc3\xb3n CQS thread safe._NEWLINE_private int x;private int _x;public int value(){_NEWLINE_  return x;}void increment(){_NEWLINE_  lock _x;   // por alg\xc3\xban mecanismo_NEWLINE_  _x = _x + 1;_NEWLINE_  x = _x;_NEWLINE_  unlock _x; // por alg\xc3\xban mecanismo}_NEWLINE_Incluso en programas de un \xc3\xbanico hilo, a veces es mucho m\xc3\xa1s conveniente tener un m\xc3\xa9todo que es una consulta combinada con comando. Martin Fowler cita el m\xc3\xa9todo pop() de una pila como un ejemplo.\xe2\x80\x8b'