JavaScript CPS (стиль передачи продолжения) реализация

Я вид чувства, вынужденного протестировать закрытые функции, поскольку я следую все больше одной из нашей последней рекомендации QA в нашем проекте:

Не больше, чем 10 в цикломатическая сложность на функцию.

Теперь побочный эффект осуществления этой политики состоит в том, что многие мои очень большие государственные функции разделены на более сфокусированный, лучшее, именованное частный функция.
государственная функция все еще там (конечно), но по существу уменьшается до названного все те частные 'подфункции'

, Который на самом деле прохладен, потому что стек вызовов теперь намного легче считать (вместо ошибки в большой функции, у меня есть ошибка в sub-sub-function с названием предыдущих функций в стеке вызовов, чтобы помочь мне понять, 'как я добрался там')

Однако, это теперь кажется легче модульному тесту непосредственно те частный функции и оставляет тестирование большой государственной функции к некоторому тесту 'интеграции', где сценарий должен быть обращен.

Просто мои 2 цента.

5
задан Delirium tremens 30 November 2009 в 17:59
поделиться

2 ответа

Стиль передачи продолжения плохо сочетается с циклами JavaScript. Вам нужно найти другой способ выполнения цикла.

Обратите внимание, что ваш код интерпретируется следующим образом:

function test() {
    *part 1*
    if (*condition*) {
        getter();
    }                               // <--- note indentation here
    function continuationtest(a) {  // <--- and here
    }
    *use a*
    *part 2*
}

Таким образом, вы в настоящее время вообще не используете стиль передачи продолжения. Когда getter () вызывает continuetest () , это, вероятно, дает сбой, поскольку continuationtest () не входит в область его действия.

Пример CPS с циклом может выглядеть так.

Без CPS

function doSomething(i) {
    alert("doing " + i);
}

function doLoop() {
    for (i = 0; i < 9; i++)
        doSomething(i);
}

С CPS

function doSomething(i, ctn) {
    alert("doing " + i);
    ctn();
}

function doLoop() {
    doLoopStartingAt(0);

    function doLoopStartingAt(i) {
        if (i < 9)
            doSomething(i, function ctn() { doLoopStartingAt(i + 1); });
    }
}

(Преимущество CPS состоит в том, что в любой момент вы можете использовать setTimeout () , чтобы отложить выполнение остальных операций или дождаться пользовательский ввод будет обработан, или избегайте отображения в браузере всплывающего окна «медленный сценарий».)

7
ответ дан 14 December 2019 в 08:53
поделиться

У вас есть опечатка:

function continuationtest(a) {
    }
    *use a*
    *part 2*
}

Это может быть то, что вы хотели:

function continuationtest(a) {
    *use a*
    *part 2*
}

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

0
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: