Sollen Funktionen null oder ein leeres Objekt zurückgeben?
Was ist der best-practice -, wenn die Rückgabe von Daten von Funktionen. Ist es besser, um wieder eine Null oder ein leeres Objekt? Und warum sollte man das tun, den einen über den anderen?
Bedenken Sie:
public UserEntity GetUserById(Guid userId)
{
//Imagine some code here to access database.....
//Check if data was returned and return a null if none found
if (!DataExists)
return null;
//Should I be doing this here instead?
//return new UserEntity();
else
return existingUserEntity;
}
Können vorgeben, dass es sein würde, gültige Fälle, in diesem Programm, dass es keine Benutzer-Informationen in die Datenbank mit diesem GUID. Ich könnte mir vorstellen, dass es nicht angebracht wäre, eine Ausnahme in diesem Fall?? Auch ich bin unter dem Eindruck, dass die Ausnahmebehandlung kann die Leistung beeinträchtigen.
Kommentare dem Thema
Ich denke, du meinst
if (!DataExists)
. Dies ist eine architektonische Frage und ist vollkommen angemessen. Die OP ' s Frage ist gültig, unabhängig von der business-problem zu lösen versuchen.
Diese Frage wurde bereits hinreichend beantwortet. Ich denke, das ist eine sehr interessante Frage.
'getUser()' null zurückgeben sollte. 'getCurrentUserInfo()' oder 'getCurrentPermissions()', OTOH, wäre aufschlussreich Fragen -- Sie sollten zurückkehren a nicht-null-Antwort-Objekt unabhängig davon, wer bzw. ob jemand angemeldet ist.
Nein @Bergi, das andere ist eine doppelte. Mir wurde zuerst gefragt, im Oktober, die andere wurde gebeten, 3 zwei Jahre später im Dezember. Plus die anderen Gespräche über eine Sammlung, die ist etwas anders.
InformationsquelleAutor der Frage 7wp | 2009-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Null zurückgeben ist in der Regel die beste Idee, wenn Sie beabsichtigen, um anzuzeigen, dass keine Daten verfügbar sind.
Ein leeres Objekt impliziert die Daten zurückgegeben wurde, in der Erwägung, dass die Rückgabe von null-das zeigt eindeutig, dass nichts zurückgegeben wurde.
Zusätzlich, Rückgabe eines null-Ergebnis ein null-Ausnahme, wenn Sie, versuchen Zugriff auf die Mitglieder in das Objekt, die nützlich sein können für die Hervorhebung der fehlerhafte code - Versuch, den Zugang eines Mitglieds nichts, macht keinen Sinn. Zugriff auf Mitglieder ein leeres Objekt nicht Fehler Bedeutung Fehler unentdeckt bleiben.
InformationsquelleAutor der Antwort ljs
Es hängt davon ab, was am meisten Sinn macht, für Ihren Fall.
Macht es Sinn, auf null zurück, z.B. "no such user existiert"?
Oder macht es Sinn, erstellen Sie ein Standard-Benutzer? Dies macht am meisten Sinn, wenn man sicher davon ausgehen, dass, wenn ein Benutzer NICHT vorhanden ist, wird der aufrufende code ist beabsichtigt, für einen zu existieren, wenn Sie danach Fragen.
Oder ist es sinnvoll, eine exception werfen (a la "FileNotFound"), wenn der aufrufende code ist eine anspruchsvolle Aufgabe, die ein Benutzer mit einer ungültigen ID?
Jedoch - von einer Trennung der Anliegen/SRP Sicht, die ersten beiden sind korrekt. Und technisch die erste ist die richtige (aber nur um ein Haar) - GetUserById sollte nur die Verantwortung für eine Sache - die user. Umgang mit seinen eigenen "Benutzer nicht vorhanden" case durch Rücksendung etwas anderes sein könnte, einen Verstoß gegen SRP. Die Trennung in eine andere check -
bool DoesUserExist(id)
wäre angemessen, wenn Sie sich entschieden haben, um eine exception zu werfen.Basiert auf umfangreichen Kommentaren unten: wenn eine API-level-design-Frage, diese Methode könnte man Analog zu "Datei öffnen" oder "ReadEntireFile". Wir "öffnen" ein Benutzer aus irgendeinem repository und feuchtigkeitsspendende das Objekt aus der resultierenden Daten. Eine Ausnahme könnte angemessen in diesem Fall. Könnte es nicht sein, aber es könnte sein.
Alle Ansätze sind akzeptabel - es kommt nur darauf an, basierend auf den größeren Kontext der API/Anwendung.
InformationsquelleAutor der Antwort Rex M
Persönlich benutze ich NULL. Es macht klar, dass es keine Daten zurückgeben. Aber es gibt Fälle, wenn eine Null-Objekt kann nützlich sein.
InformationsquelleAutor der Antwort Fernando
Wenn Ihr Rückgabetyp ist ein array, dann gibt ein leeres array zurück, ansonsten null zurück.
InformationsquelleAutor der Antwort Darin Dimitrov
Sollten Sie eine exception werfen (nur), wenn ein bestimmter Vertrag ist gebrochen.
In deinem konkreten Beispiel Fragen, für eine UserEntity basierend auf einem bekannten Id, es hängt von der Tatsache, ob die fehlenden (gelöschten) Nutzer sind eine zu erwartende Fall. Wenn ja, dann zurück
null
aber wenn es nicht der erwartete Fall dann eine Ausnahme werfen.Beachten Sie, dass, wenn die Funktion aufgerufen wurde
UserEntity GetUserByName(string name)
wäre es wohl nicht werfen-aber null zurück. In beiden Fällen ist die Rückgabe eine leere UserEntity wäre wenig hilfreich.Für strings, arrays und Auflistungen die situation ist meist anders. Ich erinnere mich an einige guideline form der MS, die Methoden annehmen sollte
null
als 'leer' - Liste, aber die Rückkehr Sammlungen von null-Länge eher alsnull
. Das gleiche für Streicher. Beachten Sie, dass Sie erklären können, leere arrays:int[] arr = new int[0];
InformationsquelleAutor der Antwort Henk Holterman
Dies ist eine business-Frage, abhängig davon, ob die Existenz eines Benutzers mit einer bestimmten Guid Id ist eine erwartete normale Anwendungsfall für diese Funktion, oder ist es eine Anomalie, die verhindert, dass die Anwendung erfolgreich abschließen, was Funktion diese Methode liefert das user-Objekt...
Wenn es eine "Ausnahme", dass das fehlen von ein Benutzer mit dieser Id wird verhindert, dass die Anwendung erfolgreich abschließen, was auch immer Funktion, die es tun, (Sagen wir erstellen eine Rechnung für einen Kunden haben wir geliefert, Produkt,...), dann ist diese situation lösen eine ArgumentException (oder einige andere benutzerdefinierte Ausnahme).
Wenn eine fehlende user ok ist, (einer der möglichen normalen Ergebnissen der Aufruf dieser Funktion) dann wieder eine null....
EDIT: (zur Adresse, wie von Adam in einer anderen Antwort)
Wenn die Anwendung enthält mehrere Geschäftsprozesse eine oder mehrere von denen der Benutzer, um erfolgreich abgeschlossen zu werden, und eine oder mehrere, die erfolgreich abgeschlossen werden kann, ohne dass der Benutzer dann die exception geworfen werden sollte weiter oben in der Aufrufliste, näher an, wo die business-Prozesse erfordern, die ein Benutzer aufrufen dieser thread der Ausführung. Methoden zwischen dieser Methode und diesem Punkt (wo die exception geworfen wird) soll nur kommunizieren, dass kein Benutzer vorhanden ist (null, boolean, was auch immer - dies ist eine Implementierung detail).
Aber wenn alle Prozesse innerhalb der Anwendung erfordern ein Benutzer, würde ich immer noch die Ausnahmen, die in dieser Methode...
InformationsquelleAutor der Antwort Charles Bretana
Ich persönlich würde null zurückgeben, weil das ist, wie ich erwarten würde, dass die DAL/Repository-Ebene zu handeln.
Wenn es nicht vorhanden ist, nicht wieder alles, was verstanden werden könnte als erfolgreich abrufen eines Objekts
null
funktioniert wunderbar hier.Die wichtigste Sache ist, werden gleichmäßig über Ihre DAL/Repos-Schicht, so dass Sie nicht bekommen, verwirrt, wie man es benutzt.
InformationsquelleAutor der Antwort Alex Moore
Noch ein weiterer Ansatz besteht in der übergabe einer callback-Objekt oder delegieren Sie arbeiten, die auf den Wert. Wenn ein Wert nicht gefunden wird, wird der callback nicht aufgerufen.
Dies funktioniert gut, wenn Sie vermeiden wollen null prüft alle über Ihren code, und wenn Sie nicht finden, den Wert nicht zu einer Fehlermeldung. Sie können auch einen Rückruf, wenn keine Gegenstände gefunden werden, wenn Sie benötigen eine spezielle Verarbeitung.
Den gleichen Ansatz, der sich auf ein einzelnes Objekt Aussehen könnte:
Aus einer design-Perspektive, ich mag diesen Ansatz, hat aber den Nachteil, dass die call site sperriger in Sprachen, die nicht bereitwillig Unterstützung first-class-Funktionen.
InformationsquelleAutor der Antwort Marc
Tendiere ich zu
return null
wenn die Objekt-id nicht vorhanden, wenn es vorher nicht bekannt, ob es sollte vorhanden.throw
wenn die Objekt-id nicht existieren, wenn es sollte vorhanden.Ich unterscheide diese beiden Szenarien, die mit diesen drei Arten von Methoden.
Erstens:
Zweite:
Dritte:
InformationsquelleAutor der Antwort Johann Gerell
Verwenden wir CSLA.NET und es ist der Ansicht, dass eine fehlerhafte Daten abrufen zurückgeben sollte, ein "leeres" Objekt. Das ist eigentlich ganz ärgerlich, wie es die Anforderungen der Konvention zu überprüfen, ob
obj.IsNew
rathern alsobj == null
.Als Vorherige poster erwähnt, null-Werte zurückgegeben werden Ursache code fehlschlägt sofort, die Verringerung der Wahrscheinlichkeit von stealth-Probleme, die von leeren Objekten.
Persönlich, ich denke
null
ist mehr elegant.Es ist ein sehr häufiger Fall, und ich bin überrascht, dass die Leute hier scheinen davon überrascht: in jede web-Anwendung, die Daten werden oft geholt, mit einem querystring-parameter, der offensichtlich verstümmelt", so die Forderung, dass die Entwickler behandeln Fälle von "nicht gefunden".
Könnte man damit umgehen, indem:
...aber das ist ein extra-Aufruf an die Datenbank jedes mal, das kann ein Problem sein, auf high-traffic-Seiten. In der Erwägung, dass:
...nur ein Aufruf.
InformationsquelleAutor der Antwort Keith Williams
Ich lieber
null
, da es kompatibel mit den null-coalescing operator (??
).InformationsquelleAutor der Antwort Andrew Medico
Ich würde sagen, null zurückgeben, statt ein leeres Objekt.
Aber die spezifische Instanz, die Sie hier erwähnt haben,
Sie sind auf der Suche für einen Benutzer, indem die Benutzer-id, die eine Art
der Schlüssel zu diesem Benutzer, in diesem Fall würde ich wohl wollen
um eine exception werfen, wenn keine user-Instanz Instanz
gefunden.
Dies ist die Regel, die ich Folgen in der Regel:
ObjectNotFoundException werfen.
null zurückgeben.
Rückgabe einer leeren collection.
InformationsquelleAutor der Antwort Partha Choudhury
Es variiert je nach Kontext, aber ich werde in der Regel null zurückgeben, wenn ich mich für ein bestimmtes Objekt (wie in deinem Beispiel) und liefert eine leere Kollektion wenn ich bin auf der Suche nach einer Menge von Objekten, aber es gibt keine.
Wenn Sie einen Fehler gemacht haben in Ihrem code und null zurückgeben führt zu einer null-pointer-exceptions, dann je früher fangen Sie, desto besser. Wenn Sie wieder ein leeres Objekt, der ersten Benutzung kann es funktionieren, aber vielleicht hast du Fehler später.
InformationsquelleAutor der Antwort Jacob Mattison
Die besten in diesem Fall return "null" in einem Fall gibt es keine solche user. Auch Ihre Methode statisch.
Edit:
In der Regel Methoden wie diese sind Mitglieder der "User" - Klasse und verfügen nicht über einen Zugang zu der Instanz-Mitglieder. In diesem Fall sollte die Methode statisch ist, sonst müssen Sie erstellen eine Instanz von "Benutzer" und dann rufen Sie GetUserById Methode wird wieder eine andere "User" - Instanz. Einverstanden, das ist verwirrend. Aber wenn GetUserById Methode ist Mitglied von einigen "DatabaseFactory-Klasse" - kein problem, es zu verlassen, als einer Instanz Mitglied.
InformationsquelleAutor der Antwort Kamarey
Ich persönlich Rückkehr eine default-Instanz des Objekts. Der Grund ist, dass ich erwarte, dass die Methode null zurückgeben zu viele oder null und eins (abhängig von der Methode, der Zweck). Der einzige Grund, dass es wäre ein Fehler-Zustand von jeder Art, mit diesem Ansatz, der, wenn die Methode kein Objekt zurückgegeben(s) und war immer erwartet (in Bezug auf ein eins-zu-viele oder einzelne) zurückkehren.
Als zu der Annahme, dass dies ist ein business-domain Frage - ich sehe es nicht aus, dass Seite der Gleichung. Normalisierung des Rückgabetypen ist eine gültige Anwendung der Architektur in Frage. Zumindest ist es Thema für die Standardisierung von Codierungsverfahren. Ich bezweifle, dass es ist ein business-Benutzer, der geht, zu sagen: "in Szenario X, nur geben Sie eine null".
InformationsquelleAutor der Antwort Joseph Ferris
In unserem Business-Objekte haben wir 2 Haupt-Get-Methoden:
Dinge einfach zu halten in dem Zusammenhang, oder Sie Frage, die Sie sein würde:
Die erste Methode wird verwendet, wenn immer bestimmte Personen, die zweite Methode wird verwendet, speziell beim hinzufügen oder Bearbeiten von Entitäten, die auf web-Seiten.
Dies ermöglicht uns, das beste aus beiden Welten in dem Kontext, in dem Sie verwendet werden.
InformationsquelleAutor der Antwort Mark Redman
Ich bin ein französischer IT-student, so entschuldigen Sie mein schlechtes Englisch. In unserer Klassen haben wir gesagt, dass eine solche Methode sollte niemals null zurück, noch ein leeres Objekt. Der Benutzer dieser Methode soll zuerst prüfen ob das Objekt, das er sucht vorhanden ist, bevor versucht, es zu erhalten.
Verwendung von Java, sind wir aufgefordert, fügen Sie ein
assert exists(object) : "You shouldn't try to access an object that doesn't exist";
am Anfang von jeder Methode, die konnte null zurück, um auszudrücken, die "Voraussetzung" (ich weiß nicht, was das Wort auf Englisch).IMO ist das wirklich nicht einfach zu benutzen, aber das ist, was ich mit,, warten auf etwas besseres.
InformationsquelleAutor der Antwort Saend
Wenn der Fall, dass der Benutzer nicht gefunden wird kommt oft genug, und Sie wollen to deal mit, die in verschiedener Weise je nach Umstand (manchmal eine Ausnahme zu werfen, manchmal als Ersatz eine leere user) man könnte auch so etwas in der Nähe zu F#'s
Option
oder Haskell istMaybe
geben, die explizit trennt die 'kein Wert' Fall von 'was gefunden!'. Der Datenbank-Zugriff-code könnte wie folgt Aussehen:Und werden wie folgt verwendet:
Leider scheint jeder zu Rollen geben, wie dies Ihre eigenen.
InformationsquelleAutor der Antwort yatima2975
Ich in der Regel null zurück. Es bietet einen schnellen und einfachen Mechanismus zu erkennen, wenn etwas geschraubt ohne auslösen von Ausnahmen und mit Tonnen von try/catch alle über dem Platz.
InformationsquelleAutor der Antwort whatsisname
Für collection-Typen würde ich Sie wieder eine Leere Sammlung, für alle anderen Typen, die ich lieber mit dem NullObject-Muster für die Rückgabe ein Objekt implementiert das gleiche interface, so dass der Rückgabe-Typ. für Einzelheiten über die Muster Auschecken link-text
Mit dem NullObject-Muster wäre dies :-
{
//Mir vorstellen, dass einige hier den code, um access-Datenbank.....
}
InformationsquelleAutor der Antwort vikram nayak
Zu setzen, was andere gesagt haben, in einem pithier Weise...
Ausnahmen sind bei vorliegen Außergewöhnlicher Umstände
Wenn diese Methode ist pure data access layer, würde ich sagen, dass da einige parameter, wird in einer select-Anweisung erwarten würde, dass ich kann nicht finden, alle Zeilen aus, die zu bauen ein Objekt, und daher null zurückgeben würde akzeptabel sein, so ist dies die Logik auf Daten zugreifen.
Auf der anderen Seite, wenn ich erwartete, dass meine parameter reflektieren einen Primärschlüssel und ich bekommen nur eine Zeile zurück, wenn ich mehr als ein Rücken würde ich eine Ausnahme werfen. 0 ist ok, return null, 2 nicht.
Nun, wenn ich hatte einige login-code, der überprüft, gegen einen LDAP-Anbieter überprüft dann gegen eine DB um mehr details zu bekommen und ich erwartete, sollte in sync zu allen Zeiten, ich könnte werfen die Ausnahme dann. Wie andere gesagt haben, es ist business-Regeln.
Nun, ich werde sagen, dass ist eine Allgemeinen Regel. Es gibt Zeiten, wo möchten Sie vielleicht zu brechen. Allerdings, meine Erfahrungen und Experimente mit C# (viel) und Java(ein bisschen) hat mich gelehrt, dass es viel teurer, Leistung klug, Ausnahmen behandeln, als handle vorhersehbare Fragen über bedingte Logik. Ich spreche in der Höhe von 2 oder 3 Größenordnungen teurer, in einigen Fällen. Also, wenn möglich, dein code könnte am Ende in eine Schleife, dann würde ich dir raten, null zurückgeben und testen.
InformationsquelleAutor der Antwort Jim L
Verzeihen Sie meine pseudo-php - /code.
Ich denke, es hängt wirklich von der beabsichtigten Verwendung des Ergebnisses.
Wenn Sie beabsichtigen, zu Bearbeiten/ändern der return-Wert ein, und speichern Sie es, dann wieder ein leeres Objekt. So können Sie die gleiche Funktion zum Auffüllen der Daten auf ein neues oder bestehendes Objekt.
Sagen, ich habe eine Funktion, die einen Primärschlüssel und ein array von Daten, füllt die Zeile mit den Daten, speichert dann den resultierenden Datensatz in die db. Da ich bin die beabsichtigen, füllen Sie das Objekt mit meinen Daten so oder so, es kann sein, ein enormer Vorteil, um ein leeres Objekt zurück von der getter. So, ich kann führen identisch in beiden Fällen. Verwenden Sie das Ergebnis der get-Funktion, egal was.
Beispiel:
Hier können wir sehen, dass die gleiche Reihe von Operationen manipuliert werden alle Datensätze dieses Typs.
Jedoch, wenn die ultimative Absicht der Rückgabe-Wert ist zu Lesen und etwas zu tun mit den Daten, dann würde ich null zurück. Auf diese Weise kann ich sehr schnell feststellen, wenn es keine Daten zurückgegeben und Anzeige der entsprechenden Nachricht an den Benutzer.
In der Regel, ich werde fangen Sie die Ausnahmen in meiner Funktion, die die Daten abruft (so kann ich die log-Fehlermeldungen, etc...) dann null zurück, direkt aus dem Fang. Es im Allgemeinen nicht Sache der Endverbraucher, was das problem ist, also ich finde es am besten, Kapseln, mein Fehler-Protokollierung/Auswertung direkt in der Funktion, die diese Daten bekommt. Wenn Sie die Wartung einer gemeinsamen Codebasis, die in allen großen Unternehmen ist dies besonders vorteilhaft, da können Sie nicht zwingen, ordnungsgemäße Fehler-Protokollierung/handling, auch auf der faulste Programmierer.
Beispiel:
Das ist meine Regel. Es funktionierte gut so weit.
InformationsquelleAutor der Antwort
Interessante Frage und ich denke, es gibt keine "richtige" Antwort, denn es hängt immer von der Verantwortung für Ihr code. Hat deine Methode wissen, wenn keine Daten gefunden, ist ein problem oder nicht? In den meisten Fällen lautet die Antwort "Nein" und deshalb wird null zurückgeben, und lassen Sie den Anrufer Umgang mit er-situation ist perfekt.
Vielleicht ein guter Ansatz, um unterscheiden zu werfen Methoden von null-Rückgabe Methoden zu finden, ist eine Konvention in Ihrem team: Methoden, die sagen, Sie "bekommen" - sowas sollte eine Ausnahme werfen, wenn es nichts zu Holen. Methoden, die möglicherweise null zurückgeben, anders benannt sein kann, vielleicht das "Suchen..." statt.
InformationsquelleAutor der Antwort Marc Wittke
Wenn das zurückgegebene Objekt ist etwas, das Durchlaufen werden können über, würde ich Sie wieder ein leeres Objekt, so dass ich nicht haben, um auf null zu testen erste.
Beispiel:
InformationsquelleAutor der Antwort Jan Aagaard
Ich mag nicht auf null zurück, von keiner Methode, sondern verwenden Sie die Option-funktionalen Typ statt. Methoden, die keine Ergebnisse zurückgeben, eine leere Option, sondern als null.
Auch solche Methoden, die keine Ergebnisse zeigen sollte, dass Sie durch Ihre Namen. Ich normalerweise setzen Versuchen oder TryGet oder TryFind am Anfang der Methode den Namen, um anzuzeigen, dass Sie zurückkehren können, wird ein leeres Ergebnis (z.B. TryFindCustomer, TryLoadFile, etc.).
Können die Anrufer wenden unterschiedliche Techniken, wie die Sammlung von pipelining (siehe Martin Fowler ' s Sammlung Pipeline) auf das Ergebnis.
Hier ist ein weiteres Beispiel, wenn die Rückgabe-Option anstelle von null verwendet, um zu reduzieren die Komplexität des Codes: Wie zu Verringern die Zyklomatische Komplexität: Option Funktionalen Typ
InformationsquelleAutor der Antwort Zoran Horvat
Mehr Fleisch zu Schleifen: lassen Sie uns sagen, meine DAL NULL für GetPersonByID hingewiesen. Was sollte mein (eher Dünn) BLL tun, wenn er erhält eine NULL? Pass, die NULL auf sich und lassen Sie die end-Verbraucher sorgen machen (in diesem Fall ein ASP.Net Seite)? Wie wäre es mit der BLL eine exception werfen?
Die BLL kann genutzt werden von ASP.Net und die Win-App, oder eine andere Klasse Bibliothek - ich denke, es ist unfair zu erwarten, dass die Endverbraucher zu intrinsisch "wissen", dass die Methode GetPersonByID eine null zurück (es sei denn null-Typen verwendet werden, Schätze ich mal).
Meine nehmen (für was es Wert ist) ist, dass mein DAL gibt NULL zurück, wenn nichts gefunden wird. FÜR EINIGE OBJEKTE, das ist in Ordnung - es könnte ein 0:viele Liste der Dinge, die so nicht dass alle Dinge in Ordnung ist (z.B. eine Liste der Lieblings-Bücher). In diesem Fall, meine BLL gibt eine leere Liste zurück. Für die meisten single-entity-Dinge (wie z.B. Benutzer, Konto, Rechnung), wenn ich nicht eins haben, dann ist das definitiv ein problem, und werfen eine teure Ausnahme. Jedoch, zu sehen, wie das abrufen von einem Benutzer durch einen eindeutigen Bezeichner, der zuvor durch die Anwendung sollte immer wieder ein user, die Ausnahme ist eine "richtige" Ausnahme, als in ihm ist außergewöhnlich. Der end-Verbraucher der BLL (ASP.Net, f'rinstance) immer nur erwartet, dass Dinge, die zu hunky-dory, also eine nicht Behandelte Ausnahme-Handler verwendet werden, statt der Umhüllung jeder einzelnen Aufruf GetPersonByID in einem try - catch-block.
Wenn es ein eklatantes problem in meinem Vorgehen haben, bitte lassen Sie mich wissen, wie ich bin immer daran interessiert zu lernen. Wie die anderen Poster gesagt haben, Ausnahmen sind teure Dinge, und die "erste überprüfung" der Ansatz ist gut, aber Ausnahmen sollte nur das, außergewöhnliche.
Genieße ich diesen Beitrag, viele gute Vorschläge für "es hängt davon ab" - Szenarien 🙂
InformationsquelleAutor der Antwort Mike Kingscott
Denke ich, sollten Funktionen nicht null zurückgeben, für die Gesundheit Ihrer code-Basis. Ich denke, der kann ein paar Gründe:
Wird es eine große Menge von guard-Klauseln die Behandlung von null-Referenz
if (f() != null)
.Was ist
null
, ist es eine akzeptierte Antwort oder ein problem? Null ist ein Gültiger Zustand für ein bestimmtes Objekt? (stellen Sie sich vor, dass Sie einen client für den code). Ich meine, alle Referenz-Typen können null sein, aber sollten Sie?Dass
null
hanging around wird fast immer ein paar unerwartete NullRef Ausnahmen von Zeit zu Zeit, wie Ihre code-Basis wächst.Gibt es einige Lösungen
tester-doer pattern
oder die Umsetzung deroption type
aus der funktionalen Programmierung.InformationsquelleAutor der Antwort gavri
Ich bin ratlos bei der Anzahl der Antworten (alle über das Internet), die sagen, Sie brauchen zwei Methoden: eine "IsItThere()" Methode und eine "GetItForMe ()" - Methode und so führt dies zu einer race-condition. Was ist falsch mit einer Funktion gibt null zurück, Zuweisung an eine variable, und überprüfen Sie die variable für Null-alle in einem test? Meine ehemaligen C-code war gespickt mit
if ( NULL != (variable = Funktion(Argumente...)) ) {
So erhalten Sie den Wert (oder null) in eine variable, und das Ergebnis alle auf einmal. Hat diese Redewendung in Vergessenheit geraten? Warum?
InformationsquelleAutor der Antwort no comprende
Ich Stimme mit den meisten posts hier, die dazu neigen, in Richtung
null
.Meine Argumentation ist, dass die Erzeugung eines leeren Objektes mit null-Eigenschaften verursachen Fehler. Zum Beispiel, ein Unternehmen mit einer
int ID
Eigenschaft einen ersten WertID = 0
, das ist ein völlig Gültiger Wert. Sollte das Objekt, unter einigen Umständen, Speicherung in Datenbank, es wäre eine schlechte Sache.Für alles, was mit einem iterator ich würde immer verwenden Sie die leere Kollektion. So etwas wie
ist der code, den Geruch meiner Meinung nach. Sammlung Eigenschaften sollte nicht null sein, je.
Einem edge-Fall ist
String
. Viele Leute sagen, dassString.IsNullOrEmpty
ist nicht wirklich notwendig, aber Sie kann nicht immer unterscheiden zwischen einer leeren Zeichenfolge und null. Außerdem sind manche Datenbank-Systeme (Oracle) wird nicht zwischen Ihnen zu unterscheiden (''
wird gespeichert alsDBNULL
), so dass Sie gezwungen sind, behandeln Sie Sie ebenso. Der Grund dafür ist, dass die meisten string-Werte kommen entweder aus Benutzereingaben oder aus externen Systemen, während weder die Textfelder noch die meisten exchange-Formate haben unterschiedliche Darstellungen für''
undnull
. Also selbst wenn der Nutzer will, um einen Wert entfernen, er kann nichts tun mehr als das löschen des input-regler. Auch die Unterscheidung der null und nicht-null-Werte zulässtnvarchar
Datenbank-Felder, ist mehr als fraglich, wenn Ihr DBMS dies ist nicht oracle - ein obligatorisches Feld, das ermöglicht''
ist seltsam, Ihre Benutzeroberfläche würde nie zulassen, also Ihre Marker nicht anzeigen.So die Antwort hier, meiner Meinung nach ist, behandeln Sie Sie ebenso, immer.
Bezüglich Ihrer Frage bezüglich Ausnahmen und Leistung:
Wenn Sie werfen eine Ausnahme, die Sie nicht verarbeiten kann, völlig in Ihrer Logik, die Sie haben, um abzubrechen, irgendwann, was auch immer Ihr Programm, und fragt den Benutzer, um zu wiederholen, was er gerade Tat. In diesem Fall werden die performance-Einbußen einer
catch
ist wirklich die wenigsten sorgen - bitten zu müssen, der Benutzer ist der Elefant im Raum (was bedeutet re-rendering der gesamten Benutzeroberfläche, oder das versenden von HTML durch das internet). Also, wenn Sie nicht Folgen Sie den anti-Muster:"Programmablauf bei Ausnahmen", nicht stören, werfen nur, wenn es Sinn macht. Auch in Grenzfällen, wie "Validierung Ausnahme", performance ist nicht wirklich ein Problem, da Sie den Benutzer auffordern, wieder in jedem Fall.InformationsquelleAutor der Antwort Oliver Schimmer
Sollten Sie eine Ausnahme auslösen, wenn es ist ein außergewöhnlicher Umstand, den Sie nennen, dass der code mit einer ungültigen Benutzer-ID. Wenn es KEIN außergewöhnlicher Umstand ist, dann, was Sie im wesentlichen tun, ist die Verwendung einer "getter" - Methode, um zu testen, ob ein Benutzer existiert oder nicht. Das ist wie der Versuch, eine Datei zu öffnen um zu sehen, ob es existiert oder nicht (lets stick auf c#/java hier) anstatt mit der exists-Methode, oder versuchen, Zugriff auf dictionary-Elemente und sehen, wenn Sie vorhanden sind, indem man die return-Wert anstelle der Verwendung der "enthält" - Methode zuerst.
Daher ist es wahrscheinlich, dass Sie nach einer zusätzlichen Methode wie "vorhanden" , prüfen Sie zuerst, ob es so einen Benutzer. Leistung von Ausnahmen ist definitiv kein Grund, einfach nicht Sie überhaupt nicht, es sei denn, Sie haben echte performance Probleme.
InformationsquelleAutor der Antwort BobTurbo