发生了什么事

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

代码是这样的:

public void deleteAllExtendAclsFromContent(String contentId) throwsContentAclServiceException {

// 参数验证

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程序员:嗯,这样看起来很不错,我们可以利用spring的aop做个拦截,在所有的方法被调用前先让一个拦截器来检查所有的参数是否合法。

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



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

.

.

.

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

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

回顾上面的对话我们发现

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

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

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

神的出现

继续上面,此时的苦C程序员依然没有放弃,他利用项目的空闲时间继续研究,他认为这种需求应该不只他一个人有,世界上还有那么多的苦X程序员,可能早就有人想到了这个需求,也许早就有人已经完成了这个工作,苦C程序员突然想起了spring的mvc中好像可以验证参数的正确性,于是他求助了万能的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"/>

<beanclass="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

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

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

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

苦B程序员的数据验证之路的更多相关文章

  1. 高焕堂《android从程序员到架构师之路》 YY讲坛直面大师学习架构设计

    <android从程序员到架构师之路>YY讲坛活动:  sundy携手高焕堂老师全程YY答疑 与大师一起,分享android技术 时间:7月21日下午2:00   报名联系QQ:22243 ...

  2. 苦B的程序猿道路数据验证

    发生了什么 再一次苦B程序猿和苦C程序猿结对话发生编程周期 此代码: public void deleteAllExtendAclsFromContent(String contentId) thro ...

  3. 给IT新男的15点建议:苦逼程序员的辛酸反省与总结

    很多人表面上看着老实巴交的,实际上内心比谁都好强.自负.虚荣.甚至阴险.工作中见的多了,也就习惯了. 有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌.但是他们所表现的又未必不是真性情. 我 ...

  4. 懒人的ERP开发框架--2B&苦B程序员专用

    在企业内部的ERP系统开发中,如果使用MS的技术,那么Winform + DevExpress + IIS + WCF +EF 就是懒人的黄金组合了,EF使用数据库优先,一般ERP应用主要关注点在数据 ...

  5. PHP程序员的技术成长之路规划

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  6. 浅谈Android移动开发程序员的职业发展之路

    现在几乎每个it公司都在开发移动产品,我最早知道Android还是在09年成都某学院上大学的时候,从新闻上知道有这么一家公司,创始人安迪·鲁宾很有名,但安卓到底是做什么的,我并没有关注. 到2010年 ...

  7. 高级Java程序员的技术进阶之路

      据不完全统计,截至目前(2017.07)为止,中国Java程序员的数量已经超过了100万.而且,随着IT培训业的持续发展和大量的应届毕业生进入社会,Java程序员面临的竞争压力越来越大.那么,作为 ...

  8. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  9. 华为云&#183;寻找黑马程序员#【代码重构之路】如何“消除”if/else【华为云技术分享】

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

随机推荐

  1. mysql的示例及练习

    示例及练习1-MOSHOU.hero.txtcreate database MOSHOU;use MOSHOU;create table hero(id int,name char(15),sex e ...

  2. 如何设置 web 项目打开的默认页面

    引言 我们在创建 Web 项目启动 Tomcat 会自动打开一个默认 index.jsp 页面,这个页面是创建 Web 项目时就自动生成的.那么,如何设置 web 项目打开的这个的默认页面,改为自己的 ...

  3. SpringBoot打jar包-下载文件时报错-class path resource xxxxxx cannot be resolved to URL because it does not exist

    一.问题由来 新项目的开发中,打包方式由war包改为了jar包的方式,这样在部署的时候更加的方便.测试环境使用pm2这个工具来管理项目的运行,停止,重启等等非常方便. 可是当测试人员在测试项目中的文件 ...

  4. pyqt安装

    一.安装PyQt5 pip install PyQt5 二.安装PyQt-tools pip install PyQt-tools *注:mac不需要安装PyQt-tools,能够正常使用,只支持Wi ...

  5. Camera HDR Algorithms

    Camera HDR Algorithms HDRI是High-Dynamic Range(HDR)image的缩写,也就是高动态范围图像.它就是为了解决更好的存储高动态范围图像这个问题而发明出来的. ...

  6. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. 加法运算符的可选否定加法 乘法与乘法加法 整数除法 逻辑运算 条件码操作 to/from浮点转换 其它操作(例如,S ...

  7. 如何实现一个简易版的 Spring - 如何实现 AOP(终结篇)

    前言 在 上篇 实现了 判断一个类的方式是符合配置的 pointcut 表达式.根据一个 Bean 的名称和方法名,获取 Method 对象.实现了 BeforeAdvice.AfterReturni ...

  8. cmd快捷键设置

    操作系统:windows7 x64 目的:像在任意空白处右键都有新建文档的功能一样,将cmd添加到右键里. 操作:百度经验 http://jingyan.baidu.com/article/948f5 ...

  9. Spring Cloud 和 Dubbo,到底用哪个好?

    Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决 sp ...

  10. SQL Sever提权

    前言:渗透测试中提权是较为重要的环节,若以低权限身份进行后渗透,测试出的问题相对于高权限的质量会低很多,从一个普通用户,通过手段让自己变为管理员,也可利用操作系统或者应用程序中的错误,设计缺陷或者配置 ...