Der beste Weg, nach Null-Parametern zu suchen (Guard-Klauseln)

8

Zum Beispiel möchten Sie normalerweise nicht, dass Parameter in einem Konstruktor null sind, also ist es sehr normal, etwas wie

zu sehen %Vor%

Es stört den Code ein wenig.

Gibt es eine Möglichkeit, ein Argument einer Liste von Argumenten besser als dieses zu überprüfen?

Etwas wie "Überprüfen Sie alle Argumente und werfen Sie eine ArgumentNullException, wenn eine von ihnen null ist und Sie die Argumente, die Null waren.

Übrigens geht es in Bezug auf doppelte Frageansprüche nicht darum, Argumente mit Attributen oder etwas, das eingebaut ist, zu markieren, sondern was manche Guard-Klauseln nennen, um zu garantieren, dass ein Objekt initialisierte Abhängigkeiten erhält.

    
SuperJMN 21.03.2015, 16:10
quelle

4 Antworten

8
%Vor%

Verwendung:

%Vor%

Das DebuggerStepThroughAttribute ist ziemlich praktisch, so dass ich im Falle einer Exception während des Debuggens (oder wenn ich den Debugger anhefte, nachdem die Ausnahme aufgetreten ist) nicht in der ArgumentNotNull -Methode, sondern bei der aufrufenden Methode wo enden werde Die Nullreferenz actually ist aufgetreten.

Ich verwende ReSharper Contract Annotations .

  • Die ContractAnnotationAttribute stellt sicher, dass ich nie falsch schreibe das Argument ( "foo" ) und benennt es auch automatisch um, wenn ich es umbenenne das Symbol% ​​co_de%.
  • Das foo hilft ReSharper bei der Codeanalyse. Also, wenn ich NotNullAttribute mache, bekomme ich eine Warnung von ReSharper, dass dies zu einer Ausnahme führt.
  • Wenn Sie Ihren Code nicht direkt mit Anmerkungen versehen möchten, Sie können dasselbe auch mit externen XML-Dateien tun, die Sie mit Ihrer Bibliothek und diesen Benutzern bereitstellen können kann optional in ihrem ReShaprer verweisen.
bitbonk 21.08.2015, 11:37
quelle
9

Wenn Sie zu viele Parameter in Ihren Konstruktoren haben, sollten Sie sie besser überarbeiten, aber das ist eine andere Geschichte.

Um den Überprüfungscode zu reduzieren, schreiben viele Leute Guard-Utility-Klassen wie folgt:

%Vor%

(Sie können weitere Validierungsmethoden hinzufügen, die für diese Guard-Klasse möglicherweise erforderlich sind.)

Es braucht also nur eine Zeile Code, um einen Parameter zu validieren:

%Vor%     
serge.karalenka 21.03.2015 16:31
quelle
5

Null-Referenzen sind eine Art von Problemen, vor denen Sie sich schützen müssen. Aber sie sind nicht die einzigen. Das Problem ist breiter als das, und es läuft darauf hinaus: Methode akzeptiert Instanzen eines bestimmten Typs, aber es kann nicht alle Instanzen behandeln.

Mit anderen Worten: Der Bereich der Methode ist größer als die Menge der Werte, die er behandelt. Guard-Klauseln werden dann verwendet, um zu bestätigen, dass der tatsächliche Parameter nicht in diese "Grauzone" der Domäne der Methode fällt, die nicht behandelt werden kann.

Nun haben wir Null-Referenzen als einen Wert, der normalerweise außerhalb der akzeptablen Menge von Werten liegt. Auf der anderen Seite passiert es oft, dass einige Nicht-Null-Elemente der Menge auch nicht akzeptabel sind (z. B. leere Zeichenfolge).

In diesem Fall kann sich herausstellen, dass die Methodensignatur zu breit ist, was auf ein Designproblem hinweist. Dies kann zu einem Redesign führen, z. Definieren eines Untertyps, typischerweise einer abgeleiteten Schnittstelle, der die Domäne der Methode einschränkt und einige der Schutzklauseln verschwinden lässt. Sie finden ein Beispiel in diesem Artikel: Warum brauchen wir Guard Clauses?

    
Zoran Horvat 19.08.2015 20:32
quelle
1

Es gibt ein nugget-Paket namens Swissknife. Installieren Sie Swissknife von der nugget Galerie. Es bietet Ihnen viele Optionen beginnend mit der Nullprüfung auf Argumente Argument.IsNotNullOrEmpty(args,"args") unter Swissknife.Diagnostics.Contracts namespace zusammen mit der Option idoim und viele mehr. Sie können Option<Class_Name> _someVar setzen und dann prüfen, ob _someVar.IsSome or _SomeVar.IsNone . Dies hilft auch bei nullbaren Klassen. Hoffe, das hilft.

    
Sriman Saswat Suvankar 08.12.2017 10:17
quelle

Tags und Links