Va bene avere un contrassegno singolo e usare il valore -1 come "disabilitato"?

5

Ho una situazione del genere:

if (FLAG && number_of_kittens > FLAG_VALUE) {

}

La logica generale dell'applicazione è che FLAG_VALUE non ha senso per essere negativo.

Il mio suggerimento era di usare -1 per indicare che è disabilitato. La mia motivazione principale era evitare la confusione ... Ma non ho dati o prove empiriche per sostenere la mia richiesta. Qual è la pratica consigliata in situazioni come questa?

Spero di aver mirato a destra: link

    
posta Michal Stefanow 26.04.2017 - 17:08
fonte

5 risposte

12

Questa è una cattiva idea.

Che cosa succede se due negozi si fondono: 1 negozio ha 8 cuccioli. L'altro negozio non vende cuccioli.

Ora si uniscono e tu aggiungi tutto lo spazio pubblicitario insieme e all'improvviso scopri che il negozio combinato ha 7 cuccioli.

Quindi, anche se potrebbe sembrare una soluzione facile ora, per tutto il tempo dovresti controllare se il flag è abilitato o meno e solo dopo puoi fare calcoli matematici su di esso.

    
risposta data 26.04.2017 - 19:41
fonte
12

Questa è generalmente una cattiva idea. Si chiama valore sentinella, ed è scoraggiato nella maggior parte delle lingue, perché confonde due preoccupazioni diverse in un singolo valore.

Il problema è che puoi facilmente dimenticare di controllare il valore "magico" e la lingua non ti aiuterà poiché i due casi distinti sono espressi come lo stesso tipo. Se si aggiungono "3 gattini" a "disabilitato", si otterrà "2 gattini" che è ingannevolmente sbagliato poiché sembra un risultato corretto. Questo è il peggior tipo di bug.

Dovresti avere numero di gattini e FLAG in due diverse variabili / campi. Oppure potresti usare un tipo Option o un int nullo, a seconda di cosa fornisce la lingua.

    
risposta data 26.04.2017 - 17:58
fonte
4

Non è chiaro in che modo stai usando queste variabili, e trovo che il codice sia confuso da leggere.

Più facile da leggere e amp; capire sarebbe qualcosa di simile:

bool kittens_enabled;
int number_of_kittens;
int min_num_kittens = 2; //2 is default.
//... stuff happens ...
if (kittens_enabled && number_of_kittens > min_num_kittens) {

}

Non so se questo cattura il significato di ciò che stai cercando di fare, ma i nomi delle variabili hanno più senso per me.

    
risposta data 26.04.2017 - 18:57
fonte
3

A meno che tu non sia gravemente limitato per la memoria, sconsiglio vivamente di usare una variabile per rappresentare due cose. Se tu lavorassi per me, lo proibirei:)

Se utilizzare due variabili sarà un problema, è accettabile utilizzare una variabile per rappresentare due cose come hai descritto.

    
risposta data 26.04.2017 - 18:08
fonte
3

Bene "-1" significa disabilitato per te, ma per quanto riguarda un altro programmatore a 6 mesi lungo la strada? Diventa meno attraente allora. Se la lingua supporta i tipi nulli, questo sarebbe più pulito:

    const int numberOfKittens = 10;
    int? flag = null;

    if (flag.HasValue && numberOfKittens > flag.Value)
    {
        //DoSomething
    }

Quindi non c'è magia -1 coinvolta.

    
risposta data 26.04.2017 - 18:38
fonte

Leggi altre domande sui tag