编程时间长了, 就会体会到,真的是一个程序员一种风格. 就是使用同一个框架都会有十个程序员十种编程风格. 好大一部分区别就体现在函数的参数上了.
比如针对一张数据表的操作, 表有id,name,age,status列. 针对此表的插入操作的函数为add. 则就可能有如下几种写法.
<?php function add1($id, $name, $age, $status){} function add2($name, $age, $status){} function add3($name, $age, $status = 1){} function add4($name, $age, $status = STATUS_OK){}
第一个, 这应该是很新手的程序员. 他在调用的时候会这么写..
<?php add1('', 'name', 18, 1);
第二个是普通程序员. 大多数人都这么写.
第三个是比普通程序员强一些的. 他们知道参数给定默认值的好处.
第四个知道魔术是什么概念.
再说一个场景. 拿新浪开放平台的某个函数来说吧. 获取access token的那个. 可以有三种方式获取token. 然后, 函数的声明大概是这样的
<?php function getAccessToken($type, $params){ switch($type){ case 'code': break; case 'password': break; //.... } }
其中$param是一个数组, 根据$type的不同,需要传递不同的键进来. 这个函数设计的就是一个非常典型的反面教材. 当使用它的时候, 就需要去看函数声明. 当传递某个$type的时候. $params要传什么…
<?php getAccessToken('code', array('code' => 'xxxx', 'callback' => 'xxxxxxx')); getAccessToken('password', array('username' => 'uxxxx', 'password' => 'pxxx')); getAccessToken('xxxx' , array()); //.....
那怎么才能不写出来这种反面教材的函数呢? 同样拿这个场景. 如下的几个函数
<?php function getAccessTokenByCode($code, $callback){} function getAccessTokenByPassword($username, $password){} function getAccessTokenByXxx($xx1, $xx2, $xx3){}
当然, 你也可以过度设计成一个函数, 接收参数限制为一个接口. 实现三个子类. 由子类返回请求参数… 但….. 感觉好蛋疼的样子…
再举个好的例子. 场景: 一个函数, 批量获取一组用户的信息.
<?php function getUsersInfo(array $uids){}
当然, 返回值也需要强调一下. 是array(‘uid’ => array(), ‘uid’ => array())这种的…