`
wolf_awp
  • 浏览: 53911 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在什么时候对参数进行验证

 
阅读更多
为了保证函数运行的正确性,在函数的开始一般要对参数的正确性进行判断,如果函数间相互进行调用的时候,可能会出现多次对同一个参数的正确性进行验证,出现代码冗余。
比如在Action的一个函数里面调用一个Service的方法,参数验证位置有三种情况:
  • 1、在Service的函数里面
  • 2、在Action里调用Service的方法前
  • 3、在两个函数里面都对参数进行验证(肯定会有代码冗余)

如果一个函数要求参数不能为空或是空字符串,在函数的里面应该就是这样的:
public void doSomething(String foo) {
	if (null == foo || "".equals(foo.trim())) {
		return;
	}
	// some code
}

在另一个函数里面调用到了上面的方法:
public void doAnything(String foo) {
	if (null == foo || "".equals(foo.trim())) {
		return;
	}		
	doSomething(foo);
    // some code
}

这样的话验证参数的代码就重复了。

个人认为,在Service层里面可以不进行参数的验证,假定参数都是正确的。而是在调用Service层的方法之前,先对要传入的值进行验证,正确了才能调用相应的方法。

问题核心就是,是要在一个函数里面进行参数验证,还是在调用函数前对参数进行验证。

大家平常怎么写的,相互参考下。
分享到:
评论
44 楼 zhang_yingjie 2011-05-29  
<div class="quote_title">skzr.org 写道</div>
<div class="quote_div">
<p>楼主这个困惑不是你一个人困惑阿,呵呵<br>估计每个开发的都困惑过:严格的规范说每一个地方都要验证,但是实际上很多地方的验证都是重复的“冗余”。<br><br>每个代码的上下文都是不一样的,所以没有最好的,只有适合自己的实践。<br><br>在我的系统中,最佳实践:</p>
<ul>
<li>每一需要验证的方法,都把<span style="color: #ff0000; font-size: small;"><strong>前置条件写入到方法注释中</strong></span>——必须的</li>
<li>
<span style="color: #ff0000; font-size: small;"><strong>dao不做任何验证</strong></span>,认为输入的参数都是验证过了的</li>
<li>service层如果是外部接口,那么做验证,反之认为都是合法的(一般调用者就是Action,或者其他service)</li>
<li>
<strong><span style="color: #ff0000; font-size: small;">action必须做验证</span></strong>,并提供友好的反馈给调用界面</li>
</ul>
<p>现在在构建一个平台,感觉和做小项目不一样:service层如果是外部接口,那么做验证,反之认为都是合法的(一般调用者就是Action,或者其他service)</p>
<p>这里service基本都是需要对外的,也就是这一条变成了所有的service都要做验证。</p>
<p>最终:除开dao不做验证外其他的都要做验证,因为dao是系统内部使用,外部系统无法访问。</p>
<p> </p>
</div>
<p>can't agree with you more</p>
43 楼 hehe456as 2011-05-29  
同意楼主的理解,action负责验证
42 楼 java_bigniu 2011-05-27  
main方法也得验证
41 楼 chunquedong 2011-05-24  
f ucktianya 写道
调用的都不知道,那还调用个啥啊。

如果是买东西。你都不知道自己买啥。那你还去干嘛啊。。。



不是不知道,是知道的不详细。写方法的人更了解自己的方法参数要求。
40 楼 skzr.org 2011-05-23  
<div class="quote_title">wolf_awp 写道</div>
<div class="quote_div">
<div class="quote_title">skzr.org 写道</div>
<div class="quote_div">
<p><span style="font-size: medium;">楼主这个帖子非常有意识,如今竟然没有一个<span style="color: #ff0000;"><strong>“隐藏”</strong></span>或者<strong><span style="color: #ff0000;">“新手”</span></strong>贴,我投个<span style="color: #ff0000;">良好</span></span></p>
<p> </p>
</div>
<p>谢谢了哈,在javaeye发贴,是要做好被投“隐藏”和“新手”的准备。</p>
</div>
<p>这年头好帖子容易被埋没,罪过罪过。</p>
<p> </p>
<p>其实这个帖子本来就是争议大,一个是理论派,一个是实践派。他们的分歧在计算资源的利用考虑上,是不是要去掉冗余的检验。</p>
<p> </p>
<p><span style="color: #ff0000; font-size: small;">没有是非对错,只有架构规定好了,找到他们的平衡点就可以了,只有适合项目的特定实践,而没有绝对的正确</span>。</p>
39 楼 wolf_awp 2011-05-23  
<div class="quote_title">skzr.org 写道</div>
<div class="quote_div">
<p><span style="font-size: medium;">楼主这个帖子非常有意识,如今竟然没有一个<span style="color: #ff0000;"><strong>“隐藏”</strong></span>或者<strong><span style="color: #ff0000;">“新手”</span></strong>贴,我投个<span style="color: #ff0000;">良好</span></span></p>
<p> </p>
</div>
<p>谢谢了哈,在javaeye发贴,是要做好被投“隐藏”和“新手”的准备。</p>
38 楼 skzr.org 2011-05-23  
<p><span style="font-size: medium;">楼主这个帖子非常有意识,如今竟然没有一个<span style="color: #ff0000;"><strong>“隐藏”</strong></span>或者<strong><span style="color: #ff0000;">“新手”</span></strong>贴,我投个<span style="color: #ff0000;">良好</span></span></p>
<p> </p>
37 楼 whu_momo 2011-05-23  
LZ所言差矣,什么时候验证都行,关键在于service方法是不是只有action方法调用,想清楚这个好办了
36 楼 skzr.org 2011-05-23  
<div class="quote_title">15210494746 写道</div>
<div class="quote_div">不知道这个问题有什么可以纠结的~<br><br>首先人家是想规避《 冗余验证 》才去问应该在哪层做验证!是要解决这个问题,是要谈论怎么样 能规避这个问题!<br><br>而不是问,是不是所有的方法都该做验证这个问题。<br><br>其次,一个项目,如果 架构师 对数据验证的位置没有简明的标注 , 我只能说这个架构很不负责任 。<br><br>从设计上来说,很多大的方法会拆分成很多小的方法的话,岂不是所有的小方法都需要进行验证。如此以来,复用岂不<br><br>会照成代码冗余?这不是和复用的初衷背道而行吗?<br><br>现在假设所有的公共方法都加入数据有效的验证的话 , 那么冗余的验证代码会有多少?<br><br><span style="color: #ff0000; font-size: small;">每个人是该对自己的代码,对自己的方法负责任。 但是数据验证的位置,不应该在具体的方法内部(特例除外)<br><br>个人觉得架构师应该吧《数据有效性验证》放入一个基础中,在action中做《入口验证》,service中做《业务逻辑验<br><br>证》,工具类尽量的少做验证。</span><br><br>这样才能尽量减少 冗余验证的出现。<br><br><span style="color: #ff0000; font-size: medium;">与其说:“要对自己的方法负责”,我更觉得应该《对整个程序负责》更准确些</span>。<br><br>鄙人一些浅见 , 轻拍<br>
</div>
<p>赞同,不要为了形式而形式,系统外入口都要验证,系统内部没必要,内部可以通过管理来达到</p>
35 楼 15210494746 2011-05-23  
不知道这个问题有什么可以纠结的~

首先人家是想规避《 冗余验证 》才去问应该在哪层做验证!是要解决这个问题,是要谈论怎么样 能规避这个问题!

而不是问,是不是所有的方法都该做验证这个问题。

其次,一个项目,如果 架构师 对数据验证的位置没有简明的标注 , 我只能说这个架构很不负责任 。

从设计上来说,很多大的方法会拆分成很多小的方法的话,岂不是所有的小方法都需要进行验证。如此以来,复用岂不

会照成代码冗余?这不是和复用的初衷背道而行吗?

现在假设所有的公共方法都加入数据有效的验证的话 , 那么冗余的验证代码会有多少?

每个人是该对自己的代码,对自己的方法负责任。 但是数据验证的位置,不应该在具体的方法内部(特例除外)

个人觉得架构师应该吧《数据有效性验证》放入一个基础中,在action中做《入口验证》,service中做《业务逻辑验

证》,工具类尽量的少做验证。

这样才能尽量减少 冗余验证的出现。

与其说:“要对自己的方法负责”,我更觉得应该《对整个程序负责》更准确些。

鄙人一些浅见 , 轻拍
34 楼 fucktianya 2011-05-23  
调用的都不知道,那还调用个啥啊。

如果是买东西。你都不知道自己买啥。那你还去干嘛啊。。。

33 楼 chunquedong 2011-05-22  
我更喜欢service上验证,谁的方法谁负责验证,调用的人怎么知道你要的参数是什么呢。
32 楼 devworks 2011-05-21  
两派观点

1 宽进严出 防御式
2 严进严出 DbC
31 楼 kulinglei 2011-05-21  
tom&jerry 写道
记得谁说过,所有的输入都是“罪恶”的,本着这个原则,每一个方法都应该验证,因为你并不知道它将被谁调用。

我同意,
private不可以反射吗?
30 楼 lxc1317 2011-05-21  
private 只在类中应用,你可以控制它;其他的就不好说了
29 楼 gtssgtss 2011-05-21  
tom&jerry 写道
记得谁说过,所有的输入都是“罪恶”的,本着这个原则,每一个方法都应该验证,因为你并不知道它将被谁调用。


if(xxx == null){
  throw new NullPointerException();
}


我觉得这种东西写不写差别不大。。。
28 楼 lxc1317 2011-05-21  
只要是不是private 的都应该验证,因为你公开了可能过段时间已经很多客户用户了
27 楼 lxc1317 2011-05-21  
不管那层调用你的都是你的客户;对客户的输入应该是开放的,返回给客户的数据要严格
26 楼 huqing2010 2011-05-21  
TheMarine 写道
这种问题通常是防御式编程,写service的能保证写action的帮你验证?再说都叫service了,未必只有action才调用,可能有其他客户端呢。



就是呀  service又不是只能被controller调用!
25 楼 tom&jerry 2011-05-21  
记得谁说过,所有的输入都是“罪恶”的,本着这个原则,每一个方法都应该验证,因为你并不知道它将被谁调用。

相关推荐

    TP3.2的简单数据验证php类

    我们在Model中处理数据的时候会一次传入很多参数,这时候可能需要对参数进行判断,是不是少参数了,参数的格式是否正确,如果每次都一大堆if判断的话会很麻烦,以前用过CI,它里面有对form表单提交的数据进行验证的...

    TP3.2的简单数据验证php类.zip

    我们在Model中处理数据的时候会一次传入很多参数,这时候可能需要对参数进行判断,是不是少参数了,参数的格式是否正确,如果每次都一大堆if判断的话会很麻烦,以前用过CI,它里面有对form表单提交的数据进行验证的...

    jquery数据验证 配置简单 使用简单

    如验证input或textbox中输入的时候email只需: 在input或textbox中加入属性ValidDataForEmail='default'即刻实现email的验证操作 还有 网址、数字、身份证、日期等验证,都只需要如上一样添加属性即可,详细的请看...

    客户端统一验证JavaScript函数库及示例源码

    验证控件须对每个控件的元素进行设置且会对页面整体的布局带来影响,占据着页面布局空间的位置,综合考虑及项目整体风格的统一等多种因素中,总得有个折中的考虑。ChkInputs.js应运而生,使用它不需要编写多少代码,...

    23G切换与重选参数详细说明.doc

    如果是整个RNC 参数修改,一定要进行跟踪测试,如果只是单个小区之间的参数修改,要对单小区验证。该参数是同时起作用与同频、异频、异系统的小区重选,因此,该值的设置应该整体考虑,一般情况下不建议设置为0,...

    ASP.NET MVC的四种验证编程方式

    在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,接下来我们通过一个简单的实例来演示如何将参数验证逻辑实现在对应的Action方法中,并在没有通过验证的情况下将错误...

    Python装饰器使用实例:验证参数合法性

    python是不带静态检查的动态语言,有时候需要在调用函数时保证参数合法。检查参数合法性是一个显著的切面场景,各个函数都可能有这个需求。但另一方面,参数合法性是不是应该由调用方来保证比较好也是一个需要结合...

    rails_param:Rails的参数验证和类型强制

    rails_param Rails的参数验证和类型强制介绍如果您想直接在控制器内部验证一些参数,该库非常方便。 例如:您正在构建搜索动作,并且想要验证是否已设置sort参数,并且仅将其设置为desc或asc类的东西。重要的该库不...

    爬虫案例-登录发现报告网(md5加密+AES-CBC加密)

    1、在登录的时候对password参数与时间戳拼接; 2、对账号参数切及时间戳的拼接; 3、将部分关键数据转数组后先进行MD5加密处理; 4、最终将前面数据全部拼接对数据使用AES下的CBC加密 5、得到password的参数之后使用...

    PHP开发API接口签名生成及验证操作示例

    完整性:能够对传入数据进行验证,防止篡改。 一、签名参数sign生成的方法 第1步: 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母升序排序。 第2步: 然后把排序后的

    ThinkPHP类似AOP思想的参数验证的实现方法

    TP 提供了好几种参数验证的方式,比如验证器,独立验证,又或者在继承 Controller 基类的情况下使用 validate 方法。相比而言,验证器还是最佳选择。一个控制器有多个方法,也就表示有多个请求,也就表示有多个场景...

    ThinkPHP5 验证器的具体使用

    我们在做API开发的时候,我们会接受客户端传来的参数,大家都知道这个参数是不可信的,我们后端开发人员必须对这个参数进行验证。我在之前的开发中只是知道tp5的验证器,并不知道他的用途,因为之前的开发验证,往往...

    C++默认参数与函数重载及注意事项

    (1)在函数声明或定义时,直接对参数赋值。这就是默认参数; (2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。 注意: (1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在...

    微信企业号OAuth2验证

    设计思路是在需要获取用户信息的GET请求上添加注解,然后在调用的时候判断是否包含此注解,然后做处理流程。 每次请求包含2种情况: 1.不需要获取用户信息,直接跳转到指定视图; 2.需要获取用户信息,此处分2种情况...

    jQuery 表单验证扩展(三)

    验证参数的设计 onEmptyText: 当输入内容为空的时候显示文本 onEmptyClass: 当输入内容为空的时候显示样式 onSuccessText: 当验证成功的时候显示的文本 onSuccessClass: 当验证成功的时候显示的样式 on

    微信企业号OAuth2验证接口实例(使用SpringMVC)

    设计思路是在需要获取用户信息的GET请求上添加注解,然后在调用的时候判断是否包含此注解,然后做处理流程。 每次请求包含2种情况: 1.不需要获取用户信息,直接跳转到指定视图; 2.需要获取用户信息,此处分2种情况...

    登录系统验证码代码

    登录系统验证码代码

    Web应用安全:Cookie参数越权.pptx

    例如,用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),...

    CredsLeaker:Credsleaker允许攻击者使用Windows安全性制作高度令人信服的凭据提示,针对DC对其进行验证,然后通过HTTP请求将其泄漏

    CredsLeaker v4.x对@ApSecDev表示极大的欢迎,他使该项目更上一层楼!荣誉! 此脚本用于显示Powershell凭据框,要求用户提供凭据。 但是,这非常引人注目。 现在是时候利用Windows安全性弹出窗口了!特征AD域身份...

Global site tag (gtag.js) - Google Analytics