Haftungsausschluss: Ich weiß, dass Datentypen etwas subjektiv für die von Ihnen verwendete Skript- / Programmiersprache sind. Ich schreibe gerne in Python. Ich freue mich jedoch über jede Sprache / Implementierung.
Was ist der beste Datentyp zum Speichern einer Variablen mit drei Zuständen? Etwas, das fähig ist oder Positives, Neutrales und Negatives darstellt.
Beispiel: Die ganzen Zahlen -1
, 0
, 1
.
- Pro: Sehr prägnant.
- Pro: Potenziell effizient. Kann als einzelne 2-Bit-Ganzzahl mit Vorzeichen gespeichert werden.
- Pro: kann als Skala verwendet werden, z. B. als Gleitkomma-Multiplikator.
Beispiel 2: 0
, null
, 1
(oder eine Permutation)
- Pro: Nicht neutraler Anwendungsfall kann binär sein.
- Con: Erfordert einen dynamischen Datentyp
- Con: Möglicherweise nicht prägnant.
Beispiel 3 : +
, (leere Zeichenfolge),
-
- Pro: Sehr prägnant.
- Con: Kann String-Logik verwenden, um den Status zu bestimmen.
- Pro?: Intuitive grafische Darstellung.
Vielleicht gibt es eine clevere binäre Logik, die etwas Kluges kann, das ich mir gar nicht vorstellen kann. Vielleicht hängt es zu viele Überlegungen zum Anwendungsfall ab.
Gibt es auch Überlegungen bei der Anpassung eines ternären Status zum Speichern in einem Datenbankmodul? Wie Innodb als Referenz.
quelle
Antworten:
Abgesehen von einer Aufzählung, die die offensichtlichste und klarste Art ist, dies auszudrücken, ist das System für interoperable Systeme, bei denen eine sprachspezifische Aufzählung nicht ausgedrückt werden kann, die Option -1/0/1.
Sie können jedoch eine Bitmaske ausprobieren, wobei 0 0 bedeutet, 1 "Bit 2 gesetzt" und 2 "Bit 3 gesetzt" bedeutet (dh Sie haben 3 Bits, die ein- oder ausgeschaltet sein können. Solange Sie dies nicht definieren 3 oder Bits 1 und 2 gesetzt, dann sind Sie gut. Diese Option ist am besten geeignet, wenn Sie glauben, dass Sie in Zukunft 4 oder mehr Flags benötigen, da 4, 8, 16 usw. nachfolgende Bits setzen.
All dies passt in einen einzelnen 8-Bit-Datentyp, sodass kein Speicher verschwendet wird oder keine Konvertierung erforderlich ist (wie bei einem zeichenbasierten System werden manchmal 16-Bit-Zeichen verwendet, manchmal 8-Bit-Zeichen, abhängig von Ihrer Plattform).
Ich würde auf keinen Fall null in Betracht ziehen. Vielleicht in einer Datenbank, aber nur dort, wo ich garantieren konnte, dass das System eine eindeutige Unterstützung für NULL-Werte hat, und selbst dann könnte es fehleranfällig sein, wenn jemand die Unterscheidung nicht explizit vornimmt und mit 0 endet, wenn es wirklich null ist.
quelle
Ich beabsichtige nicht, eine klare Antwort auf diese Frage direkt zu schreiben; Wie ich oben empfohlen habe, hängt diese Frage stark vom Anwendungsfall ab. Im Allgemeinen scheinen alle aufgelisteten Implementierungsoptionen für unterschiedliche Zwecke zu unterschiedlichen Zeiten geeignet zu sein.
Ich möchte Sie jedoch auf diese Grundprinzipien und das Hintergrundwissen aufmerksam machen, damit Sie Ihre eigene fundierte Entscheidung treffen können.
Lesen Sie auch diesen Witz: "Ein Geschäftsmann fragt einen Buchhalter; was ist zwei plus zwei?"
Entschuldigung an alle Buchhalter und Nicht-Buchhalter. Meine Erwähnung dieses Witzes soll die Freiheit von etwas hervorheben, das wir sehr bald definieren werden, und die Verantwortung und die Konsequenzen (beide im logischen Sinne), die sich daraus ergeben.
Frage: Was ist die Wahrheitstabelle einer dreiwertigen Logik?
Antworten:
... und zieht eine handgezeichnete Karte auf ein Stück Papier.
Betrieb: Logisch und - vertraulich - Entwurf für das dritte Quartal 2014
FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????
Ein Grafikdesigner fragt einen Programmierer: "Können Sie ein Beispiel für eine dreiwertige Logik geben?"
Der Programmierer antwortet: "Können Sie mir zwei Farben geben, die so schwarz und weiß sind, wie sie sein könnten?"
Grafikdesigner: "Also ... schwarz und weiß?"
Programmierer: "Genau. Jetzt werde ich eine dritte Farbe geben - aber ich muss sie als ARGB-Nummer angeben. Ich hoffe, es macht Ihnen nichts aus."
Grafikdesigner: "Nun, ich arbeite jeden Tag mit ARGB ..."
Black#FF000000
White#FFFFFFFF
Nothing#00000000
Anmerkung. Oben sind Schwarz und Weiß vollständig undurchsichtige Farben. Die dritte Farbe, Nothing, ist vollständig transparent. Wenn Schwarz und Weiß in verschiedenen Verhältnissen zusammengemischt werden, werden sie zu verschiedenen Grautönen, aber das Einmischen von Nothing ändert nichts.
quelle
Wenn die drei möglichen Zustände eine inhärente Bedeutung haben, verwenden Sie etwas, das für diese inhärente Bedeutung geeignet ist. Beispielsweise sind die möglichen Zustände 1, 2 oder 3, oder wenn sie 100, 200 und 300 sind, verwenden Sie eine Ganzzahl. Wenn die möglichen Zustände Ja, Nein oder Unbekannt sind, können Sie einen optionalen Booleschen Wert oder einen Zeiger auf ein Boolesches Objekt verwenden, mit der Möglichkeit, keinen Wert, einen "Ja" -Wert oder einen "Nein" -Wert zu haben. Obwohl einige Leute es vielleicht nicht mögen.
Wenn es eine offensichtliche Möglichkeit gibt, wie Ganzzahlen als mögliche Zustände interpretiert werden können, können Sie Ganzzahlen verwenden. Angenommen, eine Vergleichsfunktion mit den Zuständen "kleiner", "gleich", "größer" könnte -1, 0 und +1 verwenden. Obwohl einige Leute möglicherweise nicht offensichtlich finden, was Sie offensichtlich finden.
Wenn es eine offensichtliche Möglichkeit gibt, wie Buchstaben als mögliche Zustände interpretiert werden können, können Sie ein Zeichen verwenden. Wenn Ihre Zustände beispielsweise "rot", "grün" oder "blau" sind, können Sie die Buchstaben "r", "g" und "b" verwenden. Wieder, was ist für Sie offensichtlich ...
Ein Aufzählungstyp ist immer eine Möglichkeit. Eine Zeichenfolge ist immer möglich, aber in den meisten Sprachen verlieren Sie die Typprüfung.
Einige Leute verwenden drei boolesche Werte, um "ist in Zustand 1", "ist in Zustand 2", "ist in Zustand 3" darzustellen.
Was auch immer Sie tun, Sie sollten sich von dem Versuch leiten lassen, etwas zu verwenden, das offensichtlich und verständlich ist, Sie nicht in Schwierigkeiten bringt, wenn Sie plötzlich vier Zustände haben, und den Compiler so viele Fehler wie möglich finden lassen.
quelle
Dies hängt stark von der Sprache, dem, was Sie tun, der Abstraktionsebene ab (was auch von der Sprache usw. abhängt).
Ich benutze hauptsächlich C ++ und hier gibt es viele Möglichkeiten. Das einfachste ist ein
enum tribool_state { false_val, true_val, undetermined_val }
. Dies wäre ausreichend, wenn Ihr Verwendungsszenario eine einzelne Funktion ist, die diesen Werttyp zurückgibt.Ich würde es wahrscheinlich verwenden,
boost::optional<bool>
wenn ich ein boolesches Ergebnis ausdrücken möchte, das möglicherweise nicht abgerufen werden kann (z. B. prüfen, ob die empfangenen Netzwerkdaten vollständig sind, und dann den booleschen Wert verarbeiten, wenn dies der Fall ist).Ich würde verwenden ,
boost::tribool
wenn ich ein Fuzzy - boolean Ergebnis , die unterstützte voll Tri-State - Boolesche Logik (zB zum Ausdruck bringen wolltetrue || indetermined -> true
,false && indetermined -> false
,true && indetermined -> indetermined
und so weiter).In ähnlicher Weise würde ich in Python eine Reihe von Konstanten oder eine Klasse verwenden (wiederum abhängig davon, welche Art von Semantik / Operationen ich im Client-Code benötigen würde):
Zum Beispiel würde ich verwenden:
Wenn ich einen einfachen Fall hätte, in dem eine Funktion eines von drei Ergebnissen zurückgibt.
Wenn ich stattdessen eine vollständige Bibliothek hätte, die eine boolesche Logik mit drei Zuständen erfordert, würde ich den Werttyp als Klasse implementieren.
quelle
Wenn Sie Java verwenden, können Sie ein Boolesches Objekt verwenden: Da es sich um ein Objekt handelt und einen Booleschen Wert enthält, kann es die Werte true, false und null enthalten. Ich bin mir nicht sicher, ob dies der beste Weg ist.
quelle
In Microsoft.NET gibt es einen Typ "Tupel", der für Ihre Anforderung verwendet werden kann. Besuchen Sie http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx
quelle