`
chelsea
  • 浏览: 117760 次
  • 来自: ...
社区版块
存档分类
最新评论

Validation 问题域

    博客分类:
 
阅读更多
  • 谁来做Validation
  • 何时做Validation
  • 如何表达错误
  • 如何传递错误
  • 如何关联错误到发生错误的对象, 尤其是对象图中非Root对象



这里的Validation指的是对进入到系统中的业务数据的校验(不包括Web应用中页面数据在浏览器端的验证)

谁来做Validation


数据的有效性不是自身所能决定的, 而是使用它的场景(Context)决定的, 因此, 每个Context应该有自己的Validation逻辑.

一个例子, 个人信息残缺, 比如婚姻状况没填, 但联系地址电子邮件等信息完备, 那么这个个人信息到底是合法还是非法? 如果你的应用是个税务相关的应用必须知道婚姻状况则数据是非法的, 如果你的应用是CRM系统有客户的联系方式即可而婚姻状况是可选的则数据就是合法的. 问题是你的应用是税务应用但同时支持客户关系管理, 那这段数据到底合法非法? 税务应用只是年底的时候才有人用, 而客户关系管理系统随时都有人用, 假设数据是通过页面提交的, 那这批数据到底该拒绝还是接受?

何时做Validation


通常有几个时机, 对象被创建出来, 对象状态改变, 以及对象被持久化. 企业应用中同一份数据一般至少有两种存在形式: 在数据库中的持久化状态, 以及在内存中以编程语言定义的对象形式存在. 那么几个时机:

  • 手动创建对象, 就是应在构造函数中做验证
  • 框架帮忙创建对象, 比如从页面Form绑定到Server端的对象时, 可以在绑定完成的那一刻做校验
  • 存到数据库里那一刻


这就带来一个问题: 可能要在三个地方做大体相同的验证, 如何复用验证规则?
另一个问题是: 在引入ORM的应用中, 编程语言写好的验证逻辑同样可以应用在持久化到数据库的那一颗, 那在SQL/DDL语句中定义的约束是否还必要?

如何表达错误


有两个约束:

  • 要提供易于用户和支持人员理解的错误信息
  • 要提供尽可能丰富的信息


常见的手段是用字符串或者错误代码/ID, 这是不work的, 因为它们合并了错误本身和错误的表示:

出错的地方可能距离需要展现错误的地方很远, 或者有多种展现错误的界面, 或者有很多显示方面的需求, 比如支持国际化, 报错的地方是没有能力也不需要知道错误是如何被展示的, 它要做的是尽可能报告关于错误的详细信息, 包括违反了什么规则, 出错的字段, 实际的值和期待的值等, 字符串和错误代码/ID是没有如此丰富的表达能力的

我们可以用对象来表达错误信息, 对象的类型可以表示错误的类别, 对象的属性/字段可以携带各种与错误类型相关的数据. 然后在需要展现给用户的那一刻, 再把对象翻译成针对那个界面的显示, 比如可以做国际化, 或者提供给程序员更技术化的描述. 而在错误信息需要被显示之前, 错误在系统中的传递, 都是以对象的形式进行的...

听起来跟异常Exception很像?

几个反例是.Net平台上的异常, 比如KeyNotFoundException, 它就不告诉你那个找不到的Key是啥, 还有Index越界, 就不告诉你index的值是多少, 还有数据库连接超时或者Transaction Timeout,死活不告诉你它等了多久超时的, 让你搞不清楚是你的超时时间设的太短还是根本你的设置就没生效

如何传递错误


收集参数, 输出参数, Thread Local, 或者抛出异常然后合适的层次捕获

如何关联错误到发生错误的对象图, 尤其是对象图中非Root对象


给错误一个Key, 这个Key应该能表示出错的对象在对象图中的位置, 比如Key可以是字段名称中间用"."分隔, 级联起来的字符串. 注意这种形式的key应该是在调用验证逻辑的地方组装起来的, 而不应该是验证逻辑本身, 因为验证逻辑通常并不知道自己验证的这个对象在父对象中的字段名称

一个额外的话题

 

很多验证框架采用了基于Attribute/Anontation的方式, 这样当一个对象在不同的Context有不同的验证逻辑时就会很纠结, 因为它是以侵入的方式写到对象的定义中的. 这恰恰从另一个角度说明了对象是不应该跨Context复用的, DCI才是王道

分享到:
评论

相关推荐

    CMMI-DEV V1.2支持过程域

    - **验证(Verification)**和**确认(Validation)**:这两个过程域分别关注于验证产品是否满足规格要求(验证),以及确保产品能够满足用户的需求和期望(确认)。 - **配置管理(Configuration Management)**:...

    CMMI-DEV V1.2工程过程域

    通过对CMMI-DEV V1.2工程过程域的深入了解,我们可以发现每个过程域都旨在解决特定领域的问题,从而帮助组织达到更高的成熟度水平。无论是项目管理、工程技术还是过程管理等方面,CMMI-DEV V1.2提供了一套全面且系统...

    CMMI-DEV 1[1].2过程域解析

    7. **确认(Validation, VAL)**:确认过程域主要关注产品是否满足用户和客户的需求。它通过系统测试、验收测试等手段,确保产品在交付前达到预期的功能和性能。 8. **配置管理(Configuration Management, CM)**...

    我们公司的过程域考核.doc

    在公司的标准过程中,如果未涉及供方协定管理 (SAM),这意味着可能缺乏对供应商合同的管理和监督,可能导致供应链风险增加,供应商性能不达标,或者合作中出现沟通和交付问题。为了完善项目管理,公司应当引入 SAM ...

    validation.zip

    1. 数据预处理:心音数据通常需要进行滤波去除噪声,标准化以减少不同设备或环境的影响,并可能需要进行特征提取,如计算心率、频率域分析等。 2. 模型构建:选择合适的机器学习或深度学习模型,并进行超参数调整以...

    Public Key Validation for the DNS Security Extensions.pdf

    本文档题为《Public Key Validation for the DNS Security Extensions》,主要探讨了DNS安全扩展(DNSSEC)中公开密钥验证机制的问题。DNSSEC旨在通过使用公钥认证来减少DNS(域名系统)中多个安全漏洞。由于DNS是...

    lotus Domino开发域相关文档--域属性

    1. **Input Validation(输入验证)**: 输入验证是在表单设计中用于确保用户输入数据符合预设条件的一种机制。在示例中,"gh" 域被设定为工号,通过使用 LotusScript 或者 Formula Language 的代码来验证输入数据...

    CMMI3全过程域培训文档

    **验证与确认过程域:VER(Verification)& VAL(Validation)** 4. VER(验证):验证是在产品或服务开发过程中,检查产品是否按照需求和设计规格正确构建的过程。这通常在产品开发阶段进行,以确保每个组件的正确...

    使用客户端验证框架JSValidation

    13. **必须与某个域的值相同**:验证一个字段的值是否与另一个字段的值相匹配。 #### 三、使用步骤 下面是使用JSValidation的具体步骤,以一个示例项目为例: 1. **引入JSValidation库**: - 首先需要下载...

    haproxy-acme-validation-plugin, 零停机时间 acme/让我们加密用于HAProxy的证书颁发.zip

    haproxy-acme-validation-plugin, 零停机时间 acme/让我们加密用于HAProxy的证书颁发 HAProxy ACME域验证插件 实现零停机时间 ACME http-01 验证由HAProxy实例提供的域的验证。 插件利用 Bonita API的允许使用ACME...

    CMMI_DEV_1.3中的过程域相关整理

    4. **验证(Validation)**:与验证不同,验证关注的是最终产品是否满足实际使用环境的预期。这涉及到系统集成测试、验收测试等,确保软件在部署后能够正常运行。 5. **产品集成(Product Integration, PI)**:PI着重...

    email-validation:一个完整的电子邮件验证脚本

    3. **DNS验证**:更高级的验证方法还包括DNS查询,以确认电子邮件域的存在。这可以通过JavaScript的`dns`模块(Node.js环境下)或通过AJAX请求第三方服务来实现。这种方法可以进一步确认电子邮件服务器的可达性,但...

    互联网自治域间IP源地址验证技术综述.pdf

    总的来说,互联网自治域间IP源地址验证技术的研究和应用是解决互联网安全问题的关键一环。通过深入理解现有技术的优缺点,探索新的验证方法,以及推动标准制定和国际协作,我们可以期待一个更安全、更可信的互联网...

    one-validation:基于Regexp的验证集合,用于常见的Internet验证任务

    例如,URL由许多部分组成,例如方案,可选的用户信息,子域,域,顶级域,路径,查询和片段。 通过分别对每个部分进行数学运算并编写稍后将各个部分组合在一起的正则表达式,可以更容易地编写可维护和可重用的正则...

    Really easy field validation with Prototype 1.5.4.1 中文修改版

    所做的更改: <br>1、prototype.js 版本更新为 v1.5.1.1 <br>2、effects.js 版本更新为 v1.7.1_beta3 <br>3、所有校验错误提示信息均修改为中文,提供UTF-8和GB...错误信息显示在被校验域的右侧,红色粗体

    CMMI3访谈记录:各个过程域

    6. **确认(VAL, Validation)** 与验证不同,确认侧重于在系统交付前确认产品是否满足用户需求和预期。这通常通过用户验收测试和系统演示来实现,确保最终产品满足客户实际使用的要求。 7. **项目执行(PO, ...

    CMMI-DEV V1.2 项目管理过程域

    这通常涉及到用户参与的测试活动,以确保产品能够真正解决用户的问题。 ##### 7. Engineering(工程) 工程过程域覆盖了项目中所有的工程技术活动,包括但不限于软件工程、硬件工程等。这一领域旨在确保项目的工程...

    CMMI-DEVV1[1][1]2项目管理过程域.pptx

    12. **决策分析和解决(Decision Analysis and Resolution)**:这一过程域涉及识别问题,评估备选方案,做出决策,并跟踪决策的实施效果。 13. **风险管理(Risk Management)**:识别、分析、优先排序项目风险,...

    email_validation:用于验证电子邮件服务器端的简单PHP代码

    PHP电子邮件验证简单PHP代码可验证电子邮件服务器端我2年前写了这段代码这是保护您的联系表格免受垃圾邮件攻击的简单方法验证电子邮件格式( ) Ping电子邮件域以确保其在线从列表中验证电子邮件提供商Gmail....

Global site tag (gtag.js) - Google Analytics