¿La separación de comando / consulta se aplica a un método que crea un objeto y devuelve su ID?

12

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?

Gilles
fuente
2
si A y B se crean junto con cualquier frecuencia, probablemente haría que un procedimiento almacenado creara ambos a la vez, y luego se elimina el potencial de tener una B creada primero o una A creada sin una B si eso es un problema.
Ryathal
Entrando tarde en el juego para ofrecer la opción de usar un parámetro de salida. ¡Técnicamente no es un valor de retorno! ;)

Respuestas:

13

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

Misko
fuente
3

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.

alex
fuente
-1

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 :)

Cheesus dice que dejes de disparar
fuente
¿Qué es particularmente bueno en el segundo método?
CheatEx
No dije que el segundo método es "bueno". Dije que sigue el paradigma CQS. Si no sigue CQS, supongo que el segundo método no es bueno para usted. Si desea saber por qué algunas personas intentan seguir CQS, consulte http://en.wikipedia.org/wiki/Command-query_separation
cheesus dice que deje de disparar mods el
Usted dijo que CQS está fomentando buenas prácticas de codificación, si es cierto, deberíamos observar algún tipo de "bondad" en el segundo método. ¿Dónde está?
CheatEx
Aparentemente no leíste el enlace que proporcioné. Frase clave de CQS: Hacer una pregunta no debería cambiar la respuesta . En su primer método, tiene un método ('createA') que proporciona una 'respuesta', pero cambia la respuesta cada vez que pregunta. En el segundo método no tienes eso, esta es la 'bondad' en él. Para ser claros: no soy un purista de CQS, no lo sigo siempre.
cheesus dice que dejen de disparar mods el