Miglior tipo di dati per memorizzare una variabile ternaria o a tre stati

9

Disclaimer: So che i tipi di dati sono un po 'soggettivi rispetto al linguaggio di scripting / programmazione che si sta usando, mi piace scrivere in Python come una questione di preferenza; anche se sono felice di sapere di qualsiasi lanugage / implementazione.

Qual è il miglior tipo di dati per memorizzare una variabile a tre stati? Qualcosa in grado di rappresentare Positivo, Neutro e Negativo.

Esempio: interi -1 , 0 , 1 .

  • Pro: molto conciso.
  • Pro: Potenzialmente efficiente, potrebbe essere memorizzato come singolo intero con segno a 2 bit.
  • Pro: potrebbe essere usato come una scala, come un moltiplicatore a virgola mobile.

Esempio 2: 0 , null , 1 (o qualsiasi permutazione)

  • Pro: il caso d'uso non neutro può essere binario.
  • Con: richiede un tipo di dati dinamico
  • Con: Potenzialmente non conciso.

Esempio 3: + , (stringa vuota), -

  • Pro: molto conciso.
  • Con: può utilizzare la logica di stringa per determinare lo stato.
  • Pro ?: Rappresentazione grafica intuitiva.

Forse c'è una logica binaria intelligente che può fare qualcosa di intelligente che non riesco nemmeno a immaginare, forse ci sono troppe considerazioni sul caso d'uso.

Inoltre, ci sono delle considerazioni sull'adattamento di uno stato ternario da memorizzare in un motore di database? Come Innodb per riferimento.

    
posta ThorSummoner 03.07.2014 - 04:33
fonte

6 risposte

6

Oltre a un enum che è il modo più ovvio e chiaro di esprimere ciò, il sistema utilizzato per sistemi interoperabili in cui non è possibile esprimere un enum specifico della lingua è l'opzione -1/0/1.

Potresti provare una maschera di bit, dove 0 significa 0, 1 significa 'bit 2 set' e 2 significa 'bit 3 set' (cioè hai 3 bit che possono essere accesi o spenti. 'definisci 3, o bit 1 e 2 set, quindi sei bravo.Questa opzione è la migliore se pensi di aver bisogno di 4 o più flag in futuro dato che 4, 8, 16 ecc imposta i bit successivi).

Tutti questi elementi si inseriscono in un singolo tipo di dati a 8 bit, quindi non saranno sprechi di memoria o richiedere la conversione (come un sistema basato sui caratteri, a volte vengono utilizzati caratteri a 16 bit, a volte 8 bit a seconda della piattaforma) .

Non considererei nulla in ogni caso. Forse in un database, ma solo dove potrei garantire che il sistema avesse un supporto distinto per i NULL, e anche allora potrebbe essere soggetto a errori se qualcuno non avesse fatto esplicitamente la distinzione e finito con 0 quando era veramente nullo.

    
risposta data 03.07.2014 - 09:42
fonte
2

Non intendo scrivere direttamente una risposta chiara a questa domanda; come ho elogiato sopra, questa domanda dipende molto dal caso d'uso. In generale, tutte le scelte di implementazione elencate sembrano appropriate per scopi diversi, in momenti diversi.

Tuttavia, vorrei attirare la vostra attenzione su questi principi e conoscenze di base, in modo che possiate prendere la vostra decisione informata.

  • link
  • Comportamento di "coalizione" del database, come discusso in link
  • Piega, o Riduci, la funzione di ordine superiore, per cui "coalesce" è un esempio:
  • link , ancora un altro esempio
  • Media ponderata, link , che affronta il problema da un modo aritmetico rispetto al modo a valore logico.

Su una nota più leggera, leggi anche questa battuta: "Un uomo d'affari chiede a un contabile: cosa sono due più due?"

Chiede scusa a tutti i ragionieri e non contabili. Il mio accenno a questo scherzo è inteso a mettere in risalto la libertà di qualcosa che definiremo molto presto, e la responsabilità e conseguenze (entrambe in senso logico) che segue .

Domanda: qual è la tabella di verità di una logica a tre valori?

Risposta:

... got up from his chair, went over to the door, closed it, came back and sat down. Leaning across the desk,

... E tira fuori un grafico disegnato a mano su un pezzo di carta.

Operazione: logica e confidenziale - Bozza del terzo trimestre 2014

Falso True Terzo
Falso Falso False ?????
True Falso True ?????
Terzo ????? ????? ?????

... he said in a low voice, "how much what would you like those magic values to be?"

Un designer grafico chiede a un programmatore, "Puoi dare un esempio di logica a tre valori?"

Il programmatore risponde, "Puoi darmi due colori, che sono bianchi e neri come potrebbero essere?"

Progettista grafico: "così ... nero e bianco?"

Programmatore: "Esattamente, ora darò un terzo colore, ma dovrò specificarlo come numero ARGB. Spero non ti dispiaccia."

Progettista grafico: "bene lavoro con ARGB ogni giorno ..."

Black # FF000000
Bianco #FFFFFFFF
Niente # 00000000

Nota. In quanto sopra, il bianco e il nero sono colori completamente opachi. Il terzo colore, Nothing, è completamente trasparente. Quando vengono mescolati in vari rapporti, il Black and White si mescola per diventare vari grigi, ma mescolare in Nothing non cambia nulla.

    
risposta data 03.07.2014 - 11:06
fonte
1

Se i tre stati possibili hanno un significato intrinseco, usa qualcosa adatto a quel significato intrinseco. Ad esempio, gli stati possibili sono 1, 2 o 3, oppure se sono 100, 200 e 300, utilizzare un numero intero. Se gli stati possibili sono sì, no o sconosciuto, è possibile utilizzare un valore booleano o un puntatore facoltativo a un oggetto booleano, con la possibilità di non avere alcun valore, un valore "sì" o un valore "no". Anche se alcune persone potrebbero non piacere.

Se esiste un modo ovvio in cui gli interi possono essere interpretati come stati possibili, si può usare l'intero. Dire una funzione di confronto che ha stati "meno", "uguale", "maggiore" potrebbe usare -1, 0 e +1. Sebbene alcune persone potrebbero non trovare ovvio ciò che si trova ovvio.

Se esiste un modo ovvio su come interpretare le lettere come possibili stati, potresti usare un personaggio. Ad esempio, se i tuoi stati sono "rosso", "verde" o "blu", potresti usare le lettere "r", "g" e "b". Di nuovo, cosa ti è ovvio ...

Un tipo enumerato è sempre una possibilità. Una stringa è sempre una possibilità, ma si perde il controllo del tipo nella maggior parte delle lingue.

Alcune persone usano tre valori booleani per rappresentare "è nello stato 1", "è nello stato 2", "è nello stato 3".

Qualunque cosa tu faccia, dovresti essere guidata cercando di usare qualcosa che sia ovvio e comprensibile, non ti mette nei guai se all'improvviso hai quattro stati, e cerchiamo di trovare il più possibile errori nel compilatore.

    
risposta data 11.06.2016 - 18:08
fonte
0

What is the best datatype to store a three-state variable? Something capable or representing Positive, Neutral, and Negative.

Questo dipende molto dalla lingua, da cosa stai facendo, dal livello di astrazione (che dipende anche dalla lingua e così via).

Uso principalmente C ++ e qui ci sono molte scelte. Il più semplice è un enum tribool_state { false_val, true_val, undetermined_val } . Ciò sarebbe sufficiente se lo scenario di utilizzo è una singola funzione che restituisce questo tipo di valore.

Probabilmente userò boost::optional<bool> se volessi esprimere un risultato booleano che potrebbe essere impossibile ottenere (ad esempio verifica se i dati di rete ricevuti sono completi, quindi elabora il valore booleano se questo è il caso).

Vorrei utilizzare boost::tribool se volessi esprimere un risultato booleano fuzzy che supportava la logica booleana a tre stati completa (ad esempio true || indetermined -> true , false && indetermined -> false , true && indetermined -> indetermined e così via).

Allo stesso modo, in Python, vorrei usare un insieme di costanti, o una classe (di nuovo, a seconda del tipo di semantica / operazioni che avrei bisogno nel codice client):

Ad esempio, vorrei usare:

POSITIVE, INDETERMINED, NEGATIVE = 1, 0, -1

se avessi un semplice caso di una funzione che restituisce uno dei tre risultati.

Se avessi invece una libreria completa che richiede una logica booleana a tre stati, implementerei il tipo value come classe.

    
risposta data 03.07.2014 - 10:27
fonte
0

Se stai usando Java, puoi usare un oggetto booleano: poiché è un oggetto e contiene un booleano, può contenere i valori true, false e null. Non sono sicuro che sia comunque il modo migliore.

    
risposta data 10.06.2016 - 22:42
fonte
-6

In Microsoft.NET è presente un tipo "Tupla" che può essere utilizzato per le tue esigenze. Visita link

    
risposta data 03.07.2014 - 05:57
fonte

Leggi altre domande sui tag