Запрашивать у пользователя подтверждение в середине процесса - PullRequest
3 голосов
/ 09 ноября 2010

Я ищу хороший подход к , иногда , чтобы приостановить действие (вызов функции / метода), пока пользователь не подтвердит, что он хочет выполнить определенную часть этого действия.Мне нужно сделать это в среде, которая не позволяет остановить выполнение кода (в моем случае ActionScript, но подход для JavaScript должен быть идентичным).

Для иллюстрации это макетдействие перед вводом пользовательской подсказки:

<preliminary-phase> // this contains data needed by all the following phases //

<mandatory-phase> // this will be always be executed //

<optional-phase> // this will always execute too, if in this form, but in some cases we need to ask the user if he wants to do it //

<ending-phase> // also mandatory //

Что мне нужно, это вставить условное приглашение пользователя, «Хотите ли вы выполнить эту часть?», И делать <optional-phase> только если пользователь хочет.

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed> and not <user-response-is-positive>){
    <do-nothing>
}
else{
    <optional-phase>
}

<ending-phase>

При попытке сделать это в ActionScript / JavaScript у меня получилось что-то вроде этого:

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(callback = function(){
        if(<user-response-is-positive>)
            <optional-phase>
        <ending-phase>
    });
    return;
}

<optional-phase>

<ending-phase>

Теперь и 1015 *, и <ending-phase> дублированы.Кроме того, поскольку они используют объекты, созданные в <preliminary-phase>, я не могу переместить их во внешние функции, не передав все данные этим функциям.

Мое текущее решение состоит в том, что я включил каждый из <optional-phase> и <ending-phase> в некоторые локальные функции (чтобы они имели доступ к данным в <preliminary-phase>), объявленные до того, как я запросил подтверждение и вызвал эти функциивместо того, чтобы дублировать код, но кажется неправильным, что код уже не в том порядке, в котором он выполняется.

Что бы вы порекомендовали, ребята?

Примечания:
1. askForConfirmation - это неблокирующая функция.Это означает, что код, который следует за его вызовом, выполняется немедленно (вот почему у меня есть return; в моем подходе).

Ответы [ 4 ]

3 голосов
/ 09 ноября 2010

Примечание: я не уверен на 100%, что понимаю ваши точные обстоятельства.

Шаблон команд может быть здесь уместен.Это похоже на то, что предлагают люди.

У вас есть массив команд, которые выполняются по порядку.

[<preliminary-phase>, <mandatory-phase>, <optional-phase>, <ending-phase>]

Просто сдвиньте команды из массива по одной и вызовите команду executemethod.

На необязательном этапе проверьте, требуется ли подтверждение пользователя, если нет, то выполните необязательный метод кода, который отправляет событие завершения команды, если требуется, затем показывает предупреждение, дождитесьсобытие, проверьте результат и отправьте событие завершения команды или вызовите необязательный метод (который запустит, а затем отправит команду завершения).

Вы также можете создать дерево команд, чтобы четко определить состояние потока.выполнения без необходимости связываться с массивом.

Так работают программы, подобные мастерам установки.

Хорошо, что порядок выполнения приятный и видимый, а ваш код хорошо разбит на частив куски, и сложность каждого шага заключена в капсулу.Например, дополнительная фаза ничего не знает о конечной фазе.Факультативный этап знает только то, что пользователю может потребоваться запрос перед выполнением, и он обрабатывает все это внутренне.

http://en.wikipedia.org/wiki/Command_pattern

"Использование объектов команд упрощаетдля создания общих компонентов, которые необходимо делегировать, sequence или выполнять вызовы методов во время их выбора ... "

1 голос
/ 09 ноября 2010

"код больше не в том порядке, в котором он выполняется", мне кажется, на самом деле все в порядке. Хорошо иметь код, который написан не в том порядке, в котором он выполняется, если он понятен. Фактически, поскольку ваш код выполняется в переменных порядках, я думаю, что вы не сможете написать его в том порядке, в котором он будет выполняться без дублирования кода, что является гораздо большим злом. Выберите правильные имена функций, и ваш подход пройдет мою проверку кода.

<preliminary-phase>

<mandatory-phase>

var optional_phase = function() {
  <optional-phase>
}

var ending_phase = function() {
  <ending-phase>
}

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            optional_phase();
        ending_phase();
    });
    return;
}

optional_phase();
ending_phase();
0 голосов
/ 09 ноября 2010

Не большое изменение, но при условии, что этот поток работает, дополнительная фаза не повторяется

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
      if(<user-response-is-negative>)
      {
        <ending-phase>
        return;
      }
  });
}

<optional-phase>
<ending-phase>
0 голосов
/ 09 ноября 2010

Это делает то, что вы просите?

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            <optional-phase-as-local-function>
        <ending-phase-as-local-function>
    });
} else {
    <optional-phase-as-local-function>
    <ending-phase-as-local-function>
}
...