null
Die Verwendung ist abhängig von der Anwendung / Sprache
Letztendlich wird die Wahl, ob Sie null
als 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. null
Dies 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
Option
wahrscheinlich 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.
Option
Füllt diesen Fall wahrscheinlich am besten aus, wenn Ihre Zeichenfolge nicht nullwertfähig war. Allerdings müssen Sie wahrscheinlich null
trotzdem 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
null
bezeichnend für einen Programmierer Fehler in meiner Programmiersprache? Leider null
ist in einigen Sprachen häufig der Standardwert für nicht initialisierte (oder nicht explizit initialisierte) Zeiger oder Referenzen. Ist null
ein Wert als Standardwert akzeptabel? Ist es als Standardwert sicher ? Manchmal null
deutet 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 null
für Ihre Benutzeroberfläche geeignet ist oder nicht .
Beispiel 1
- Ihre Anwendung ist sicherheitskritisch
- Sie verwenden beim Start
null
eine 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: null
ist wahrscheinlich nicht angebracht
Begründung: null
In 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: NULL
kann angebracht sein
Begründung: Es besteht eine geringe Wahrscheinlichkeit, dass Ihre Struktur die NULL
Prü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, NULL
ist der Standardwert von einer nicht spezifizierten Elements in einer struct Initialisierer. Daher NULL
kann 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
null
Hinweise auf einen potenziellen clientseitigen Fehler? Für JSON in JavaScript ist dies wahrscheinlich ein Nein, da dies null
nicht 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 null
dem nativen null
Typ zuordnen. In diesem Fall wird diskutiert, ob die native null
Verwendung 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
null
tatsä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
null
kann 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?