Kann WordPress CQRS?

TL;DR: Jop. Außerdem actions und filter als „Bus“ benutzen. Danke. Tschööös.

CQRS in a nutshell

CQRS ist keine große Magie und vor allem nicht schwer. Es geht lediglich um „Command Query Responsibility Segregation“ was so viel heißt wie „Befehle und Abfragen sind scharf voneinander getrennt“. Im gleichen Atemzug wird immer von Commands und Handler als Klassen gesprochen, doch das ist schon die Anwendung von CQRS. Wichtig ist einzig und allein die Trennung.

Dinge (also Plugins und Themes) sollten nicht so aussehen:

function mach_et( $text ) {
$ids = get_posts( [ 'fields' => 'ids', 'post_type' => 'foo', 'posts_per_page' => -1 ] );
$daten = get_posts( [ 'post_type' => 'bar', 'posts_per_page' => -1 ] );

$pos = 0;
foreach ( $daten as $ding ) {
$mail = wp_mail(
get_post_meta( $ding->ID, 'mail', true ),
'Clickbait',
$text
);

update_post_meta( $ding->ID, 'last_mail', time() );
}
}

Ganz klar sind die Abfrage von Daten und das Anwenden dieser vermischt. Unschön, denn wir wissen genau: Eines Tages brauche ich genau diese Daten nochmal woanders für andere Sachen.
Oder: Auch bei anderen Mails, möchte ich „last_mail“ aktualisieren.

So geht CQRS

Egal ob mit Klassen, Funktionen oder in verschiedenen Dateien: Segregation ist das Zauberwort. Also trennen wir die Abfrage und die Anwendung:

// Query / Abfrage
function gib_her() {
$ids = get_posts( [ 'fields' => 'ids', 'post_type' => 'foo', 'posts_per_page' => -1 ] );
$daten = get_posts( [ 'post_type' => 'bar', 'posts_per_page' => -1 ] );
}

// Command/Aufgabe
function sende_ding_mail( $id, $betreff, $text ) {
wp_mail(
get_post_meta( $id, 'mail', true ),
$betreff,
$text
);

update_post_meta( $id, 'last_mail', time() );
}

// Quintessenz
function mach_et( $text ) {
foreach ( gib_her() as $ding ) {
sende_ding_mail( $ding->ID, 'Clickbait', $text );
}
}

Schon viel angenehmer und näher an den Ansprüchen von guter Software als zuvor. Die Abfrage kann woanders wiederverwendet werden und für sich einzeln angepasst, falls sich etwas an der Datenhaltung ändert. Der ausführende Part ist viel überschaubarer und insgesamt macht jede Funktion nur eine Sache. Es ist wie das Single-Responsibility-Prinzip oder CQS, welche wir alle seit 1985 kennen (hust) und unsere Arbeitswelt um einiges leichter macht. Doch es geht noch besser.

CQRS on Rails

In den letzten 30 Jahren wurde CQS mit anderen Prinzipien des Softwareentwurfs vermischt und wurde so zum Allheilmittel für sehr flexible (frameworkagnostische) Anwendungen – meiner Meinung nach. Was hier viel zu einfach klingt wird es verrückt und komplex durch

  • Bus-Systeme (inkl. Middleware)
  • Event-Sourcing
  • Caching
  • Injector

Die jeweils für sich wieder Vorteile mitbringen. Wer also woanders über CQRS liest und von Informationen erschlagen wird, dann weil die obigen Themen unnötig mit rein gemischt wurden. Das passiert hier Schrittweise, so dass der Kern von SRP aka CQS aka CQRS deutlich wird. Auf diesem soliden Basiswissen wird das Ganze in den nächsten Wochen vertieft.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.