gpt4 book ai didi

java - 验证值(value)观困惑

转载 作者:行者123 更新时间:2023-11-30 02:58:50 27 4
gpt4 key购买 nike

我使用存储库模式与规范模式相结合来与服务网络交互(我更喜欢存储库而不是 DAO):正如此链接所示:http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/ .

用户界面与 Controller 交互, Controller 与服务交互,服务与存储库交互以及规范对服务Web进行CRUD操作,可以说这是应用程序的全局架构,分层架构。

我对 alitte 感到困惑,Web 服务的端点接受值,但它不接受负数,我将其声明为 int 并且没有 unsigned int 在 Java 中,所以现在最好在每个规范发出请求之前检查每个规范内值的有效性(因为我已经知道它会失败),或者仅在服务内部检查?我认为让每个规范检查它的值(value)更好,因为这样我就有义务使用这个规范的每个服务来处理这个检查,也像我可以避免代码重复,如果每个规范不进行检查,让服务为其执行此操作,检查将在每个服务中重复,在我看来,这不利于代码重用。

将验证放在存储库中是否很好,如果测试失败将引发异常,服务将不会捕获它,并让 Controller 捕获它以通知用户他输入的内容。

我对SRP(单一职责原则)有点困惑,这样做,每个规范是否都符合SRP?!!!! (我总是对SRP有疑问,我无法准确地弄清楚系统中每个类的职责是什么)。

这是一个 Android 应用程序,我们有意将其也作为 Web 应用程序(因此,我想以正确的方式进行操作,以最大限度地提高代码重用率)。

如果我以错误的方式这样做,如果有其他更好的方法或任何东西,请现在就告诉我:)

最佳答案

您可以在任何您想要的地方进行验证,但是,根据您放置的位置,验证会扮演不同的角色:

Controller 是面向用户的。因此,他们应该验证用户输入并呈现一些可读的错误。根据您使用的框架,这可能是单独的 validator 或绑定(bind)器等的任务,但它都与 Controller 密切相关。

无论如何,在完美的情况下,用户数据的任何验证都应该在 Controller 将请求转发到服务之前进行处理。如果您需要禁止输入“-1” - 它应该在这里。如果人们在文本字段中输入“abc” - 再次在这里。等等。

服务是面向域的。他们应该验证给定的任务是否可以使用给定的数据完成。但是,如果没有,它们应该使用某种断言调用快速失败或抛出运行时异常。他们不应该提供关于失败原因的漂亮错误列表(如果仅用于审计目的)。它们提供的任何数据都应该已经被之前的实体( Controller 、 validator 等)覆盖。服务唯一关心的事情是业务规则是否允许它们请求的操作。

如果服务层中的验证失败(抛出异常) - 这是一个信号,表明您在 Controller 中错过了一些验证。

有时,服务级别验证与 Controller 中的验证不匹配。想象一下在某些项目中的场景,普通用户只允许输入正值,而管理员也可以输入负值。由于某些业务逻辑原因,两者都不能输入“0”。验证“值为负数&&当前用户是否可以输入负数”将驻留在 Controller 中。验证“值为零”也将驻留在 Controller 中。服务只会有“如果值为零则抛出异常”或只是“断言值不为零”,因为从它的角度来看,它可以完成正面和负面的请求。

存储库/规范是面向数据源的。因此,这些可以添加一些与发送请求本身相关的断言。如果已知数据源不接受零 - 该层可以预先验证这一点,并在被赋予查询零的任务时抛出异常。

如果存储库层中的验证失败(抛出异常) - 这表明您在服务或 Controller 中错过了一些验证。

<小时/>

换句话说:

  • 如果您的规范规定“不应允许用户在余额字段中输入负值” - 这将向 Controller 发送一条正确的消息。
  • 如果您的规范规定“所有客户余额始终为正” - 这将进入服务验证。
  • 如果您的规范规定“银行 Web 服务仅接受请求中的正值”,则进行此验证的位置是存储库。

因此,无论您的场景是什么,请考虑哪些约束是正确的,并适本地组织您的验证。

关于java - 验证值(value)观困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36454440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com