485 Stimmen

Ist es besser, null oder eine leere Sammlung zurückzugeben?

Das ist eine Art eine allgemeine Frage (aber ich bin mit C#), was ist der beste Weg (Best Practice), geben Sie null oder leere Sammlung für eine Methode, die eine Sammlung als Rückgabetyp hat?

0 Stimmen

Dies ist eine subjektive Frage, bei der es auf beiden Seiten leidenschaftliche Gläubige gibt. Es gibt keine allgemein anerkannte "beste Praxis".

5 Stimmen

1 Stimmen

Nun, es gibt eine bewährte Praxis, von der es aber auch begründete Ausnahmen gibt.

4voto

Larry Watanabe Punkte 9916

Das hängt von der jeweiligen Situation ab. Wenn es sich um einen Spezialfall handelt, wird null zurückgegeben. Wenn die Funktion nur zufällig eine leere Sammlung zurückgibt, dann ist es natürlich in Ordnung, diese zurückzugeben. Die Rückgabe einer leeren Sammlung als Sonderfall aufgrund ungültiger Parameter oder aus anderen Gründen ist jedoch KEINE gute Idee, da sie einen Sonderfall verschleiert.

In diesem Fall ziehe ich es in der Regel vor, eine Ausnahme auszulösen, um sicherzustellen, dass sie WIRKLICH nicht ignoriert wird :)

Die Behauptung, dass der Code dadurch robuster wird (indem eine leere Sammlung zurückgegeben wird), da die Null-Bedingung nicht behandelt werden muss, ist schlecht, da damit lediglich ein Problem maskiert wird, das vom aufrufenden Code behandelt werden sollte.

4voto

manuel aldana Punkte 14242

Denken Sie immer zugunsten Ihrer Kunden (die Ihre API verwenden):

Die Rückgabe von 'null' führt sehr oft zu Problemen mit Clients, die Null-Prüfungen nicht korrekt handhaben, was eine NullPointerException während der Laufzeit verursacht. Ich habe Fälle gesehen, in denen eine solche fehlende Null-Prüfung zu einem vorrangigen Produktionsproblem führte (ein Client verwendete foreach(...) auf einen Null-Wert). Beim Testen trat das Problem nicht auf, weil die Daten, mit denen gearbeitet wurde, etwas anders waren.

4voto

ceving Punkte 19595

Ich nenne das meinen Milliarden-Dollar-Fehler Zu dieser Zeit entwarf ich das erste umfassende Typsystem für Referenzen in einer objektorientierten Sprache. Mein Ziel war es, sicherzustellen, dass die Verwendung von Referenzen absolut sicher ist, wobei die Überprüfung automatisch durch den Compiler erfolgt. Aber ich konnte der Versuchung nicht widerstehen, eine Null-Referenz einzufügen, einfach weil sie so einfach zu implementieren war. Dies hat zu unzähligen Fehlern, Schwachstellen und Systemabstürzen geführt, die in den letzten vierzig Jahren wahrscheinlich eine Milliarde Dollar an Schmerz und Schaden verursacht haben. - Tony Hoare, Erfinder von ALGOL W.

Ver aquí für einen ausführlichen Shitstorm über null im Allgemeinen. Ich stimme nicht mit der Aussage überein, dass undefined ist eine weitere null aber es ist trotzdem lesenswert. Und es erklärt, warum Sie vermeiden sollten null überhaupt und nicht nur in dem von Ihnen angesprochenen Fall. Das Wesentliche ist, dass null ist in jeder Sprache ein Spezialfall. Sie müssen darüber nachdenken null als eine Ausnahme. undefined anders ist, dass Code, der sich mit undefiniertem Verhalten beschäftigt, in den meisten Fällen nur ein Fehler ist. C und die meisten anderen Sprachen haben auch undefiniertes Verhalten, aber die meisten von ihnen haben keinen Bezeichner dafür in der Sprache.

3voto

dthal Punkte 511

Unter dem Gesichtspunkt der Beherrschung der Komplexität, einem vorrangigen Ziel der Softwareentwicklung, wollen wir vermeiden, dass sich unnötig zyklomatische Komplexität für die Kunden einer API. Die Rückgabe einer Null an den Kunden ist gleichbedeutend mit der Rückgabe der zyklomatischen Komplexitätskosten eines anderen Codezweigs.

(Dies entspricht einer Belastung durch Einheitstests. Sie müssten einen Test für den Null-Rückgabefall schreiben, zusätzlich zum Rückgabefall der leeren Sammlung).

2voto

mothis Punkte 213

Leere Sammlung. Wenn Sie C# verwenden, wird davon ausgegangen, dass die Maximierung der Systemressourcen nicht wesentlich ist. Die Rückgabe von Empty Collection ist zwar weniger effizient, aber für die beteiligten Programmierer viel bequemer (aus dem Grund, den Will oben genannt hat).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X