Quindi ho letto valutazione del cortocircuito, è male pratica? , È una cattiva pratica usare la valutazione di cortocircuito invece di una clausola if? e alcune altre domande correlate, e capisco che è generalmente considerata una cattiva pratica usare la valutazione di cortocircuito per il controllo di flusso .
Sto provando a scrivere senza avvisi, ROC (Really Obvious Code), e sto cercando il modo migliore per fare solo il primo di una serie di azioni che restituiscono un valore di verità.
Il codice di cui sto effettuando il refactoring era in origine così:
this.initSingleTag(tags.open_at === '7', CombinedSearch.ITEMS.avail_morning, 'search-functions-open', 'morning') ||
this.initSingleTag(tags.open_at === '12', CombinedSearch.ITEMS.avail_midday, 'search-functions-open', 'midday') ||
this.initSingleTag(tags.open_at === '18', CombinedSearch.ITEMS.avail_evening, 'search-functions-open', 'evening') ||
this.initSingleTag(tags.open_at === '22', CombinedSearch.ITEMS.avail_late, 'search-functions-open', 'late');
Cercando di liberarlo dagli avvertimenti in JSHint, il mio refactor di prima esecuzione assomiglia a:
if (!this.initSingleTag(tags.open_at === '7', CombinedSearch.ITEMS.avail_morning, 'search-functions-open', 'morning')) {
if (!this.initSingleTag(tags.open_at === '12', CombinedSearch.ITEMS.avail_midday, 'search-functions-open', 'midday')) {
if (!this.initSingleTag(tags.open_at === '18', CombinedSearch.ITEMS.avail_evening, 'search-functions-open', 'evening')) {
this.initSingleTag(tags.open_at === '22', CombinedSearch.ITEMS.avail_late, 'search-functions-open', 'late');
}
}
}
Che sinceramente non mi sembra più leggibile. Esiste una pratica migliore comune per questo tipo di situazione?
Modifica: dopo aver postato un po 'la domanda e un po' di headscratch, mi sono reso conto che:
CombinedSearch.prototype.initFirstTruthyTag = function(tags) {
var that = this;
$.each(tags, function(i, parameters) {
return !(that.initSingleTag.apply(that, parameters));
});
};
... Più tardi ...
this.initFirstTruthyTag([
[tags.open_at === '7', CombinedSearch.ITEMS.avail_morning, 'search-functions-open', 'morning'],
[tags.open_at === '12', CombinedSearch.ITEMS.avail_midday, 'search-functions-open', 'midday'],
[tags.open_at === '18', CombinedSearch.ITEMS.avail_evening, 'search-functions-open', 'evening'],
[tags.open_at === '22', CombinedSearch.ITEMS.avail_late, 'search-functions-open', 'late']
]);
Anche se sono dolorosamente consapevole del fatto che il terzo parametro viene ripetuto più volte, è una sorta di linea laterale rispetto alla domanda originale (in più non sono sicuro che la conformità con DRY sia superiore alla coerenza con la chiamata alla funzione originale, che è ancora usato in tutto il resto del codice attorno a questa chiamata)