Unsere Teams führen folgende Diskussionen:
Angenommen, wir haben die folgenden zwei Methoden:
public Response Withdraw(int clubId, int terminalId,int cardId, string invoice, decimal amount);
public Response Withdraw(Club club, Terminal terminal,Card card, string invoice, decimal amount);
Was über das Kabel gesendet wird, sind nur die IDs.
Eine Seite sagt, dass die erste Methode richtig ist, weil wir nur die IDs von Terminal und Club haben und es klar sein sollte, dass wir nichts anderes haben, das ist mein Ansatz.
Die andere Seite sagt, dass die zweite Methode korrekt ist, weil sie flexibler ist.
Wir sind mit der Idee von Objektparametern vertraut, die andere Seite ist auch der Meinung, dass der Objektparameter die Objekte als Eigenschaften haben sollte.
Welches ist der richtige Ansatz?
Vielleicht gibt es einen dritten noch besseren Ansatz?
Antworten:
Die Antwort ist kontextabhängig.
Wenn vom Client erwartet wird, dass alle diese Objekte bereits verfügbar sind , würde ich die Objektparameter verwenden. Andernfalls sieht ihr Code komplizierter aus, als er sein muss. (ZB haben sie Anrufe wie
club.getId()
zum Beispiel.)Wenn dem Client nur die IDs leicht zur Verfügung stehen , ist der zweite Ansatz möglicherweise besser, da Sie möglicherweise nicht möchten, dass der Client alle diese Objekte zusammenstellen / laden muss, wenn Sie wirklich nur die IDs benötigen.
Eine Option besteht darin, beide Methoden bereitzustellen , damit der Client auswählen kann, welche verwendet werden soll (da dies Ihre API nicht überfüllt).
Im Allgemeinen sind die Objektparameter erweiterbarer, da Sie, wenn Sie in Zukunft ein anderes Datenelement für die Arbeit benötigen, keine andere Methode einführen müssen, die diese zusätzlichen Informationen verwendet.
Schließlich sollten Ihre Methodensignaturen nicht durch die Besonderheiten der Methode bestimmt werden (in Ihrem Fall, was genau über den Draht geht). Die API sollte abstrakt sinnvoll sein, damit Sie nicht geschraubt werden, wenn sich die Implementierung ändert.
quelle
Der erste Ansatz weist auf primitive Besessenheit hin . Da Sie Ints und Strings weitergeben, kann der Programmierer sehr leicht einen Fehler machen (z. B. Übergabe einer clubId an den Parameter terminalId). Dies führt dazu, dass Fehler schwer zu finden sind.
Im zweiten Beispiel ist es unmöglich, einen Club zu passieren, wenn ein Terminal erwartet wird. Dies würde zu einem Fehler bei der Kompilierung führen.
Trotzdem würde ich immer noch schauen
string invoice
. Ist eine Rechnung wirklich eine Zeichenfolge? Was heißtamount
das Dies ist eher ein Geldwert.Sie haben in Ihrer Frage erwähnt, "was über das Kabel gesendet wird, sind nur die IDs." Dies ist korrekt, aber lassen Sie diese Anforderung Ihre Domain nicht trüben.
Die beste Erklärung, die ich für diesen Ansatz gesehen habe, war in Regel 3 der Objektkalisthenik :
quelle
Es gibt keine richtige Antwort auf diese Frage. Jede Option könnte für den Job geeignet sein. Na ja, fast auf jeden Fall hat das Rechnungsargument eine Furche auf meiner Stirn aufgewirbelt. Ich habe keine Ahnung, was das vom Lesen des Codes ist.
Wenn Sie eine ID senden, müssen beide Systeme eng an das gekoppelt sein, was dies darstellt. ClubID ist der Schlüssel in der Clubtabelle. Mehr auf den Punkt gebracht, müssen sowohl Anrufer als auch Angerufene vereinbaren, wie die Clubtabelle heißt und in welcher Datenbank sie sich befindet. Wenn Sie diese Einschränkung nicht auferlegen möchten oder können, übergeben Sie das Objekt mit einer allgemeinen Beschreibung. native, serialisiert, xml, name = value was auch immer, eine INI-Datei :)
Das, wie Sie identifiziert haben, kostet Sie "über den Draht". Das zu vermeiden, indem Sie nur die Kennung senden, kostet Sie woanders. Welches Sie jetzt (oder später) am wenigsten verletzt, ist der Indikator für gut gegen schlecht.
quelle