gpt4 book ai didi

OOP:有效数据应该在类中处理还是在前端处理?

转载 作者:行者123 更新时间:2023-12-02 04:37:55 24 4
gpt4 key购买 nike

假设我有一个多边形类。它唯一的私有(private)数据是点数组。类是否应该假设数组至少有 3 个点,并且程序的 GUI 或输入部分确保有三个点?或者成员函数是否应该测试数据有效性并在需要时返回错误消息?

最佳答案

其他答案中有一些好的观点。我会尝试在这里陈述它们:

  • 最终,该模型负责了解它是否处于有效状态。
  • UI 需要知道模型是否处于有效状态。
  • UI 可以保护模型免受无效状态的影响,并通过验证输入提供良好的用户反馈。

有一些挑战:

  • 如果模型和用户界面都有验证代码,结果要么是模型/用户界面中的重复代码,要么是模型和用户界面之间的验证职责分离。
  • UI 验证变得困惑,因为一些数据字段依赖于其他字段。想象一个收集邮政编码和州(美国邮政地址)的应用程序。如果更改状态,是否希望 UI 立即弹出一个对话框,显示“无效的邮政编码”?不,那会很烦人。 UI 应该让用户有机会将模型置于有效状态。
  • 抛出异常来捕获验证错误是一种粗暴的做事方式。通常,您会想要一些不那么突兀的东西。

这是我喜欢为复杂验证做的事情:

  • 允许用户输入无效值。
  • 创建一个名为 ValidationError 的类,其中包含对单个验证错误的人类可读描述。
  • 提供模型方法,例如 getValidationErrors()isValid()
  • 在对模型进行任何更改之前,让 UI 调用 isValid()getValidationErrors()。如果存在任何验证错误,请让 UI 向用户显示错误。在错误修复之前阻止用户继续操作。

这种方法的优点是: - 对验证的更多控制。您可以决定要验证的时间和内容。 - 集中模型中的验证逻辑。 UI 只负责获取和显示模型生成的错误。 - 如果模型在调用保存/提交方法之前调用 isValid(),则其他代码对模型进行无效更改的风险较小。 -没有异常处理程序。

考虑创建一个 ValidationRule 类。每个规则都包含使某些内容生效并在无效时生成错误消息的代码。 ValidationRule 类有一个方法 validate(aModel)。如果您的编程语言支持闭包或一流函数,这就特别容易做到。

这导致每个模型类都可以有一个 ValidationRule 对象的动态集合,它在调用 isValid()getValiationErrors() 时引用.或者,使用访问者模式,使模型与验证完全分离。这就是我在验证框架中所做的。

在模型不在客户端的分布式应用程序中,在将更改发送到服务器之前进行一些基本验证通常是明智的。客户端和服务器之间的往返时间可能会很长,您不希望向服务器发送明显无效的请求。

最后,一个对象的有效性有时取决于另一个对象中的数据!在这些情况下,我让验证规则接受多个对象,并使用 Controller 对象(或者我创建一个上下文对象)在更细粒度的级别上管理验证。

关于OOP:有效数据应该在类中处理还是在前端处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555907/

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