确定客户是否可以修改或取消订单的最佳实践
Best practice on determining if an Order can be modified or cancelled by the customer
我目前正忙于对一个小型电子商务应用程序进行大量重构,客户可以在其中下订单(三明治等)。客户必须在特定时间之前下订单,以便公司可以保证订单将按时准备好。这是通过配置某些截止日期来完成的。还有一个截止日期,告诉我们客户可以修改或取消现有订单的时间。实际截止日期取决于选择的交货日期,因此每个订单都不同。
此时我们只是在需要时即时计算截止日期。截止日期结果只是DateTime
。计算逻辑本身已经在一个地方 (IDeadlineValidator
),因为它需要调用数据库来获取一些额外的数据,我们只是不想在整个应用程序中重复它(DRY 原则)。但是这个 IDeadlineValidator
在整个应用程序中都被调用,因为截止日期也用于操纵 UI(显示修改按钮和其他东西)。但它变得有点混乱,我相信有更好的方法来做到这一点。
我现在的问题是:确定订单是否可以修改的最佳实践有哪些?
我也在寻找最好的表现。
我已经想到的几个解决方案是:
- 下订单后立即计算截止日期并将其存储在数据库中,例如
CanModifyUntil
。然后应用程序必须检查是否 CanModifyUntil < CurrentDate
.
- 使用默认值
true
存储一个布尔值 CanModify
并每隔半小时左右在后台(重新)计算一次,直到该值变为 false
.
- 第三个选项是前两个选项的混合体。下订单后,将
CanModify
设置为 true
,计算截止日期,然后在实际截止日期安排后台作业,只需将 CanModify
切换为 false
。
- 或者保持原样...
你有什么想法?
如果可以预先计算截止日期并且它是决定订单是否可以更改的唯一因素,我喜欢您提出的第一个选项,即计算一次然后存储结果。如果您想抽象它以防它发生变化,您仍然可以在服务方法中进行检查。
此选项可以帮助您稍微优化一下前端代码(我假设这是 client/server 使用网络客户端)- 因为您可以检查 enable/disable 按钮在前端。当然,为了安全起见,如果有人直接调用您的 API,您仍然需要在服务器端进行检查,但这意味着您不会仅仅为了渲染前端而进行额外的调用.
其他两个选项听起来过于复杂 - 如果计时器由于某种原因未能触发怎么办?逻辑现在是解耦的,订单理论上可以以无效状态结束,因为您的状态操作逻辑位于其他地方。
为什么不能在数据库中存储订单的时间戳?
然后在你的UI中,每当你需要显示你现有的订单时,(你添加静态允许的剩余时间)来判断这个订单是否被修改(Can/Cant)
如果您要显示订单列表,则相同。您将有每个 Order.getOrderTime() + 剩余时间。
我假设计算截止日期的方式是由 (Order datetime + someNumber) 决定的,所以只需保存点击订单时的时间戳。
对于新订单,您的时间戳是 now(),您的截止日期是 now() + 静态剩余时间。
要确定订单是否 modifiable/expired,您可以再次使用您的 now - () - (Order.getOrderTimpe() + leaway) > nminutes ?确定订单是真的旧订单还是新订单。
我目前正忙于对一个小型电子商务应用程序进行大量重构,客户可以在其中下订单(三明治等)。客户必须在特定时间之前下订单,以便公司可以保证订单将按时准备好。这是通过配置某些截止日期来完成的。还有一个截止日期,告诉我们客户可以修改或取消现有订单的时间。实际截止日期取决于选择的交货日期,因此每个订单都不同。
此时我们只是在需要时即时计算截止日期。截止日期结果只是DateTime
。计算逻辑本身已经在一个地方 (IDeadlineValidator
),因为它需要调用数据库来获取一些额外的数据,我们只是不想在整个应用程序中重复它(DRY 原则)。但是这个 IDeadlineValidator
在整个应用程序中都被调用,因为截止日期也用于操纵 UI(显示修改按钮和其他东西)。但它变得有点混乱,我相信有更好的方法来做到这一点。
我现在的问题是:确定订单是否可以修改的最佳实践有哪些? 我也在寻找最好的表现。
我已经想到的几个解决方案是:
- 下订单后立即计算截止日期并将其存储在数据库中,例如
CanModifyUntil
。然后应用程序必须检查是否CanModifyUntil < CurrentDate
. - 使用默认值
true
存储一个布尔值CanModify
并每隔半小时左右在后台(重新)计算一次,直到该值变为false
. - 第三个选项是前两个选项的混合体。下订单后,将
CanModify
设置为true
,计算截止日期,然后在实际截止日期安排后台作业,只需将CanModify
切换为false
。 - 或者保持原样...
你有什么想法?
如果可以预先计算截止日期并且它是决定订单是否可以更改的唯一因素,我喜欢您提出的第一个选项,即计算一次然后存储结果。如果您想抽象它以防它发生变化,您仍然可以在服务方法中进行检查。
此选项可以帮助您稍微优化一下前端代码(我假设这是 client/server 使用网络客户端)- 因为您可以检查 enable/disable 按钮在前端。当然,为了安全起见,如果有人直接调用您的 API,您仍然需要在服务器端进行检查,但这意味着您不会仅仅为了渲染前端而进行额外的调用.
其他两个选项听起来过于复杂 - 如果计时器由于某种原因未能触发怎么办?逻辑现在是解耦的,订单理论上可以以无效状态结束,因为您的状态操作逻辑位于其他地方。
为什么不能在数据库中存储订单的时间戳?
然后在你的UI中,每当你需要显示你现有的订单时,(你添加静态允许的剩余时间)来判断这个订单是否被修改(Can/Cant)
如果您要显示订单列表,则相同。您将有每个 Order.getOrderTime() + 剩余时间。
我假设计算截止日期的方式是由 (Order datetime + someNumber) 决定的,所以只需保存点击订单时的时间戳。
对于新订单,您的时间戳是 now(),您的截止日期是 now() + 静态剩余时间。
要确定订单是否 modifiable/expired,您可以再次使用您的 now - () - (Order.getOrderTimpe() + leaway) > nminutes ?确定订单是真的旧订单还是新订单。