为何选择封装
2018-04-26 本文已影响24人
JUNE言JUNE语
记录一下自己思考的问题 避免以后都忘了
注:以下仅仅是一些个人见解,非权威指南,如果错误,评论指出。
why
官方一点的说法
第一:重用;
第二:不必关心具体的实现;
第三:面向对象三大特征之一;
第四:具有安全性!
道理大家都懂,就是具体实现的时候代码总是不听话。。。
先说说自己经历过的痛点吧
- 异常的封装
原先公司的系统上面,很多的异常都是没有经过处理,直接返回给前端code != 200的数据。有时候更坑爹的做法是直接就把异常的code&msg返回给前端,这种做法真的很不可取。
突然有一天觉得这样不对,我们要判断一下,如果是自定义的异常,那就返回msg,如果是系统的异常,那就返回defaultMsg,那要怎么判断是不是自定义异常呢,先用最简单的做法,把code设定为某个特定值
于是就在每一次的catch中写入这段代码
try {
// do something...
} catch (\Exception $e) {
$code = $e->getCode();
if ($code == 666) {
return [
'code' => $code,
// 在这里直接将msg返回回去
'msg' => $e->getMessage(),
];
}
return [
'code' => $code,
'msg' => '系统异常',
];
}
我去,这个又臭又长,而且每次trycatch还都要写同样的代码,还有问题,万一哪一天我们突然发现,某一个扩展也是throw一个code=666的异常,而且msg中还会把各种系统的参数都抛出来,那问题就很大了,这个时候我们就会发现,可能已经有几百个地方写了这样的代码,每一处都要修改。。。
这个时候封装的作用就体现出来了。我们把这样一个功能性的方法放在了一个公共类中,如下
public static function handleException($e, $category = 'applicant', $defaultMsg = '系统异常')
{
$out = ['code' => $e->getCode()];
if ($e->getCode() == 666) {
$out['msg'] = $e->getMessage();
} else {
$out['msg'] = $defaultMsg;
}
return $out;
}
然后在所有的异常捕获中都调用了这个处理方法,那么这个时候如果有需要,我们只需要将对应的code==666替换成其他的就可以了,或者在这里面执行一些特殊的判断,这样就可以很大的避免了代码维护的难度。
[重点]
而且其实封装可以很好地去应对需求的变化,还是以上面异常处理的封装
假定我们已经将异常处理封装到handleException方法中,
如果哪一天我们发现,异常其实都应该记录日志的,那么其实只需要在这个方法上加多一行代码就可以了
// 异常信息记录到日志中
Yii::log($e->__toString(), CLogger::LEVEL_ERROR, $category);
这就完了吗?并不
很多时候我们边开发边调试,问题出现的时候作为开发更希望的是可以将详细的错误信息返回给前端,但是线上确不希望这么做。那可以在handleException中加多一层判断
if (!is_product()) {
return ['code' => $e->getCode(), 'msg' => $e->getMessage()];
}
这样子我们就可以每次在开发环境上都是返回异常的具体信息,而在现上只会返回我们想要展示给用户看的信息。