Supongamos que tenemos un servicio que llama un proceso comercial. Este proceso llamará a la capa de datos para crear un objeto de tipo A en la base de datos.
Luego necesitamos llamar nuevamente a otra clase de la capa de datos para crear una instancia de tipo B en la base de datos. Necesitamos pasar alguna información sobre A para una clave foránea.
En el primer método creamos un objeto (modificar estado) y devolvemos su ID (consulta) en un solo método.
En el segundo método tenemos dos métodos, uno (createA) para guardar y el otro (getId) para la consulta.
public void FirstMethod(Info info)
{
var id = firstRepository.createA(info);
secondRepository.createB(id);
}
public void SecondMethod(Info info)
{
firstRepository.createA(info);
var key = firstRepository.getID(info);
secondRepository.createB(key);
}
Según tengo entendido, el segundo método sigue la separación de consulta de comando más completamente. Pero me parece un desperdicio y contra intuitivo consultar la base de datos para obtener el objeto que acabamos de crear.
¿Cómo conciliar CQS con tal escenario?
¿Solo el segundo método sigue CQS y si es así, es preferible usarlo en este caso?
fuente
Respuestas:
CQS es una guía más que una regla absoluta. Consulte el artículo wiki para ver ejemplos de actividades que son imposibles bajo CQS estricto.
Sin embargo, en este caso, si desea mantener CQS, puede crear la ID en el lado del cliente (como un GUID), o el cliente puede solicitar una ID del sistema antes de crear cualquier objeto, lo que se siente más limpio para yo que crear el objeto y luego consultarlo (pero es más difícil que simplemente usar una columna de identidad).
Personalmente, solo devolvería la identificación y la llamaría una de esas situaciones en las que CQS no es una buena opción.
Otro buen artículo con ejemplos: Martin Fowler
fuente
Si sigues una metodología y parece llevarte por malos caminos, debes reevaluarla.
Veo que el identificador de un objeto recién creado es algo válido para tener como parámetro de retorno, no solo es conveniente, sino que también es "bueno", ya que puede ver que el código es mejor cuando lo hace.
En cualquier caso, no estoy familiarizado con la "separación de consultas de comandos", pero dudo mucho que no permita que los comandos devuelvan información sobre la ejecución del comando, y si lo hace, simplemente la basura: el éxito / fracaso siempre está ahí, y lo hago No piense que "su objeto fue creado OK" de "su objeto fue creado OK y su id es xxx" para ser muy diferente.
fuente
Solo el segundo método sigue CQS.
Considero que CQS es una guía para fomentar las buenas prácticas de codificación. Haga uso de buenas prácticas de codificación durante el desarrollo, y si luego descubre que este método contiene código de recursos críticos, aún puede optimizarlo.
La optimización temprana es la raíz de todo mal :)
fuente