Denken Sie an ein Beispiel wie eine Dienstleistung/Funktion, die einen Kunden auscheckt, es gibt viele Schritte: Server sollte zum Beispiel Inventar prüfen, Betrug überprüfen, die Kreditkarte belasten, Inventar abziehen, den Kauf schließen, per E-Mail versenden Kunde, benachrichtigen Sie das Backend/Handler/Warehouse und geben Sie dann die http-Anfrage zurück. In einer objektorientierten Sprache würde ich dieses Problem auf eine Art angehen, indem ich ein Dienstobjekt erstelle und diese Schritte synchron und in der Reihenfolge ausführen lasse, wenn etwas schief läuft (vielleicht sogar eine Zustandsmaschine).Wie können funktionale Sprachen wie Elixir große Ketten von Prozessen handhaben?
Wenn ich jedoch daran denke, wie ich dieses Problem in einer Sprache wie Elixir angehen würde, ist die einzige Lösung, die ich mir vorstellen kann, eine lange Kette von Rohren - die sich in der Elixir-Welt wie ein Anti-Muster anfühlt , besonders wenn Sie Verzweigungen in Betracht ziehen.
Der zweite Gedanke, den ich hatte, war, dass jeder Schritt seine eigene Funktion ist (die sich idiomatisch anfühlt), und es bedarf eines zusätzlichen Arguments über den Zustand des Kaufs. In diesem Fall könnte die validate_fraud
Aktion dann charge_credit_card
mit der {purchase, fraud_passed}
Information anrufen und dann würde charge_credit_card
dann die nächste in der Zeile aufrufen, wenn es fertig war. Dies würde jedoch bedeuten, dass jede Funktion ihren Platz in einer Kette kennen muss, die sich wiederum wie ein Geruch anfühlt (außerdem müsste jede Funktion eine Logik haben, um mit den verschiedenen ankommenden "Zuständen" umgehen zu können).
Was ist der idiomatische Weg in Elixir, mit einer Situation umzugehen, die die OO-Welt mit einem Serviceobjekt lösen würde?
Eine Sache zu betrachten ist, dass ein "Service-Objekt" eine Menge Informationen in ein Stück Code koppelt. Das sollte dir auch nach einem Anti-Pattern riechen. –
@OnorioCatenacci "Dienstobjekt" kann alle zehn Prüfer an verschiedene Module delegieren, was zu 12 Codezeilen führt, selbst wenn jeder "Delegierte" mit seiner eigenen Leitung versehen ist. – mudasobwa
Ein schöner Punkt. Es klang nicht so, als ob er es so meinte. –