Я не совсем уверен в правильном названии того, что пытаюсь описать. Схема принятия решений, матрица решений, блок-схема ...
Как лучше всего реализовать поток, который по сути является шаговым двигателем «Выбери свое собственное приключение» или блок-схемой, превращенной в степпер?
Например, у вас есть пользовательский интерфейс с шагами, а следующий и предыдущий шаг, которые появятся, зависят от данных с предыдущего шага. Прямо сейчас у меня есть оператор switch, чтобы определить, какой шаг должен появиться, и очень уродливая логика, чтобы определить, какой шаг должен быть следующим или предыдущим.
(Я использую React для рендеринга компонентов на каждом этапе, но я не думаю, что это имеет большое значение в отношении вопроса).
renderStep = () => {
switch (currentStep) {
case 1:
return <FirstStep/>
case 2:
return <SecondStep />
case 2.5:
return <SecondStepA />
case 3:
return <ThirdStep />
case 3.25:
return <ThirdStepA />
case 3.5:
return <ThirdStepB />
case 3.75:
return <ThirdStepC />
case 4:
return <FourthStep />
default:
return null
}
}
Теперь нажатие «Далее» или «Назад» отправит данные и определит для каждого шага, к какому шагу перейти. Если бы поток был линейным, это было бы очень просто - обновить данные, увеличить или уменьшить на единицу. Но с условным потоком все усложняется.
goToPreviousStep = () => {
const { currentStep } = this.state
this.setState(prevState => {
if (currentStep === 4 && prevState.someDataHappened) {
return { currentStep: prevState.currentStep - 0.5 }
} else if (currentStep === 3.5) {
return { currentStep: prevState.currentStep - 0.5 }
} else {
return { currentStep: prevState.currentStep - 1 }
}
})
}
Потенциально попытка поддержать дополнительное вложение помимо этого было бы еще более сложной задачей. По мере роста я знаю, что это станет недостижимым, но я не могу найти никаких хороших ресурсов для хранения этих данных в таблице или чего-то еще, чтобы сделать их более программными. Может ли кто-нибудь указать мне правильное направление?
Не уверен, что мне нужно написать какие-то недетерминированные конечные автоматы или что-то в этом роде ...
rule
класс. Отсюда вы можете выводить и создавать более сложные правила. Самым основным является этап обработки. Более сложным является правило ЕСЛИ. Этот список можно продолжить. - person Bibberty   schedule 04.12.2019