null Die Verwendung ist abhängig von der Anwendung / Sprache
Letztendlich wird die Wahl, ob Sie nullals gültigen Anwendungswert verwenden möchten oder nicht, weitgehend von Ihrer Anwendung und Ihrer Programmiersprache / Schnittstelle / Kante bestimmt.
Grundsätzlich würde ich empfehlen, unterschiedliche Typen zu verwenden, wenn es unterschiedliche Werteklassen gibt. nullDies kann eine Option sein, wenn Ihre Schnittstelle dies zulässt und Sie nur zwei Klassen einer Eigenschaft darstellen möchten. Das Weglassen einer Eigenschaft kann eine Option sein, wenn Ihre Benutzeroberfläche oder Ihr Format dies zulässt. Ein neuer Aggregattyp (Klasse, Objekt, Nachrichtentyp) kann eine weitere Option sein.
Wenn dies für Ihr Zeichenfolgenbeispiel in der Programmiersprache ist, würde ich mir ein paar Fragen stellen.
- Plant ich, zukünftige Arten von Werten hinzuzufügen? Wenn ja, ist eine
Optionwahrscheinlich besser für Ihr Interface-Design.
- Wann muss ich Verbraucheranrufe validieren? Statisch? Dynamisch? Vor? Nach? Überhaupt? Wenn Ihre Programmiersprache dies unterstützt, können Sie die Vorteile der statischen Typisierung nutzen, da dadurch die Menge an Code vermieden wird, die Sie zur Validierung erstellen müssen.
OptionFüllt diesen Fall wahrscheinlich am besten aus, wenn Ihre Zeichenfolge nicht nullwertfähig war. Allerdings müssen Sie wahrscheinlich nulltrotzdem die Benutzereingabe auf einen Zeichenfolgenwert überprüfen, sodass ich wahrscheinlich auf die erste Fragezeile zurückgreifen möchte: Wie viele Arten von Werten möchte ich darstellen?
- Ist
nullbezeichnend für einen Programmierer Fehler in meiner Programmiersprache? Leider nullist in einigen Sprachen häufig der Standardwert für nicht initialisierte (oder nicht explizit initialisierte) Zeiger oder Referenzen. Ist nullein Wert als Standardwert akzeptabel? Ist es als Standardwert sicher ? Manchmal nulldeutet dies auf freigegebene Werte hin. Sollte ich Verbrauchern meiner Schnittstelle einen Hinweis auf diese potenziellen Speicherverwaltungs- oder Initialisierungsprobleme in ihrem Programm geben? Was ist der Fehlermodus eines solchen Anrufs angesichts solcher Probleme? Befindet sich der Aufrufer im selben Prozess oder Thread wie ich, sodass solche Fehler ein hohes Risiko für meine Anwendung darstellen?
Abhängig von Ihren Antworten auf diese Fragen werden Sie wahrscheinlich feststellen können, ob dies nullfür Ihre Benutzeroberfläche geeignet ist oder nicht .
Beispiel 1
- Ihre Anwendung ist sicherheitskritisch
- Sie verwenden beim Start
nulleine Art von Heap-Initialisierung. Dies ist ein möglicher Zeichenfolgenwert, der zurückgegeben wird, wenn für eine Zeichenfolge kein Speicherplatz zugewiesen wird.
- Möglicherweise trifft eine solche Zeichenfolge auf Ihre Benutzeroberfläche
Antwort: nullist wahrscheinlich nicht angebracht
Begründung: nullIn diesem Fall werden tatsächlich zwei verschiedene Arten von Werten angegeben. Der erste kann ein Standardwert sein, den der Benutzer Ihrer Schnittstelle festlegen möchte. Leider ist der zweite Wert ein Flag, das anzeigt, dass Ihr System nicht richtig funktioniert. In solchen Fällen möchten Sie wahrscheinlich so sicher wie möglich ausfallen (was auch immer das für Ihr System bedeutet).
Beispiel 2
- Sie verwenden eine C-Struktur, die ein
char *Mitglied hat.
- Ihr System verwendet keine Heap-Zuordnung und Sie verwenden die MISRA-Prüfung.
- Ihre Schnittstelle akzeptiert diese Struktur als Zeiger und prüft, ob diese Struktur nicht auf zeigt
NULL
- Der Standard- und sichere Wert des
char *Mitglieds für Ihre API kann durch einen einzelnen Wert von angegeben werdenNULL
- Bei der Strukturinitialisierung Ihres Benutzers möchten Sie dem Benutzer die Möglichkeit geben, das
char *Mitglied nicht explizit zu initialisieren .
Antwort: NULLkann angebracht sein
Begründung: Es besteht eine geringe Wahrscheinlichkeit, dass Ihre Struktur die NULLPrüfung besteht, jedoch nicht initialisiert ist. Ihre API ist jedoch möglicherweise nicht in der Lage, dies zu berücksichtigen, es sei denn, Sie haben eine Art Prüfsumme für den Strukturwert und / oder die Bereichsprüfung der Adresse der Struktur. MISRA-C-Linters können Benutzern Ihrer API helfen, indem sie die Verwendung von Strukturen vor ihrer Initialisierung kennzeichnen. Wie jedoch für das char *Element, wenn der Zeiger auf einem initialisierten struct auf struct, NULList der Standardwert von einer nicht spezifizierten Elements in einer struct Initialisierer. Daher NULLkann als sicher, Standardwert für das dient char *struct Mitglied in Ihrer Anwendung.
Wenn es sich um eine Serialisierungsschnittstelle handelt, stelle ich mir die folgenden Fragen, ob Null für eine Zeichenfolge verwendet werden soll.
- Gibt es
nullHinweise auf einen potenziellen clientseitigen Fehler? Für JSON in JavaScript ist dies wahrscheinlich ein Nein, da dies nullnicht unbedingt als Hinweis auf einen Zuweisungsfehler verwendet wird. In JavaScript wird es als expliziter Hinweis auf das Fehlen von Objekten in einer Referenz verwendet, die problematisch festgelegt werden soll. Es gibt jedoch Parser und Serializer ohne Javascript, die JSON nulldem nativen nullTyp zuordnen. In diesem Fall wird diskutiert, ob die native nullVerwendung für Ihre spezielle Kombination aus Sprache, Parser und Serializer in Ordnung ist.
- Beeinflusst das explizite Fehlen eines Eigenschaftswerts mehr als einen einzelnen Eigenschaftswert? Manchmal zeigt a
nulltatsächlich an, dass Sie einen neuen Nachrichtentyp haben. Es kann für Ihre Benutzer des Serialisierungsformats einfacher sein, nur einen völlig anderen Nachrichtentyp anzugeben. Auf diese Weise wird sichergestellt, dass ihre Validierungs- und Anwendungslogik eine klare Trennung zwischen den beiden Unterscheidungen von Nachrichten aufweist, die Ihre Webschnittstelle bereitstellt.
Allgemeine Hinweise
nullkann kein Wert an einer Kante oder Schnittstelle sein, der dies nicht unterstützt. Wenn Sie beim Eingeben von Eigenschaftswerten (z. B. JSON) etwas sehr Loses verwenden, versuchen Sie, eine Form von Schema oder Validierung auf der Consumer-Edgesoftware (z. B. JSON-Schema ) zu übertragen, sofern dies möglich ist. Wenn es sich um eine Programmiersprachen-API handelt, überprüfen Sie die Benutzereingaben nach Möglichkeit statisch (durch Eingabe) oder so laut, wie es zur Laufzeit sinnvoll ist (auch bekannt als defensives Programmieren auf Benutzeroberflächen). Wie wichtig, dokumentieren oder definieren Sie die Kante, damit folgende Fragen ausgeschlossen sind:
- Welche Art von Wert eine bestimmte Eigenschaft akzeptiert
- Welche Wertebereiche gelten für eine bestimmte Eigenschaft?
- Wie ein Aggregattyp aufgebaut sein soll. Welche Eigenschaften müssen / sollten / können in einem Aggregattyp vorhanden sein?
- Wenn es sich um einen Containertyp handelt, wie viele Elemente kann oder sollte der Container enthalten, und welche Arten von Werten enthält der Container?
- In welcher Reihenfolge werden Eigenschaften oder Instanzen eines Container- oder Aggregattyps zurückgegeben?
- Welche Nebenwirkungen hat das Setzen bestimmter Werte und welche Nebenwirkungen hat das Lesen dieser Werte?