写代码的时候,总是1个方法里把全部逻辑都实现了,修改的时候写了注释,自己都晕头转向, 一点都没有用到面向对象,怎么样才能精简自己的代码,看上去思路清晰,一目了然,请教大神指条明路!下面是代码
public function qqLogin(){
$appid = C('APPID');
$openid = I('openid');
$accesstoken = I('accesstoken');
$pid = I('pid');
$url = "https://graph.qq.com/user/get_user_info?access_token=".$accesstoken."&oauth_consumer_key=".$appid."&openid=".$openid;
// 获取QQ用户详细信息
$result = $this->http_curl($url);
$User = M('users');
if($result['ret'] == 0){
// QQ注册,查看是否注册过了
$userRes = M('user_auths')->where(array('identity_type'=>'qq','identifier'=>$openid))->find();
if(!$userRes)
{
$User->startTrans(); //开启事物
// 添加到users表
$userdata['phone'] = 0;
$res_user_uid = $User->add($userdata);
// 添加到user_auth表
$userAuth['user_id'] = $res_user_uid;
$userAuth['identity_type'] = 'qq';
$userAuth['identifier'] = $openid;
$userAuth['credential'] = $accesstoken;//第三方登陆的openid
$userAuth['token'] = $this->create_token();//第三方登陆的access_token
$userAuth['login_time'] = time();
$userAuth['pid'] = $pid;//客户端推送的唯一ID
$res_user_auths = M('user_auths')->add($userAuth);
if($res_user_auths && $res_user_uid){
$User->commit(); //如果两张表都添加成功 执行事物 添加操作
$res = $User->where(array('id'=>$res_user_uid))->field('nickname,avatar,id')->find();
$code = 1;
$msg = '查询成功';
$data['uId'] = $res['id'];
if($res['nickname'] != "")
{
$data['uName'] = $res['nickname'];
}
if($res['avatar'] != "")
{
$data['uIc'] = $res['avatar'];
}
if($res['phone'] != 0)
{
$data['uTel'] = $res['phone'];
}
$data['uToken'] = M('user_auths')->where(array("id"=>$res_user_auths))->getField('token');
echoMsg($code, $msg, $data);
}else
{
$User->rollback(); //事物回滚
}
}else{
// 登陆时 获取新的token值
$token = $this->create_token();
M('user_auths')->where(array("id"=>$userRes['id']))->save(array('token'=>$token,'login_time'=>time(),'pid'=>$pid));
// 返回数据信息
$res = $User->where(array('id'=>$userRes['user_id']))->field('nickname,avatar,id')->find();
$code = 1;
$msg = '查询成功';
$data['uId'] = $res['id'];
if($res['nickname'] != "")
{
$data['uName'] = $res['nickname'];
}
if($res['avatar'] != "")
{
$data['uIc'] = $res['avatar'];
}
if($res['phone'] != 0)
{
$data['uTel'] = $res['phone'];
}
$data['uToken'] = M('user_auths')->where(array('id'=>$userRes['id']))->getField('token');
echoMsg($code, $msg, $data);
}
}else{
$code = 90001;
$msg = '登陆失败';
echoMsg($code, $msg);
}
}
这是个不断成长的过程,没有代码是标准的,代码好不好看有一部分是主观感觉,所以需要给评价优质代码这件事上定一些原则。我的代码原则是:
可自由扩展,尽可能降低耦合,不论需求有多细小
可配置,可通过设置config改变程序行为
容易交接给其他程序员,至少自己可以通过口述或者文档,很容易地让别的程序员理解你的代码
每当写代码也要注意以上的原则,每次都可以得到提高。
在目前的开源系统中,我接触过的开源架构最漂亮扩展能力最好的是magento2,你下载来参考一下它的代码做法,多读代码就更多了解组织代码的手段。
关于具体的代码优化,你也可以留言给我进行讨论。
自由扩展,降低耦合比较抽象,就像中医所说的固本培元一样抽象。一个比较新鲜的解决方案是依赖注入,可以参考symfony的依赖注入,参考于Java,目的就是降低类与类之间的依赖性,可以看看以下简单例子
https://my.oschina.net/cxz001...
看你发的代码,是简单的代码段,说不上有什么问题,不过有点小冗余,一部分可以改善下。
因为这三段行为是一样的,行为一样应该把这个行为组织为函数
命名上也是有很讲究的,直观的命名比注释更好地理解程序行为。我以上的命名不算好。