Wie kann ich erklären, dass, wenn (xyz == null) überprüft, sind keine „schützende“

StackOverflow https://stackoverflow.com/questions/1647666

  •  22-07-2019
  •  | 
  •  

Frage

Ich habe ein paar Entwickler, die ständig Wenn null Kontrollen setzen

Zum Beispiel:

Run(Order order)
{
  if (order == null) return;
}

in ihrem Code, wie sie denken, dass sie ihre Klasse schützen, wenn jemand in einem Parameter übergibt, der null ist. Ich versuche, ihnen den Fehler in ihrer Logik zu sagen, denn wenn jemand in null in diesem Fall sein höchstwahrscheinlich ein Problem mit dem Verbraucher-Code und statt dieser Klasse wirft eine Ausnahme und andernfalls schnell vorbei, es Griffe anmutig das schlechte Verhalten von der Verbraucher und halten tuckern weg.

ist ein weiterer Vorschlag Voraussetzung oder Schutzklasse zu haben, die schnell scheitern und Ausnahmen werfen. jede Sache, aber diese Tatsache zu ignorieren, dass der Verbraucher wahrscheinlich einige andere Problem hat, und ich helfen, es zu maskieren.

Wie kann ich Leute, die Tatsache zu schätzen, dass Ihre Klasse sollte nicht so nachsichtig sein. wenn jemand in guten Daten nicht passieren, sollten sie erzählt werden.

irgendwelche guten Artikel oder Vorschläge zu helfen, mir diesen Punkt über?

War es hilfreich?

Lösung

Wenn Ihre Klasse nicht null Argumente akzeptiert, dann ist das Beste, was zu tun ist dies:

if (arg == null)
    throw new ArgumentNullException();

Dies ist erheblich vorzuziehen, ein NullPointerException tiefen Stapel zu bekommen. Im schlimmsten Fall, werden Sie, dass null irgendwo zwischengespeichert und wird die Ausnahme erst viel später tatsächlich auslösen, und sehen, wie viel Spaß Sie das Problem Debuggen haben werden und .

Und wie andere gesagt haben, manchmal sagt der Vertrag, dass null in Ordnung ist. In diesem Fall um einige Teile des Codes eine Schutzklausel, die richtig ist - obwohl selbst dann würde ich sagen, dass das beste Design eine Überlastung ohne die optional null Argumente hinzuzufügen wäre

.

Andere Tipps

Es hängt wirklich von der genauen Situation. Es ist selten ratsam, allgemeine Vorschläge zu geben, wie „nicht null Kontrollen im Code setzen“, wie man angibt zu sein scheinen. Der Auftrag der Klasse sollten, was echt und was definieren, ist es nicht. Aber wenn der Vertrag es macht deutlich, dass in null vorbei ist nicht akzeptabel, dann eine Ausnahme ist in der Tat eine angemessene Antwort.

Wie alle anderen gesagt hat, ist es erheblich vorzuziehen, früh zu scheitern, als mysteriöse Probleme in der Produktion zu bekommen, weil die Funktion nichts zu tun hat, wenn es um erwartet wurde. wenn die Funktion für null Argumente zurückgibt, wie in Ihrem Beispiel).

Auch wenn die Funktion nicht zurück und wirft nur einen NullReferenceException, es ist eaiser einen Fehler zu lösen, wenn man weiß, dass ein Argument war null. Wenn eine Funktion eine NullReferenceException wirft, haben Sie keine Ahnung, was null wurde oder wessen Schuld es war.

Ich möchte, dass ArgumentNullException einen Parameter nimmt aus einem Grund hinzuzufügen.

Es ist besser, schreiben

if(myArg == null) throw new ArgumentNullException("myArg");

als ein ArgumentNullException ohne paramName zu werfen.

Auf diese Weise, wenn Sie eine Ausnahme von einer Funktion, die fünf Parameter nimmt, werden Sie wissen, welche der Parameter das Problem verursacht hat. Dies ist besonders wichtig, wenn Sie einen Debugger nicht anhängen können. (Zum Beispiel auf einem Produktions Web-Server oder eine Endbenutzer-Maschine)

Wenn Sie viele Funktionen schreiben, kann dies eine Menge Aufwand, vor allem, da es keine IntelliSense für die Saiten. Ich schrieb einen Code-Schnipsel diese Kontrollen zu erzeugen:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Check for null arguments</Title>
            <Shortcut>tna</Shortcut>
            <Description>Code snippet for throw new ArgumentNullException</Description>
            <Author>SLaks</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>Parameter</ID>
                    <ToolTip>Paremeter to check for null</ToolTip>
                    <Default>value</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[if ($Parameter$ == null) throw new ArgumentNullException("$Parameter$");
        $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Code-Verträge in .net 4.0 wird hoffentlich dieses Verhalten viel machen konsistenter. Alle Artikel, die über Code Verträge sprechen werden helfen, die Idee zu vermitteln, und in Zukunft diese Art der Syntax wird das Verfahren zur Verfügung stellen.

http : //blogs.msdn.com/bclteam/archive/2008/11/11/introduction-to-code-contracts-melitta-andersen.aspx

Ich habe nicht durchschaut, aber eiffel.com hat zwei Präsentationen ( Dia + Audio) zum Thema Design by Contract . Diese Jungs haben das Konzept erfunden, also wenn jemand erklären kann es ihnen ist :-)

Manchmal kann man den Leuten nicht sagen, warum eine Praxis wie dies falsch ist - sie haben es für sich selbst herausfinden. Aber man kann sie dort helfen, indem sie mit einem gewissen Unit-Test kommen, die aufgrund dieses Problem einig bösen Fehler verursacht, und macht sie den Fehler debuggen.

Wenn der Vertrag des Verfahrens gibt an, dass seine Argumente nicht null sein sollte, dann ist das Richtige zu tun, ist es deutlich zu machen, indem sie ein Assert verwenden, wie folgt aus:

Debug.Assert( item != null, "Null items are not supported );

Dies wird schnell fehlschlagen, wenn die ausführbare Datei einer Debug-Konfiguration gebaut verwendet, wird aber Null Leistungsverschlechterung vorhanden, wenn Release-Konfiguration gebaut werden.

Dies scheint eine Frage, wie am besten Code schreiben zu sein, die überschaubar ist. Es ist meine neue Überzeugung, dass Sie Ignoranz aller Verbraucher des Codes übernehmen müssen. Ich selbst habe durch die Annahme, mich oder jemand mit tiefem Wissen in Schwierigkeiten geraten würde meinen Code verbrauchen. Das einzige, was würde ich hinzufügen zu werfen eine Ausnahme individuelle Ausnahmen sowie Verlassen Paniermehl in der inneren Ausnahme schafft. Ich glaube fest, Ihre Entwickler eine Chance geben, die Ausgabe abzulaufen vor allem, wenn es um Daten zurückzuführen ist. Ich verbringe die meiste Zeit für die Daten suchen, meinen Code bricht, und wenn Sie Hinweise hinterlassen werden Sie Wochen in einem Jahr.

Nun zunächst einmal, Sie sind eindeutig falsch. Sie sind einen sehr ernsten logischen Fehlschluss umarmen. Sie wollen Ihr Code durch den Code korrekt sein, unter der Annahme, dass alles, was geschieht, um es korrekt ist. Als ob Korrektheit eine Art magischer Feenstaub war, die Sie gerade überall sprühen müssen.

Alle Fehler sind oder scheinen dumm, wenn sie ausgesetzt sind. Aber seine Kontrollen wie diese, die sie sich aussetzen herauszukitzeln. Bis dahin sind Fehler unsichtbar. Und für große und komplex genug, um Projekte, wissen Sie nicht, wer den Fehler finden oder unter welchen Bedingungen werden sie finden. Code, die für Elastizität architected wird typischerweise Kontrollen wie diese alle über den Ort und prüfen auch die Rückgabewerte für jede Funktion, die Fehlerwerte enthalten müssen. So Sie kodieren am Ende eines „Ich kann das nicht tun, weil die Unterfunktionen ich mich verlassen nicht funktionieren“ semantische, die tatsächlich richtig gehandhabt wird. Der große Wert davon ist, dass Sie in der Regel Arbeit arounds oder selbst bewusst Debug-Instrumentierung ganz leicht umsetzen können. Warum Sie solche Dinge tun möchte, ist, weil die schwierigsten Fehler auf diese beiden Eigenschaften verlassen in der Regel ordnungsgemäß zu debuggen.

einige Lehren aus Ihren Entwicklern lernen. Sie setzen Kontrollen wie in dort, weil sie nicht wissen, warum sie manchmal seltsame Ergebnisse von Funktionen erhalten. Sie nennen sie naiv oder übervorsichtig, weil ein schmales Stück Wissen, das Sie haben, dass sie es nicht tun. Aber wenn Sie debuggen etwas Gemeines Sie mich fragen werden, warum Sie nicht diese Kontrollen im Code verfügen, und Sie werden genauso naiv, um am Ende der Suche nach nicht in der Lage sein, den Fehler in erster Linie zu erkennen.

. Kurz: Es wird kein Code robust gemacht durch Robustheit über die Umwelt um sie herum unter der Annahme,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top