Restituisce un oggetto o falso in lingue dinamiche

6

Considera la seguente funzione JavaScript:

function Foo() {
  function getPreferences() {
    if ([there is an existing preferences object]) {
      return preferences;
    }
    return false;
  }
}

Il codice chiamante è:

var foo = new Foo();
var prefs = foo.getPreferences();
if (prefs) {
  // do something with prefs
}
  • Il modello di restituire un oggetto se esiste, o falso in altro modo, visto come una buona o cattiva pratica? Altre alternative che posso vedere sono di restituire un oggetto vuoto {} o null.
  • Questo modello ha un nome?
posta Sean 06.02.2012 - 22:51
fonte

6 risposte

12

False sembra una scelta strana. null sembra più naturale. Meglio ancora, restituisci le preferenze predefinite ed elimina if (prefs) .

    
risposta data 06.02.2012 - 22:57
fonte
6

Preferirei molto vedere il codice che restituisce un oggetto per il successo e null per non avere successo. Quindi, almeno sembra che la funzione si comporti in modo coerente. Restituisce o un oggetto o il modo standard di dire nessun oggetto null . Lo stesso codice:

if (prefs) {
    // do something
} 

funziona in entrambi i modi, ma restituire null sembra più coerente per me (come la mancanza di un oggetto) che restituire false .

    
risposta data 06.02.2012 - 23:01
fonte
4

È necessario restituire un valore predefinito o generare un'eccezione. Mi piace lanciare eccezioni per cose obbligatorie e fornire valori predefiniti per cose facoltative. L'utilizzo di null rende il debug un po 'più icky e preclude una chiave che ha come valore null.

 function Foo() {
       function getParameter(name) {
               if ( [name does not exist] ) {
                    throw "no such key";
               }
               return [parameter value]
       }
 }
    
risposta data 06.02.2012 - 23:22
fonte
3

Questa risposta differisce dagli altri perché ho preso in considerazione il tuo caso d'uso specifico . In qualsiasi altro giorno, utilizzerei il controllo del valore null .

In questo caso specifico, probabilmente non utilizzerei nessuno dei tuoi metodi. Molto probabilmente utilizzerò un oggetto per preferenze con un numero di coppie chiave / valore predefinite per qualsiasi impostazione di cui ho bisogno. In questo modo, non è necessario alcun involucro speciale in alcun codice (i controlli per if(prefs) non sono necessari).

Considera il seguente codice (come penso che farei comunque per implementarlo):

function MyClass(o) {
    this.prefs = {
        var1: 0,
        var2: 1,
        var3: 2
    };
    for(key in o) {
        this.prefs[key] = o[key];
    }
}

MyClass.prototype.doFunc = function() {
    console.log(this.prefs.var1);
    console.log(this.prefs.var2);
    console.log(this.prefs.var3);
}

var o = new MyClass();
o.doFunc();

var p = new MyClass({var2: "foo"});
p.doFunc();

( link )

    
risposta data 06.02.2012 - 23:19
fonte
2

Si vede molto di quel modello in javascript a causa della "creatività" di javascript gestione dei valori di falsi .

Mentre è possibile fare cose belle in javascript, non sono sicuro che un linguaggio progettato nell'arco di dieci giorni sia qualcosa che dovresti emulare.

    
risposta data 06.02.2012 - 23:19
fonte
2

Come hanno detto altre persone, è null che deve essere restituito, invece di false . Anche con linguaggi strongmente tipizzati, potresti aspettarti false da un metodo, che avrà un significato diverso da null . È ancora più importante nelle lingue senza controllo del tipo. Ad esempio, PHP ha un problema simile, perfettamente illustrato quando si utilizza il metodo readdir (sotto, citazione e codice sorgente dal manuale PHP):

Please note the fashion in which readdir()'s return value is checked in the examples below. We are explicitly testing whether the return value is identical to (equal to and of the same type as--see Comparison Operators for more information) FALSE since otherwise, any directory entry whose name evaluates to FALSE will stop the loop (e.g. a directory named "0").

/* This is the correct way to loop over the directory. */
while (false !== ($entry = readdir($handle))) {
    echo "$entry\n";
}

/* This is the WRONG way to loop over the directory. */
while ($entry = readdir($handle)) {
    echo "$entry\n";
}
    
risposta data 06.02.2012 - 23:23
fonte

Leggi altre domande sui tag