Aller au contenu

ddd-ts-kit/application-command-query-separation

Identifiant d'architecture : application/command-query-separation (ajouté par ce plugin). Sévérité par défaut : warn dans recommended, error dans strict.

S'applique à : les fichiers sous application/queries/ d'un contexte, tests exclus.

Une requête répond et ne change jamais l'état : on peut alors la relancer, la mettre en cache et l'exécuter sur une réplique. Une requête qui enregistre est une commande avec une valeur de retour.

  • un appel de save, delete ou publish sur quelque chose que tient le gestionnaire (this.invoices.save(...), this.#bus.publish(...))

Incorrect :

export class SearchInvoicesHandler {
async execute(query: SearchInvoicesQuery): Promise<SearchInvoicesResult> {
await this.audit.save(query);
return this.reader.read(query);
}
}

Correct :

export class SearchInvoicesHandler {
async execute(query: SearchInvoicesQuery): Promise<SearchInvoicesResult> {
return this.reader.read(query);
}
}

Pragmatique par conception : la règle reconnaît des noms de méthodes sur les dépendances atteintes par this. Un Set local dont on appelle delete n'est pas signalé.

[{ "mutators": ["save", "delete", "publish"] }] remplace la liste des noms de méthodes.

rules."application/command-query-separation" à off dans ddd-ts-kit.config.json désactive la règle, et // ddd-ts-kit-disable-next-line application/command-query-separation -- <reason> désactive une ligne, exactement comme pour ddd-ts-kit check.

  • Une modification derrière un autre nom (upsert, record) demande l'option mutators.
  • Une dépendance passée en argument plutôt qu'injectée n'est pas suivie.
  • L'autre moitié du principe, une commande qui renvoie plus qu'un identifiant, est laissée à la revue.

Nouveau avec ce plugin : le checker de la CLI n'a pas d'équivalent, car la forme d'une classe demande un arbre syntaxique.