在服务器端创建多步表单的正确方法是什么? [已关闭]

问题描述 投票:0回答:1

我有一个包含其他实体的应用程序实体。在不特定于特定编程语言的伪代码中,它会被描述如下:

public class Application {
    public Client client = null;
    public Address address address = null;
    public House house house = null;
    public float price = 0;
    public boolean hasMortgage = false;
}

每个实体的验证是一个单独的步骤,由服务器而不是客户端执行

我看到两个选项,想知道哪一个在实际项目中使用。

a) 每个单独的步骤:

1. User enters entity data
2. On the server the entity is validated in the controller of this entity
3. A record of the entity is created in the database
4. The id of the created record is returned to the user

完成所有步骤后,ApplicationController 将创建应用程序实体,通过 ID 分配现有的地址、房屋实体,并将应用程序实体记录保存到数据库中。

b) 在每个单独的步骤中:

1. The user enters the entity data
2. On the server, the entity is validated in the controller of this entity
3. The user receives a response "Yes, you can go to the next step".

当所有步骤都通过后,ApplicationController创建Application实体,创建Address、House实体,将它们分配给Application实体,然后将所有实体的记录保存到数据库中。

java architecture backend
1个回答
0
投票

执行此操作没有错误或正确的架构。这仅取决于您的要求以及您的软件应该做什么。显然,从您描述的两种选择来看,每种模型都有优点和缺点。这是我所看到的:

坚持每一步模型:

优点

  • 对服务器进程进行严格控制
  • 如果用户刷新页面,则不会丢失任何内容
  • 用户可以稍后恢复流程
  • 可以更轻松地解决用户的流程问题。

缺点

  • 可能会在数据库中创建大量垃圾或废弃记录,需要清理这些情况
  • 坚持每一步需要更多的工作
  • 改变流程意味着后端需要更多返工
  • 服务器施加过多的控制可能会产生不必要的耦合

坚持到底模型

优点

  • 每一步验证工作量最少
  • 数据库中仅保存完整的记录
  • 前端流程的变化不一定会影响后端(或者影响可能较小)

缺点

  • 如果用户刷新页面,前端会失去流量(本地存储)
  • 稍后将无法恢复流程
  • 解决用户流程问题的其他一些选项。
  • 对整个流程的控制可能太松了

客户如何适应这一点将影响这两种解决方案。这是 SPA 风格的前端渲染还是服务器端渲染。因此,问题的答案不仅取决于服务器所涉及的技术,还可能对客户端产生影响。

每个解决方案的优点缺点可以通过引入其他解决方案来减轻。例如,后端或暂存表上的清理过程可在用户完成向导流程之前保存用户条目,使用浏览器中的本地存储来临时保存用户放弃的流程 - 无需后端清理,或在前端进行 Google 分析风格跟踪,以解决用户体验问题。在某种程度上,通过引入其他解决方案来抑制缺点,可以使每种解决方案变得可口。

因此有时归根结底是需要更多的支持解决方案来弥补问题。如果有很多,那么也许另一种方式更适合您。也许你可以容忍一些缺点,或者其他优点对你来说更重要。

我想补充一点,您要避免将状态存储在服务器内存中。保持服务器无状态应该是目标。当然,如果您将状态保存在 Redis 或外部缓存之类的东西中,那就没问题了,但这是一个更复杂的架构。但你绝对不希望它存储在服务器内存中。这绝对是低劣的设计。

希望这能让您对自己的优点缺点有一些想法。

© www.soinside.com 2019 - 2024. All rights reserved.