上下文:
我们正在为注册组件编写逻辑。如果用户未通过身份验证,则应显示该表单。如果/当用户通过身份验证时,它应该重定向到多个位置之一。如果有未读消息,请重定向到第一条消息。如果没有未读消息,请重定向到仪表板。
我们还需要处理另一种情况。当收到新邮件时,用户可以收到一封电子邮件通知,其中包含指向登录表单加的链接,其中包含特定邮件ID的查询参数。例如:/signin?new_message=42
。在这种情况下,如果用户当前未通过身份验证,则应显示登录表单;如果/当用户通过身份验证时,请重定向到该特定消息。
我的问题:
我们如何以一种优雅而又可扩展的方式实现这一目标?
我怀疑,state machine是完成这项工作的正确工具,但我愿意接受其他方法。我强调了 extendible 一词,因为这不是代码高尔夫!我正在寻找一个现实的解决方案,该解决方案可以在将来进行适当扩展以包含其他业务逻辑。
注意:我实际上并不特别在意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”
产品设计或用户体验建议也遗漏了此问题的要点,例如:“直接从电子邮件通知链接到新消息将是更好的用户体验...”