确定客户是否可以修改或取消订单的最佳实践

Best practice on determining if an Order can be modified or cancelled by the customer

我目前正忙于对一个小型电子商务应用程序进行大量重构,客户可以在其中下订单(三明治等)。客户必须在特定时间之前下订单,以便公司可以保证订单将按时准备好。这是通过配置某些截止日期来完成的。还有一个截止日期,告诉我们客户可以修改或取消现有订单的时间。实际截止日期取决于选择的交货日期,因此每个订单都不同。

此时我们只是在需要时即时计算截止日期。截止日期结果只是DateTime。计算逻辑本身已经在一个地方 (IDeadlineValidator),因为它需要调用数据库来获取一些额外的数据,我们只是不想在整个应用程序中重复它(DRY 原则)。但是这个 IDeadlineValidator 在整个应用程序中都被调用,因为截止日期也用于操纵 UI(显示修改按钮和其他东西)。但它变得有点混乱,我相信有更好的方法来做到这一点。

我现在的问题是:确定订单是否可以修改的最佳实践有哪些? 我也在寻找最好的表现。

我已经想到的几个解决方案是:

你有什么想法?

如果可以预先计算截止日期并且它是决定订单是否可以更改的唯一因素,我喜欢您提出的第一个选项,即计算一次然后存储结果。如果您想抽象它以防它发生变化,您仍然可以在服务方法中进行检查。

此选项可以帮助您稍微优化一下前端代码(我假设这是 client/server 使用网络客户端)- 因为您可以检查 enable/disable 按钮在前端。当然,为了安全起见,如果有人直接调用您的 API,您仍然需要在服务器端进行检查,但这意味着您不会仅仅为了渲染前端而进行额外的调用.

其他两个选项听起来过于复杂 - 如果计时器由于某种原因未能触发怎么办?逻辑现在是解耦的,订单理论上可以以无效状态结束,因为您的状态操作逻辑位于其他地方。

为什么不能在数据库中存储订单的时间戳?

然后在你的UI中,每当你需要显示你现有的订单时,(你添加静态允许的剩余时间)来判断这个订单是否被修改(Can/Cant)

如果您要显示订单列表,则相同。您将有每个 Order.getOrderTime() + 剩余时间。

我假设计算截止日期的方式是由 (Order datetime + someNumber) 决定的,所以只需保存点击订单时的时间戳。

对于新订单,您的时间戳是 now(),您的截止日期是 now() + 静态剩余时间。

要确定订单是否 modifiable/expired,您可以再次使用您的 now - () - (Order.getOrderTimpe() + leaway) > nminutes ?确定订单是真的旧订单还是新订单。