2017-11-11 3 views
1

Ich habe Bibliotheken gesehen, die beim Schreiben von Funktionen die Vorteile optionaler Parameter und Rückrufe nutzen. Ich schreibe eine Bibliothek, und ich würde gerne wissen, ob es eine gute Übung ist, dem Benutzer zu erlauben, die optionalen Parameter zu überspringen und einfach den Rückruf zu senden.Verwenden von Rückrufen mit optionalen Parametern

Zum Beispiel:

function listFiles(params, callback) { 
    if (typeof params === 'function' && !callback) { 
    callback = params; 
    params = {}; 
    } 
    // more code here... 
} 

Benutzer meiner Bibliothek kann listFiles() mit Parametern aufrufen:

listFiles({ verbose: true }, function callback(err, results) { /*... */ }) 

oder Weitergabe nur die callback() Funktion:

listFiles(function callback(err, results) { /*... */ }) 

Der Hauptvorteil sehe ich Bei diesem Ansatz müssen Benutzer Folgendes nicht tun:

listFiles(null, function callback(err, results) { /*... */ }) 

oder

listFiles({}, function callback(err, results) { /*... */ }) 

Das Problem ist, dass, wenn ich verbose einen erforderlichen Parameter mache ich brechen werden Benutzer, die nicht params zusammen mit denen, sendeten die leer oder null als params sendeten.

Sollte ich optionale Parameter als Rückruf verwenden oder ist das eine schlechte Idee?

+2

als Kommentar hinzufügen, weil dies eher eine Regel-of-Daumen ist: Wenn Sie vernünftig, dass das erste Argument erwarten beco könnte Ich brauche, machen Sie es nicht optional. Persönlich ist die Stabilität, die man durch das Setzen von "params" benötigt (anstatt nur den Callback zu erlauben), besser als der kleine Vorteil, dass man nicht "null" oder "{}" angeben muss. – FeifanZ

+0

Warum Parameter nicht den zweiten Parameter machen? Dann könnten Sie einfach feststellen, ob es definiert ist oder nicht. –

+1

@ChrisHappy spricht nicht für OP, aber Callback-as-Last-Argument ist eine weit verbreitete JS-Konvention. IMO wäre es schlimmer, mit dem – FeifanZ

Antwort

2

Warum nicht callback eines der Parameter so Benutzer immer ein einziges Argument an listFiles() übergeben?

function listFiles(params) { 
    // ... check for optional params and do something with them 
    params.callback(err, result); 
} 

Jetzt als Benutzer kann ich die optionalen params übergeben, wenn ich (mit limit und sort als Beispiele) wollen:

listFiles({ 
    limit: 10, 
    sort: 'desc', 
    callback: (err, result) => { 
     // ... do something with result 
    } 
}); 

Oder nur die erforderliche callback param wenn ich listFiles() zulassen möchten, bieten Vorgaben für mich:

listFiles({ 
    callback: (err, result) => { 
     // ... do something with result 
    } 
}); 
Verwandte Themen