Gelegentlich stoße ich auf Methoden, bei denen ein Entwickler etwas zurückgibt, das für die Funktion nicht kritisch ist. Ich meine, wenn ich mir den Code ansehe, funktioniert er anscheinend genauso gut wie ein void
und nach einem Moment des Nachdenkens frage ich: "Warum?" Kommt Ihnen das bekannt vor?
Manchmal stimme ich zu, dass es am häufigsten besser ist, etwas wie a bool
oder zurückzugeben int
, als einfach a zu tun void
. Im Großen und Ganzen bin ich mir jedoch nicht sicher, was die Vor- und Nachteile angeht.
Je nach Situation kann das Zurückgeben von an int
den Aufrufer auf die Anzahl der Zeilen oder Objekte aufmerksam machen, die von der Methode betroffen sind (z. B. 5 in MSSQL gespeicherte Datensätze). Wenn eine Methode wie "InsertSomething" einen Booleschen Wert zurückgibt, kann die Methode so entworfen werden, dass sie true
bei Erfolg zurückgibt , ansonsten false
. Der Anrufer kann anhand dieser Informationen entscheiden, ob er handeln möchte oder nicht.
Auf der anderen Seite,
- Kann dies zu einem weniger eindeutigen Zweck eines Methodenaufrufs führen? Schlechte Codierung zwingt mich oft, den Methodeninhalt zu überprüfen. Wenn es etwas gibt, es sagt Ihnen , dass die Methode von einer Art ist Sie hat etwas mit dem zurückgegebenen Ergebnis zu tun.
- Ein anderes Problem wäre, wenn Ihnen die Implementierung der Methode unbekannt ist, was hat der Entwickler beschlossen, zurückzugeben, das nicht funktionskritisch ist? Natürlich können Sie es kommentieren.
- Der Rückgabewert muss verarbeitet werden, wenn die Verarbeitung in der schließenden Klammer der Methode beendet werden konnte.
- Was passiert unter der Haube? Wurde die aufgerufene Methode
false
aufgrund eines ausgelösten Fehlers abgerufen ? Oder hat es aufgrund des ausgewerteten Ergebnisses falsch zurückgegeben?
Welche Erfahrungen haben Sie damit gemacht? Wie würden Sie darauf reagieren?
quelle
void
mindestens zurückgeben, wird der Entwickler darüber informiert, dass der Rückgabewert der Methode nicht relevant ist. Es wird eine Aktion ausgeführt, anstatt einen Wert zu berechnen.Antworten:
Im Fall eines bool-Rückgabewerts, der den Erfolg oder Misserfolg einer Methode angibt, bevorzuge ich das
Try
-prefix-Paradigma, das in verschiedenen .NET-Methoden verwendet wird.Eine
void InsertRow()
Methode könnte beispielsweise eine Ausnahme auslösen, wenn bereits eine Zeile mit demselben Schlüssel vorhanden ist. Die Frage ist, ist es vernünftig anzunehmen, dass der Aufrufer sicherstellt, dass seine Zeile eindeutig ist, bevor er InsertRow aufruft? Wenn die Antwort nein ist, würde ich auch einebool TryInsertRow()
angeben, die false zurückgibt, wenn die Zeile bereits vorhanden ist. In anderen Fällen, z. B. bei Datenbankverbindungsfehlern, kann TryInsertRow dennoch eine Ausnahme auslösen, sofern die Aufrechterhaltung der Datenbankverbindung in der Verantwortung des Aufrufers liegt.quelle
IMHO, das einen "Statuscode" zurückgibt, stammt aus historischen Zeiten, bevor Ausnahmen in Sprachen mittlerer bis höherer Ebene wie C # üblich wurden. Heutzutage ist es besser, eine Ausnahme auszulösen, wenn ein unerwarteter Fehler den Erfolg Ihrer Methode verhinderte. Auf diese Weise bleibt der Fehler nicht unbemerkt, und der Anrufer kann ihn entsprechend behandeln. In diesen Fällen ist es also völlig in Ordnung, wenn eine Methode
void
anstelle eines Booleschen Statusflags oder eines ganzzahligen Statuscodes nichts (dh ) zurückgibt. (Natürlich sollte dokumentiert werden, welche Ausnahmen die Methode wann auslösen darf.)Wenn es sich hingegen um eine Funktion im engeren Sinne handelt, dh eine Berechnung auf der Grundlage von Eingabeparametern durchführt und erwartet wird, dass das Ergebnis dieser Berechnung zurückgegeben wird, liegt der Rückgabetyp auf der Hand.
Zwischen den beiden befindet sich ein grauer Bereich, in dem möglicherweise "zusätzliche" Informationen von der Methode zurückgegeben werden, wenn dies für ihre Aufrufer als nützlich erachtet wird. Wie in Ihrem Beispiel über die Anzahl der betroffenen Zeilen in einer Einfügung. Für eine Methode zum Einfügen eines Elements in eine assoziative Auflistung kann es hilfreich sein, den vorherigen Wert zurückzugeben, der diesem Schlüssel zugeordnet ist, sofern vorhanden. Solche Verwendungen können durch sorgfältige Analyse der (bekannten und erwarteten) Verwendungsszenarien einer API identifiziert werden.
quelle
Peters Antwort deckt die Ausnahmen gut ab. Weitere Überlegungen betreffen die Trennung von Befehlen und Abfragen
Nach dem CQS-Prinzip sollte eine Methode entweder ein Befehl oder eine Abfrage sein und nicht beides. Befehle sollten niemals einen Wert zurückgeben, nur den Status ändern, und Abfragen sollten nur den Status zurückgeben und nicht den Status ändern. Dies hält die Semantik sehr klar und hilft, den Code lesbarer und wartbarer zu machen.
Es gibt einige Fälle, in denen ein Verstoß gegen das CQS-Prinzip angezeigt ist. Hierbei handelt es sich normalerweise um Leistung oder Thread-Sicherheit.
quelle
Was auch immer der Weg ist, du wirst damit gehen. Es gibt keine Rückgabewerte für die zukünftige Verwendung (z. B. Funktionen geben immer true zurück). Dies ist eine schreckliche Verschwendung von Aufwand und macht den Code nicht klarer lesbar. Wenn Sie einen Rückgabewert haben, sollten Sie ihn immer verwenden, und um ihn verwenden zu können, sollten Sie mindestens 2 mögliche Rückgabewerte haben.
quelle
Ich habe viele leere Funktionen geschrieben. Aber da ich mich mit der ganzen Methode beschäftigt habe, Crack zu verketten, habe ich angefangen, dies zurückzugeben, anstatt es für ungültig zu erklären. Vielleicht kann jemand die Rückgabe ausnutzen, weil man es nicht schaffen kann, mit ungültig zu hocken. Und wenn sie nichts damit anfangen wollen, können sie es einfach ignorieren.
quelle
Ruby
irgendwann hineingekommen sind? Das hat mich in das Verketten von Methoden eingeführt.return Thing.Change1().Change2();
erwartet, dass sie sich ändertThing
und einen Verweis auf das Original zurückgibt , oder ob erwartet wird, dass sie einen Verweis auf eine neue Sache zurückgibt, die sich vom Original unterscheidet, während sie das System verlässt original unberührt.