`

【转】苦B程序员的数据验证之路

阅读更多

发生了什么事

在一次B程序员C程序员的结对编程中发生的一段对话

代码是这样的:

public void deleteAllExtendAclsFromContent(String contentId) throws ContentAclServiceException {

// 参数验证

if (StringUtils.isBlank(contentId)) {

logger.warn("参数异常,内容唯一标识为空");

throw new ContentAclServiceException("参数异常,内容唯一标识为空");

}

// 检查内容合法性

contentAclService.checkContentId(contentId);

contentAclCoreService.deleteAllExtendAclsFromContent(contentId);

}

C程序员:会什么你的每个方法都要去检查一下参数是不是null,参数是不是指定的几种可选数据?

B程序员:因为如果我不检查,后面的操作将会是对一个错误的对象进行,会影响程序的正确执行。

C程序员:但是这个方法应该只关注自己的业务逻辑而不应该做一些与业务无关的参数的正确性判断,否则这个方法可能10行中有7行都是做参数合法性验证,真正的业务可能只有3行,你不觉得这会很怪异吗?

B程序员:那我有什么办法,我的程序跑不下去了,测试来找我的麻烦了!

C程序员:我看你的每个方法都要对参数做合法性检查,那是否可以将这样一个行为提取出来使所有的方法在被调用之前让一个类去做参数的合法性检查,我们只要给参数一个说明比如这样

public void deleteAllExtendAclsFromContent(@NotEmpty(message="参数异常,内容唯一标识为空") String contentId) throws ContentAclServiceException {

// 检查内容合法性

contentAclService.checkContentId(contentId);

contentAclCoreService.deleteAllExtendAclsFromContent(contentId);

}

B程序员:嗯,这样看起来很不错,我们可以利用springaop做个拦截,在所有的方法被调用前先让一个拦截器来检查所有的参数是否合法。

C程序员:对,我们就这样干。


 没多久时序图片就出来了。

.

.

.

半天后,两个人只有一个想法,那就是太苦B了,这是一整个体系两个人一天怎么做的完?在项目的时间进度压力下两人只有放弃(看来很多情况下不是程序员不想把事情做好,时间、时间、还是时间),于是程序又回到了刚开始,并且他们不得不为这一次冒险所耽搁的时间去自己加班完成工作。

这样的事情发生的多了大家就再也不会想在项目里使用什么优美的方式或好的模式来编写与设计代码了,而是以完成功能为目地的编码。

 

回顾上面的对话我们发现

Ø B程序员的做法,是为了防止程序出现异常而对输入参数为了检查。

Ø C程序员的想法,是让这种检查工作不必分散到各业务方法中。

两个程序员都是想把程序做的更健壮、业务更清晰、职责更分明,但是由于客观的原因他们的努力失败了。

 

神的出现

继续上面,此时的苦C程序员依然没有放弃,他利用项目的空闲时间继续研究,他认为这种需求应该不只他一个人有,世界上还有那么多的苦X程序员,可能早就有人想到了这个需求,也许早就有人已经完成了这个工作,苦C程序员突然想起了springmvc中好像可以验证参数的正确性,于是他求助了万能的google大神,终于被他找了解决这个问题的究极方案。

当当当“JSR303闪亮登场。http://jcp.org/en/jsr/detail?id=303

这个规范当前较好的实现是Hibernate Validatorhttp://www.hibernate.org/subprojects/validator.html并且也可较方便的与spring集成。此时的C程序员感觉到浑身充满了力量,他大叫一声“JSR303赐予我力量吧!Google,live for ever。从此苦C程序员在开发这条苦B的不归路上走的更坚实了,因为他又多了一把称手的神器—“JSR303

B程序员和C程序员皈依了我神最终升华为苦A程序员

网上有这样一个例子https://github.com/ghillert/spring-hibernate-validator-sample,这里面就是讲述如何使用JSR303来验证方法参数的。这里面需要在spring中做如下配置

<bean id="validator"

class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor" />

关键就在MethodValidationPostProcessor这个类,它的作用就是给所有的标记了要做验证的接口添加一个org.springframework.validation.beanvalidation.MethodValidationInterceptor拦截器,这个拦截器会负责验证你所要验证的参数。

但这个拦截器会抛出一个org.hibernate.validator.method.MethodConstraintViolationException.MethodConstraintViolationException异常,对于有些人来说也许他们并不希望得到这样的异常,可能是因为这个异常长的太怪异,也可能是其它的原因,总之就是不希望用这个,他们希望自已来控制验证出错后的处理方式。谢天谢地这一切都是开源的(感谢天,感谢地,感谢Spring……熟悉的旋律出现在耳边),那么分析MethodValidationPostProcessorMethodValidationInterceptor代码后我们可以很容易的做到这一点,聪明的程序员们应该很快就可以明白了。

C程序员以最快的速度将这个消息告诉了苦B程序员,苦B程序员得到这个消息后第一直觉就是要尽快将这个成果分享到整个团队中,于是不久后整个团队的成员都皈依了我神(JSR303)最终升华为了苦A程序员(为什么还是苦A程序员?因为还有新的麻烦会不断的出现,我勒个去……)。

分享到:
评论
1 楼 独自等待2012 2012-05-29  
我勒个去

相关推荐

    写给程序员的数据挖掘指南 代码

    数据挖掘是IT行业中一个至关重要的领域,特别是在大数据时代,它为程序员提供了从海量信息中提取有价值知识的能力。这本书“写给程序员的数据挖掘指南”显然旨在帮助程序员轻松进入这个领域,通过通俗易懂的方式讲解...

    统计思维:程序员数学之概率统计(第2版)-唐尼1

    《统计思维:程序员数学之概率统计(第2版)》是由Allen B. Downey撰写的,旨在帮助程序员理解和应用概率统计。这本书通过实践性的方法,介绍了如何在数据分析中使用统计工具,尤其强调了探索性数据分析的重要性。...

    程序员实用算法.pdf

    本书作者介绍了一些有用但很少被讨论的算法,它们可用于语音查找、日期和时间例程(直到公元1年)、B树和索引文件、数据压缩、任意精度的算术、校验和与数据验证,并且还最全面地介绍了查找例程、排序算法和数据结构...

    程序员数学之概率与统计

    《统计思维:程序员数学之概率统计》是一本由Allen B. Downey所著,专门为程序员和计算机专业学生撰写的概率统计入门图书。本书采取了一种全新的视角来讲解概率统计学,不仅涉及传统的概率理论,还特别强调了如何...

    计算机专业水平考试历年试题(程序员、高级程序员)

    3. **高级算法与数据结构**:深度优先搜索、广度优先搜索、动态规划、贪心算法等,以及高级数据结构如红黑树、B树、哈希表等。 4. **并发编程**:线程同步与通信机制,如锁、信号量、条件变量,以及多线程编程的...

    统计思维:程序员数学之概率统计

    《统计思维:程序员数学之概率统计》是Allen B. Downey所著,张建锋和陈钢翻译的一本入门图书。该书的与众不同之处在于它跳脱了传统数学的分析方式,转而采用编程实践来引导读者理解统计学。书中介绍的主题包括概率...

    程序员之程序设计知识点

    本文将基于标题“程序员之程序设计知识点”以及描述“程序员之程序设计知识点,供历年软考人员学习”的内容,深入探讨程序设计的基本概念、程序设计的步骤、编程语言分类及其特性,特别是对C语言的基础和发展进行...

    程序员实用算法——源码

    译者序 前言 ...第10章 数据完整性和验证  10.1 简单的校验和  10.2 加权校验和  10.3 循环冗余校验  10.3.1 CRC CCITT  10.3.2 CRC 16  10.3.3 CRC 32   10.4 资源和参考资料

    NET程序员上机测试题

    该系统需具备B/S或C/S架构,前端采用VS.NET2003及C#语言进行开发,后端则依赖于SQL Server 2000作为数据库管理系统。主要功能涵盖考生信息管理、登录验证、试题随机生成与防刷新机制,以及自动评分等。 #### 数据库...

    初级程序员面试资料

    ### 初级程序员面试资料详解 #### C#与C/C++基础知识 **1. C#中property与attribute的区别** - **Property(属性)**: 在C#中,`property`是面向对象编程的一个重要特性,它使得类的成员可以通过类似于字段的方式...

    .NET程序员面试之葵花宝典

    10. **ASP.NET 数据验证**:通常使用验证控件来验证用户输入,确保数据的正确性和安全性。 11. **服务端事件**:在ASP.NET中,Web控件可以触发服务端事件,这些事件在服务器上处理。自动回发(AutoPostBack)是指当...

    程序员sql面试题

    对于程序员而言,掌握SQL不仅是基本技能之一,也是面试中的常见考察点。以下是对给定文件中提到的经典SQL面试题的深入解析,旨在帮助读者理解并掌握这些重要的SQL知识点。 ### 一、条件查询与多表联合查询 #### ...

    程序员常用算法(源码)

    本书(程序员常用算法)重点关注的是实用,立即可用的代码,并且广泛...日期和时间例程(直到公元1年)、B树和索引文件、数据压缩、任意精度的算术,校验和与数据验证,并且全面地介绍了查找例程、排序算法和数据结构。..

    .NET(ASP.NET)程序员 面试题 汇总(希望对你有帮助)

    .NET(ASP.NET)程序员面试题汇总 这份面试题汇总涵盖了ASP.NET、C#、.NET等领域的知识点,共25道题目,涵盖了面向对象编程、ASP.NET开发、.NET Framework等方面的知识。 一、私有成员访问权限 私有成员(private)...

    程序员英语单词册

    ### 程序员英语词汇解析 #### 一、词汇概览 为了更好地与国际接轨,程序员必须掌握一定的英语词汇,特别是与计算机科学和技术相关的专业术语。这些词汇不仅有助于理解技术文档、源代码注释,还能提升个人的技术...

    [程序员实用算法].Andrew.Binstock.等著.清晰版_部分1.pdf

    日期和时间例程(直到公元1年)、B树和索引文件、数据压缩、任意精度的算术,校验和与数据验证,并且全面地介绍了查找例程、排序算法和数据结构。.. 本书只要求读者具有C语言的初级知识以及基本代数的相关知识。源代码...

    统计思维:程序员数学之概率统计,完整高清版

    ### 统计思维:程序员数学之概率统计 #### 一、引言 在当今的数据驱动时代,统计思维已经成为程序员的一项核心技能。《统计思维:程序员数学之概率统计》这本书为读者提供了一个全新的视角来理解概率统计学。不同于...

    2009下半年软考 程序员真题(1)

    ### 2009年下半年软考程序员真题分析 #### 题目解析与知识点梳理 **一、考试概述** 2009年下半年全国计算机技术与软件专业技术资格(水平)考试,面向程序员职位的上午试卷,旨在考查考生的基础理论知识与实际...

Global site tag (gtag.js) - Google Analytics