Ich habe in letzter Zeit über die Dinge nachgedacht, die ich von den Methoden zurückgebe, und ich habe bemerkt, dass es vier verschiedene Dinge gibt, die ich zurückgebe, wenn die Methode fehlschlägt.
Was mich daran stört, ist, dass mein Code in dieser Hinsicht nicht sehr konsistent ist, also wollte ich nach Ihren "Best Practices" fragen.
Stellen wir uns also eine Methode vor, die Foo übernimmt und eine Liste von Bar zurückgibt:
%Vor%Oder um es allgemeiner zu halten:
%Vor%Die Frage ist, was Sie über welche Art von Versagen zurückgeben. Die Optionen wären:
Ich hasse Option 4 wirklich, also bin ich hauptsächlich interessiert zu hören, wenn du die anderen 3 Optionen verwendest und warum
Ich würde je nach Art des Fehlers zwischen einer leeren Liste und einer Ausnahme wählen.
z. B.
Wenn Ihre Datenbank keine Verbindung herstellen konnte - Ausnahme.
Wenn Ihre Abfrage keine Ergebnisse zurückgegeben hat - leere Liste.
Es hängt davon ab, was Sie mit "Versagen" meinen.
Wenn es ein Fehler in dem Sinne ist, dass etwas Unerwartetes passiert ist, dann würde ich eine Ausnahme auslösen. Vielleicht eine Argumentausnahme für den Fall, dass der Parameter falsch war, eine IOException, wenn Sie nicht aus der Datei lesen konnten, und so weiter.
Wenn der Fehler darin besteht, dass für den angegebenen Parameterwert keine Elemente gefunden werden konnten, gebe ich eine leere Liste zurück. Falls Sie ein Objekt zurückgeben, das keine Sammlung ist, würde ich null zurückgeben.
Ich gebe nie spezielle Ergebniscodes zurück, wie -1 im Fehlerfall. Ich mag es wirklich nicht. Menschen neigen dazu, Codes zu vergessen, sie ändern sich im Laufe der Zeit, und Sie erhalten schlecht erhaltene Anweisungen, wenn Sie nach diesen Ergebniscodes suchen, und so weiter.
Wenn es einen erwarteten Ausnahmefall gibt, würde ich eine Ausnahme auslösen.
Wenn ich nach Bar
gesucht hätte und sie nicht gefunden hätte, würde ich null zurückgeben.
Wenn ich nach List<Bar>
gesucht hätte und keine gefunden hätte, würde ich eine leere List<Bar>
zurückgeben.
Wenn das Auffinden von null sehr häufig war und es Sinn machte, es zu verwenden, würde ich das Null-Objekt-Muster
Also ... Ich denke, es ist fair zu sagen, dass ich jetzt mit Ihren derzeitigen Ansätzen einverstanden bin. Ich würde nur sicherstellen, dass ich in jedem Projekt konsequent war und nicht Mix & amp; passen Sie verschiedene Ansätze mit verschiedenen Fällen an.
Ich würde es auf eine Ausnahme oder leere Rückkehrliste reduzieren, um es so einfach wie möglich zu halten
Sie sollten dies zurückgeben, wenn der Vorgang zum Füllen der Liste korrekt und ohne offensichtlichen Fehler abgeschlossen wurde, aber keine Ergebnisse zurückgegeben werden - da dies IMO impliziert. Dies bedeutet auch, dass Code, der von der Rückgabe abhängig ist, die (zum Beispiel) die Liste durchläuft, keine spezielle Behandlung benötigt.
IMO-Ausnahmen sollten ausgelöst werden, wenn in der Funktion ein Fehler aufgetreten ist - z. Datei kann nicht geöffnet werden, Verbindung kann nicht hergestellt werden usw. Berechnung hat Müll zurückgegeben - Dies unterscheidet sich von "keine Ergebnisse zurückgegeben"
Wenn keine Elemente gefunden werden, geben Sie eine leere Liste zurück. Dies ist ein besonderer Fall des Null-Objekts -Musters. Es hilft, alle Fälle konsistent zu behandeln, was bedeutet, dass Clients nicht prüfen müssen, ob der Wert null ist. Oder, noch schlimmer, wenn sie nicht überprüfen, wird eine Null-Zeiger-Ausnahme ausgelöst und ein glückliches Debugging durchgeführt, um herauszufinden, was die Ursache ist. Gib nur null zurück, wenn du einen sehr guten Grund dafür hast.
Update : Martin Fowler beschreibt eine bessere Alternative zur Rückgabe von null: Ссылка
>Aber wirf eine Exception aus, wenn sich deine Methode nicht so verhält, wie sie sollte, Datenbank Exceptions, Stream Exceptions, etc.
Wenn Ihre Geschäftslogik abhängig davon, was Method zurückgibt, variieren kann und es somit für Ihre Methode in Ordnung ist, eine leere Liste zurückzugeben, gehen Sie mit 1) fort.
Eine Ausnahme auslösen, wenn Ihre Geschäftslogik keine leere Liste haben soll. Wenn es wegen falsch übergebenen "Foo etwas" geht, geh mit Assert oder logischer Ausnahme. Wenn es wegen externer Datenproblem wie Datenbankverbindung oder Dateisystemfehler dann ggo mit Laufzeitausnahme ist.
Geh nie mit 4) es wird sehr schwer sein, dieses Verhalten später zu verstehen.
Fall 1:
Wenn Methode ein Problem entdeckt, was nicht erwartet wird, sollte es eine Ausnahme auslösen. Der aufrufende Code sollte auf Ausnahme
achtenFall 2:
Alle anderen Fälle Methode sollte Null / leer / Liste mit Werten zurückgeben. Die aufrufende Funktion sollte auf null und leer achten.
Ich bin mir nicht sicher, ob diese allgemein angewendet werden können, aber ich fühle mich ziemlich wohl mit folgenden Regeln:
Ich würde nur dann eine Exception auslösen, wenn etwas mit dem, was ich versuche, in Konflikt gerät, wie zB falsche Eingabeparameter, Datenbankfehler usw.
Normalerweise gebe ich in den meisten anderen Fällen eine Null zurück, weil die Suche nach Nullen natürlich ist, aber ich würde eine leere Liste zurückgeben, wenn die Daten, die sie enthalten sollen, einfach leer sind.
Hier sind zwei Fragen zu beantworten: