Elegant的函数参数检查

来源:互联网 发布:数据库别名有什么作用 编辑:程序博客网 时间:2024/04/29 21:12
原文URL:http://blog.csdn.net/u012859646/article/details/16840299 [2012.3]
      
       刚好有一个小功能要实现,可能是有段时间没写码的缘故,有点患洁癖,想把代码尽量写得干净点,下面是一个需要优化的case (刚好用php, 就以php来说明)。
      如有一个函数: function foo($uid, $phone, $email, $sex, $age),为了数据的合法性,我们第一步要做参数验证,这个非常重要,在高质量的编程习惯里相信都会有一条“永远不要信任外部数据”。那么,一般怎么写,考虑以下两种可能的方案: 

方案一     
if ( !(valid_uid($uid) && valid_phone($phone) && valid_email($email) && valid_sex($sex) && valid_age($age) )  ) {    LOG(“invalid arg!”);     }
      这个方案的好处是写起来只有一行,代码量是省的。可是,不能精确地把错误参数打印出来。你也许可以把所有参数全部输出到日志,可这样的日志要看清楚问题想必也要耗费不少精力。

方案二  
if (!valid_uid($uid)) {    LOG(“invalid uid”);}if (!valid_phone($phone)) {    LOG(“invalid phone”);}if (!valid_email($email)) {    LOG(“invalid email”)}
       这个方案看日志就清爽了,你可以定位哪个参数为非法。 问题也很明显,这5个参数就得赔上N行的代码。 除了增加代码量,这种方案实在不是一种优雅的方案。
       希望实现这样一种检查方式,首先能保持尽量少的代码量,还能准确找出有问题的参数。受到级联调用的启发,可以用如下方案三,实现一个通用的检查类 validator。
       
方案三
$vd = new validator();$vd->uid($uid)->phone($phone)->email($email)->sex($sex)->age($age);if ($vd->fail()) {    LOG($vd->err_msg());}
       思路有了,实现上其实很简单,这里就不贴代码了。这个方案不是特定于php语言特性,很容易移植到其它语言。

  2012.3
--EnD--   
原创粉丝点击