Gibt es einen Namen für das nicht angegebene / null / leer-Problem? [geschlossen]


8

Ich arbeite mit Code, bei dem Daten in solchen Hashtable / Dictionary / Associative-Array-ähnlichen Strukturen gespeichert / ausgetauscht werden

{
   'alpha': None,
   'bravo': '',
   # 'charlie' is not given
}

Es gibt nicht viel Standardisierung, welches Feld "gegeben" ist und wenn es gegeben ist, wenn es als Keine / Null / Null oder eine leere Zeichenfolge angegeben werden kann. Infolgedessen ist der Code mit Überprüfungen wie if hasattr(obj, 'alpha')und Standard-Fallbacks übersät .

Gibt es einen Namen oder eine umgangssprachliche Bezeichnung für diese Art von (imho) Anti-Muster?

AKTUALISIEREN:

es scheint, derzeit gibt es keinen Namen, daher würde ich gerne Vorschläge hören. Derzeit haben wir diese:

  • Incorporeal Horde (Credits an psr)

5
Ich würde es nicht als Anti-Pattern bezeichnen. In der realen Welt gibt es Situationen, in denen etwas fehlt, und Situationen, in denen dies nicht der Fall ist. Wenn ein Standardwert sinnvoll ist, okay, aber was ist, wenn er wirklich null / nicht vorhanden ist? Einige Leute haben zum Beispiel keinen zweiten Vornamen. Wie würden Sie das darstellen? Deshalb glaube ich, dass es eher eine Suche nach einem besseren Programmiermodell für diese Art von Szenarien ist. Wie das Nullobjektmuster, die vielleicht Monade oder was auch immer da draußen existiert.
Ionuț G. Stan

Beachten Sie, dass eine leere Zeichenfolge ein vollkommen gültiges Mitglied der Menge aller Zeichenfolgen ist und sich erheblich davon unterscheidet, keine Zeichenfolge zu haben. Es ist wie der Unterschied zwischen den beiden Sätzen: "Ich habe 0 Dollar." und "Ich werde dir nicht sagen, wie viele Dollar ich habe."
Ingo

Python verfügt über ein Standardwörterbuch, mit dem Sie diese Überprüfungen vermeiden können. Haskell hat Monaden, die alle Probleme der Menschheit lösen.
Job

@Ionut: Ja, es gibt Situationen, in denen "etwas fehlt" in Ordnung ist, aber in meinem Fall, denke ich, ist es eher so, dass man es vorzieht, 100 Empfänger für jeden möglichen Bullshit tolerant zu machen, als 1 oder 2 Absender dazu zu bringen, zu gehorchen ein Format. Der zweite Vorname (oder im Allgemeinen jeder Teil einer Adresse) ist imho ein klassischer Fall, in dem '' vollkommen in Ordnung ist.
Keppla

@Ingo: Ja, aber das Problem ist, dass in meiner Codebasis diese 'Bedeutungen' ignoriert werden. Verschiedene Teile der Anwendung können alle für dieselbe Reihenfolge antworten: {'Positionen': Keine}, {'Positionen': []} oder nur {}.
Keppla

Antworten:


6

Ich glaube nicht, dass es einen solchen Namen gibt (ich habe nachgesehen, aber wie kann man natürlich einen fehlenden Namen finden)?

Ich schlage den Namen "Incorporeal Horde" vor, obwohl ich ihn auf die vollständige Sammlung von null oder entarteten Objekten anwenden würde - Sammlungen mit der Größe Null, null, undefiniert, nichts, keine, NAN (wohl eine andere Art von Randfall), DBNull, ungültige, leere Zeichenfolge (möglicherweise ein Sonderfall für leere Sammlungen), fehlende Wörterbucheinträge usw.

Und ich würde es nicht als Anti-Pattern an sich bezeichnen, sondern als Problem in der Softwareentwicklung, insbesondere in dem Fall, in dem Ihre Programmierumgebung erfordert, dass Sie für viele dieser Fälle separaten Code schreiben.

Entschuldigung für eine ziemlich nicht informative Antwort, aber ich denke, es ist das Beste, was getan werden kann. Wenn die Welt aufgrund Ihrer Frage einen Namen annimmt, kann dies zu einer richtigen Antwort werden.


Ich liebe "Incorporeal Horde".
Sean McMillan

Klingt nach "Magic the Gathering". Ich mag das. +1.
Keppla

0

In F # wird dies über einen Optionstyp bereitgestellt (ähnlich wie in früheren Sprachen derselben Familie). Ich habe das gleiche Konzept in einem C # -Projekt verwendet, in dem ich eine Regel habe, nach der ich versuche, niemals null von einer Funktion zurückzugeben, aber ich Option<T>gebe das von diesem Typ zurück, bei dem die Möglichkeit eines None-Werts besteht. Auf diese Weise weiß der aufrufende Code, dass er diese Möglichkeit im Rückgabewert behandeln muss.

Ich würde es vorziehen, nicht nullbare Referenztypen zu haben, genau wie wir jetzt nullbare Werttypen haben, aber das ist eine andere Geschichte.


0

In JavaScript wird dies als undefinedeindeutiger Sentinel-Wert bezeichnet, der sich von unterscheidet null.

Sie erhalten undefinedentweder durch Auswerten der globalen Variablen undefinedoder einer Eigenschaft eines Objekts, das nicht definiert ist, oder durch Auswerten einer Anweisung, die keinen Wert zurückgibt, z. B. Aufrufe von Funktionen, die nichts zurückgeben, oder einen Block oder eine Variablendeklaration (obwohl diese beiden keine gültigen Ausdrücke sind, werden Sie diese nur in einer JavaScript-REPL finden).

Wenn der undefinedWert gezwungen Objectwird null, ein zu sein , wird er , aber es ist nicht so null.

Hier ist eine kleine Illustration:

var a = [1, 2, 3];//undefined
a[0];//1
a[4];//undefined

var o = { foo: "123" };//undefined
o.foo;//"123";
o.bar;//undefined

function bar() { return null; };//undefined
bar();//null
function foo() { /*just an empty block*/};//undefined
foo();//undefined

typeof undefined;//"undefined"
typeof null;//"object"
null == undefined;//true - that is because undefined is converted to an object for comparison and thus yields null
null === undefined;//false - because they are not the same

Ich denke, es ist vernünftig, undefinierte Werte (im Gegensatz zu als definiert definierten Werten null) als undefiniert zu bezeichnen, wenn dies Ihre Frage ist. Die Verwendung eines eindeutigen Sentinel-Werts zur Übermittlung des Fehlens eines definierten Werts ist eine praktikable Lösung für dynamische Sprachen, obwohl sie häufig nur unzureichend verstanden wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.