Vedresti qualche uso di un Trilean (True, False, ??) [chiuso]

22

A volte ho una funzione che dovrebbe restituire true o false. Ma a volte tre possibili valori avrebbero più senso.

In alcune lingue i casi sarebbero trattati con numeri interi o con eccezioni.

Per esempio, vuoi gestire l'età di un utente se ha più di 18 anni. E tu hai una funzione come questa.

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

Ma in alcuni casi, a seconda di come è costruita la tua app, potrei vedere il caso in cui il campo del compleanno è incompleto. Quindi questa funzione dovrebbe restituire qualcosa di indeterminato.

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

Come ho detto, possiamo gestirlo con Exceptions e Int, ma troverei piuttosto sexy avere un vero, falso, indeterminato embeded nella lingua invece di usare alcune costanti definite da casa.

    
posta Loïc Faure-Lacroix 30.12.2010 - 15:44
fonte

12 risposte

33

Questo può essere gestito con enumerazioni, numeri interi, simboli (es. Lisp, Ruby), tipi nullable (usa null come stato indeterminato), tipi di opzioni (es. ML), o qualche costrutto simile - a seconda della tua lingua .

Quindi, mentre il tuo esempio e la logica sono validi, non riesco a vedere che si trova nell'elenco delle funzionalità linguistiche da sviluppare.

    
risposta data 30.12.2010 - 15:48
fonte
5

Non ho visto un caso in cui è necessario. Nell'esempio che hai fornito, se quel campo è necessario dovrebbe essere stato convalidato altrove. isAdult() è fondamentalmente un metodo a due stati: tu sei o non sei. Non c'è bisogno di farlo fare altro che restituire false se incontra dati che non può gestire. Ad esempio:

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}
    
risposta data 30.12.2010 - 15:51
fonte
5

vero, falso, sconosciuto

sì, no, forse

in C # puoi usare un valore nullo bool (potresti ritirarti in horror ora)

in MS-SQL, puoi usare un campo di bit nullable (idem)

    
risposta data 30.12.2010 - 16:14
fonte
2

In C ++, questo può essere gestito con un tipo di ritorno non- bool o generando un'eccezione. Se desideri un tipo di ritorno a tre valori, utilizza enum . Non è così sexy, ma funziona, e ciò che è più importante è che tu possa farlo senza rovinare la lingua per il resto di noi.

Il fatto che bool sia a tre valori potrebbe causare problemi. Come gestisci bool foo; ... if (foo)... , supponendo che foo possa avere uno dei tre valori? Ci sono vantaggi nell'avere bool variabili tali che precisamente uno di foo e !foo è vero in ogni momento. Aiuta la ragione sui programmi.

Scopri cosa fanno le persone nell'elaborazione numerica quando potrebbero ottenere valori di NaN . È complicato. Preferirei non doverlo utilizzare per l'ordinaria elaborazione booleana.

Se vuoi .isAdult() per gestire informazioni insufficienti, fallo internamente e poi restituisci true o false . Altrimenti, ogni volta che lo usi, devi controllare il codice di ritorno prima di fare qualsiasi altra cosa e trovare un modo per gestirlo. Significa che dovresti controllare i documenti per vedere se una funzione ha effettivamente fatto ciò che il suo nome ha detto che ha fatto, e che sarebbe stato un disastro per la leggibilità.

    
risposta data 30.12.2010 - 16:10
fonte
2

L'idea è abbastanza utile. C'è un intero campo dedicato alla gestione dell'incertezza chiamata Fuzzy Logic .

Fortunatamente per noi programmatori, puoi implementare la logica fuzzy con le funzionalità di linguaggio standard.

Ad esempio, nel caso in cui hai dato, le informazioni incerte sono facilmente determinabili chiedendo all'utente. Quindi un enum a tre stati come te descrive funzionerà bene.

Ci sono tutti i tipi di altri modi per essere incerti. Tali domande includono:

  • Pioverà domani? Non è ancora successo, quindi nessuno può saperlo - ma puoi fare un'ipotesi plausibile e dare una probabilità.
  • C'è vita multicellulare su un pianeta nel sistema solare della stella Beta Pictoris? Ha una risposta definita sì o no, ma al momento non possiamo dire cosa sia.

Molte di queste domande possono essere trattate usando le probabilità nell'intervallo 0.0 (falso) a 1.0 (vero) e applicando la matematica a virgola mobile.

Un chimico e scienziato informatico di nome David E. Shaw ha applicato questo tipo di cose a Wall Street e ora vale circa $ 2,5 miliardi. Quindi sì, è utile. : -)

    
risposta data 30.12.2010 - 20:33
fonte
1

Molti anni fa ho giocato con alcuni degli algoritmi che venivano fuori per assegnare una credenza ai valori. Era divertente. In definitiva, ciò che ho guadagnato è che il booleano è spesso un adattamento forzato. In realtà dovrebbe essere un trileno vero / falso / altro valore. In una sperimentazione che sembrava condurre al "miglior" codice per me in quel momento. Da allora sono andato in rovina e faccio quello che fanno tutti, mentre penso internamente quanto potrebbe essere più semplice se avessimo smesso di fare le cose allo stesso modo ...: -)

    
risposta data 30.12.2010 - 20:24
fonte
0

Le istruzioni Case o Switch funzionerebbero bene per questo, però, usando numeri interi per gestire arbitrariamente lo switch.

Inoltre, in Ruby, mentre 'nil' ritorna come falso in alcune circostanze, se usi l'operatore di uguaglianza, nil == false restituisce false , quindi potresti usare ruby nil per gestire la logica ternaria.

    
risposta data 30.12.2010 - 18:26
fonte
0

Un'altra opzione nel tuo caso potrebbe essere quella di invertire il controllo applicando il principio "tell non chiedere" e cambiarlo (scusa per la parola adultness, blocco del cervello):

user.isAdult(new OnlyAllowAdultsToLogin())

dove OnlyAllowAdultsToLoginStrategy implementa un'interfaccia:

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}
    
risposta data 30.12.2010 - 19:30
fonte
0

Mio figlio mi stava chiedendo come implementare in modo efficiente i test che assomigliano a questo. Le flag testate erano solo vere / false, ma i matchkeys avevano tre stati (deve essere vero, deve essere falso o non mi interessa). Naturalmente questo può essere implementato con una struttura dati a 2 bit e un po 'di bit twiddling, ma quel tipo di codice ha davvero bisogno di essere commentato in quanto lo scopo non è facile da distinguere dal solo guardare il codice.

    
risposta data 30.12.2010 - 21:57
fonte
0

C ha questa funzione implementata nella maggior parte delle funzioni della libreria. per esempio strcmp confronta 2 stringhe e restituisce 0 se sono uguali, 1 (cioè qualsiasi numero intero positivo) se il primo è "maggiore" del secondo e -1 (cioè qualsiasi numero intero negativo) se il secondo è maggiore del primo .

Lo stesso approccio può essere usato altrove, + / 0 / - come il tuo tri-stato. Consente inoltre di eseguire la logica booleana sui valori se si conosce 0 se falso e qualsiasi altro valore è true.

    
risposta data 28.07.2011 - 23:46
fonte
0

Per C ++, Boost implementa in realtà un Tribool descritto come tale:

The tribool class acts like the built-in bool type, but for 3-state boolean logic. The three states are true, false, and indeterminate, where the first two states are equivalent to those of the C++ bool type and the last state represents an unknown boolean value (that may be true or false, we don't know).

    
risposta data 17.12.2011 - 07:08
fonte
-1

La casella di controllo VB6 ha questa capacità. I valori della casella di controllo possono essere 0 = off, 1 = on, 2 = grayed

    
risposta data 31.12.2010 - 22:31
fonte

Leggi altre domande sui tag