it-swarm.com.de

Sollte der Dienst eine Ausnahme auslösen oder zurückkehren, wenn keine Elemente zum Löschen angegeben wurden

Ich habe einen Code, der wie folgt dargestellt werden kann:

public class ItemService {

    public void DeleteItems(IEnumerable<Item> items)
    {
        // Save us from possible NullReferenceException below.
        if(items == null)
            return;

        foreach(var item in items)
        {
            // For the purpose of this example, lets say I have to iterate over them.
            // Go to database and delete them.
        }
    }
}

Jetzt frage ich mich, ob dies der richtige Ansatz ist oder ob ich eine Ausnahme auslösen soll. Ich kann Ausnahmen vermeiden, da das Zurückgeben dasselbe ist wie das Durchlaufen einer leeren Sammlung, was bedeutet, dass ohnehin kein wichtiger Code ausgeführt wird, aber andererseits verstecke ich möglicherweise Probleme irgendwo im Code, denn warum sollte jemand aufrufen wollen DeleteItems mit null Parameter? Dies kann darauf hinweisen, dass irgendwo anders im Code ein Problem vorliegt.

Dies ist ein Problem, das ich normalerweise mit Methoden in Diensten habe, da die meisten von ihnen etwas tun und kein Ergebnis zurückgeben. Wenn also jemand ungültige Informationen übergibt, kann der Dienst nichts tun, sodass er zurückkehrt.

12
FCin

Dies sind zwei verschiedene Fragen.

Sollten Sie null akzeptieren? Dies hängt von Ihrer allgemeinen Richtlinie zu null in der Codebasis ab. Meiner Meinung nach ist das Verbot von null überall, außer wenn dies explizit dokumentiert ist, eine sehr gute Praxis, aber es ist noch besser, sich an die Konvention zu halten, die Ihre Codebasis bereits hat.

Sollten Sie die leere Sammlung akzeptieren? Meiner Meinung nach: JA, absolut. Es ist viel mehr Aufwand, alle Aufrufer auf nicht leere Sammlungen zu beschränken, als das mathematisch Richtige zu tun - auch wenn es einige Entwickler überrascht, die mit dem Konzept der Null zweifelhaft sind.

58
Kilian Foth

Nullwert

Halten Sie sich, wie @KilianFoth bereits sagte, an Ihre allgemeinen Richtlinien. Wenn dies bedeutet, dass null als "Abkürzung" für eine leere Liste behandelt wird, gehen Sie folgendermaßen vor.

Wenn Sie keine konsistente Richtlinie für null -Werte haben, würde ich die folgende empfehlen:

null sollte reserviert werden, um Situationen darzustellen, die nicht durch den "normalen" Typ ausgedrückt werden können, z. Verwenden von null, um "Ich weiß nicht" darzustellen. Und das ist eine gute Wahl, da jeder, der versucht, diesen Wert unachtsam zu verwenden, eine Ausnahme erhält, was das Richtige ist.

Die Verwendung von null als Abkürzung für eine leere Liste qualifiziert sich nicht auf diese Weise, da es bereits eine perfekte Darstellung gibt, da es sich um eine Liste mit null Elementen handelt. Und es ist eine technisch schlechte Wahl, da jeder Teil Ihres Codes, der sich mit Listen befasst, gezwungen wird, nach der gültigen Kurzform null zu suchen.

Leere Liste

Für eine DeleteItems() -Methode bedeutet das Übergeben einer leeren Liste effektiv, nichts zu tun. Ich würde das als Argument zulassen, keine Ausnahme auslösen, sondern nur schnell zurückkehren.

Natürlich könnte der Aufrufer zuerst nach Nullelementen suchen und in diesem Fall den Aufruf DeleteItems() überspringen. Wenn es sich um eine Web-API handelt, tut der Aufrufer sollte dies aus Effizienzgründen tatsächlich, um unnötigen Datenverkehr und Round-Trip-Latenzen zu vermeiden. Aber ich denke nicht, dass Ihre API das durchsetzen sollte.

9
Ralf Kleberhoff

Lösen Sie eine Ausnahme aus und behandeln Sie Nullen im aufrufenden Code.

Versuchen Sie als Entwurfsregel, Null als Parameterwerte zu vermeiden. Dadurch werden NullPointerExceptions im Allgemeinen reduziert, da Nullen wirklich eine Ausnahme darstellen.

Schauen Sie sich außerdem den Rest Ihres Codes an. Wenn dies ein häufiges Muster in Ihrem Projekt ist, bleiben Sie konsistent.

1
serprime

Im Allgemeinen sollten das Auslösen von Ausnahmen für Ausnahmesituationen reserviert werden, d. H. Wenn der Code im aktuellen Kontext keine vernünftige Vorgehensweise aufweist.

Sie können diesen Denkprozess auf diese Situation anwenden. Da dies eine öffentliche Klasse mit einer öffentlichen Methode ist, haben Sie eine öffentliche API und theoretisch keine Kontrolle darüber, was an sie übergeben wird.

Ihr Code hat keinen Kontext darüber, wie er aufgerufen wird (wie es nicht sein sollte), und es gibt nichts, was Sie vernünftigerweise mit einem Nullwert tun können. Dies wäre sicherlich ein Kandidat für ein ArgumentNullException.

0
richzilla

Bei dieser Frage scheint es nicht um Ausnahmen zu gehen, sondern darum, dass null ein gültiges Argument ist.

In erster Linie müssen Sie also entscheiden, ob null ein zulässiger Wert für das Argument dieser Methode ist. Wenn ja, brauchen Sie keine Ausnahme. Ist dies nicht der Fall, benötigen Sie eine Ausnahme.

Ob Sie null zulassen möchten oder nicht, ist umstritten, wie viele, viele Google-Treffer zeigen. Das heißt, Sie erhalten keine klare Antwort, und es liegt etwas an der Meinung und Tradition an dem Ort, an dem Sie arbeiten.

Ein weiterer Streitpunkt ist, ob eine Bibliotheksfunktion in solchen Dingen wirklich streng oder so nachsichtig wie möglich sein sollte, solange nicht versucht wird, fehlerhafte Parameter zu "reparieren". Vergleichen Sie dies mit der Welt der Netzwerkprotokolle, der E-Mail-Übertragung usw. (die Schnittstellenverträge sind, genau wie Methoden bei der Programmierung). In der Regel gilt die Richtlinie, dass der Absender das Protokoll so genau wie möglich einhält, während der Empfänger sich alle Mühe gibt, um mit dem, was auf ihn zukommt, arbeiten zu können.

Sie müssen sich also entscheiden: Ist es wirklich die Aufgabe einer Bibliotheksmethode, ziemlich große Richtlinien wie die Behandlung von null durchzusetzen? Insbesondere, wenn Ihre Bibliothek auch von anderen Personen verwendet wird (die möglicherweise andere Richtlinien haben).

Ich würde mich wahrscheinlich irren, wenn ich null Werte zulasse, ihre Semantik definiere und dokumentiere (d. H. null = empty array in diesem Fall) und keine Ausnahme auslösen, es sei denn 99% Ihres anderen ähnlichen Codes (Code im "Bibliotheks" -Stil) machen es umgekehrt.

0
AnoE