Контекст:
Мы пишем логику для компонента регистрации. Если пользователь не аутентифицирован, должна появиться форма. Если / когда пользователь аутентифицирован, он должен перенаправить в одно из нескольких мест. Если есть непрочитанные сообщения, перенаправьте на первое. Если непрочитанных сообщений нет, перенаправьте их на панель управления.
Есть еще один сценарий, который нам нужно обработать. Когда приходит новое сообщение, пользователь может получить уведомление по электронной почте со ссылкой на форму входа плюс параметр запроса с идентификатором конкретного сообщения. Пример: /signin?new_message=42
. В этих ситуациях, форма входа должна появиться, если пользователь в настоящее время не аутентифицирован;если / когда пользователь проходит аутентификацию, перенаправьте на это конкретное сообщение.
Мой вопрос:
Как мы можем реализовать это в элегантном и расширяемом путь?
Я подозреваю , что конечный автомат является подходящим инструментом для этой работы, но я открыт для других подходов. Я подчеркнул слово расширяемый , потому что это не код гольф! Я ищу реальное решение, которое может изящно масштабироваться, чтобы включать дополнительную бизнес-логику в будущем.
ПРИМЕЧАНИЕ. На самом деле меня не волнует конкретно javascript, но в рекомендациях StackOverflow особое внимание уделяется специфике, а JS - это язык, который я использую. Следовательно, приемлемый ответ может использовать псевдокод, если он концептуально совместим с javaScript. (Не используйте псевдокод, который работает только в Go)
Оповещение о спойлере! Вот неправильный ответ:
if (authed && hasUnreadMessages && !clickFromEmail) {
redirect = `/messages/${fistUnreadMessageId}`;
}
if (authed && !hasUnreadMessages && !clickFromEmail) {
redirect = `/dashboard`
}
if (authed && clickFromEmail) {
redirect = `/messages/${messageIdFromQueryString}`
}
...
^ Грязный клубок вложенных условных выражений - это проблема , которую мы пытаемся решить.
НЕ мой вопрос
Это пример из реальной жизни, но главная цель моего вопроса - узнать о реализации сложной логики принятия решений. Поэтому я не интересуюсь архитектурными решениями, которые полностью избегают этой логики. Пример: «Создание разных форм / конечных точек для обработки разных сценариев»
Меня также не интересуют решения, основанные на конкретной библиотеке. Пример: «Вы должны просто использовать ComplexSigninLibrary.js»
Советы по дизайну продукта или UX также упускают смысл этого вопроса. Пример: «Было бы лучше, если бы пользователь напрямую связывался с уведомлениями по электронной почте с новыми сообщениями... "