Какой смысл не иметь побочных эффектов, если мне нужно 3 цикла вместо одного, чтобы сделать это?

Представьте, что у меня есть список объектов, которые являются вопросами. Я должен найти, видимы ли они, и если они видны, я должен также изменить их ответ на видимый. (Пример может быть не практичным, это просто пример) Если это не способ побочных эффектов (не так ли?):

questions.filter(function(question) {
    return question.isVisible;
})
.map(function(visibleQuestion) {
    return getAnswer(visibleQuestion);
})
.map(function(answer) {
    answer.isVisible = true;
});

и это побочный эффект:

questions.forEach(function(question) {
    if (question.isVisible) {
        var answer = getAnswer(visibleQuestion);
        answer.isVisible = true;
    }
});

Зачем выбирать способ без побочных эффектов, если вам приходится повторять 3 раза, чтобы выполнить свою работу?

PS. Я могу ошибаться в отношении того, что является побочным эффектом, а что нет, и что на самом деле было бы двумя способами справиться с этим.

1 ответ

Решение

Аргумент против обратных вызовов и побочных эффектов связан с ремонтопригодностью и восстановлением стека вызовов, поэтому мы можем использовать такие ключевые слова, как throw а также return,

Приведенный вами пример, безусловно, делает его простым инженерным компромиссом между удобочитаемостью и эффективностью. При этом, используя библиотеку обещаний, вы можете достичь тех же результатов без обратного вызова / побочного эффекта - все в одном цикле.

promise.all(questions.map(function(question) {
        if (question.isVisible) {
            resolve(getAnswer(question));
        }
    }).then(function (arResults) {
        arResults.forEach(function(answer) {
            answer.isVisible = true;
            console.log(answer)
        });
    });
Другие вопросы по тегам