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?
Antworten
Zu viele Anzeigen?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.
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.
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.
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).
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
Ähm, nicht ganz CPerkins. rads.stackoverflow.com/amzn/click/0321545613
1 Stimmen
Nun, es gibt eine bewährte Praxis, von der es aber auch begründete Ausnahmen gibt.
3 Stimmen
@CPerkins - Ja, die gibt es. Es ist klar in Microsofts eigenen .NET-Framework-Entwurfsrichtlinien festgelegt. Siehe RichardOD's Antwort für die Details.
0 Stimmen
Die Sprache, um die es hier geht, ist zwar C#, aber alle diese Leitlinien gelten für jede objektorientierte Sprache, die es gibt.
55 Stimmen
NUR wenn die Bedeutung "Ich kann die Ergebnisse nicht berechnen" ist, sollten Sie null zurückgeben. Null sollte nie die Semantik von "leer" haben, sondern nur "fehlend" oder "unbekannt". Weitere Einzelheiten finden Sie in meinem Artikel zu diesem Thema: blogs.msdn.com/ericlippert/archive/2009/05/14/
3 Stimmen
Bozho: "Jede" ist eine ganze Menge von Sprachen. Wie wäre es mit Common Lisp, wo die leere Liste genau gleich dem Nullwert ist :-)
1 Stimmen
Duplikat: stackoverflow.com/questions/1626597/
9 Stimmen
Eigentlich geht es bei dem "Duplikat" um Methoden, die ein Objekt zurückgeben, nicht um eine Sammlung. Es ist ein anderes Szenario mit anderen Antworten.
0 Stimmen
@EricLippert der Link scheint jetzt auf eine Blog-Verzeichnis-Seite umzuleiten. Kannst du den Link aktualisieren? Danke!
0 Stimmen
@TheMuffinMan: Sie können alte Kommentare leider nicht bearbeiten. Microsoft verschiebt ständig den Ort, an dem sich mein alter Blog befindet. Der neue Link ist learn.microsoft.com/de-us/archive/blogs/ericlippert/
0 Stimmen
Ich hatte diese Frage auch, aber ich denke, null ist nicht leer Sammlung und es kann Problem in einigen Codes verursachen.