最近在学习Swoole websocket。并根据教程,自己编写了一个贪吃蛇的小游戏,具体代码比较复杂,不在这里叙述游戏逻辑,总结一下这个小项目中思考到的封装思想。
问题描述
服务器端接收客户端传过来的指令,并完成相应的业务处理。这时候可能就需要分三个文件,相当于三层去处理这部分功能。网络层→业务层→数据操作层。可是我却偏偏想着 业务层跟数据操作层用一个文件试试。结果代码就写成了这样。
public function onMessage($server, $request){
$data = json_decode($request->data, true);
switch ($data['code']) {
//发起匹配队列
case 1000:
DbCenter::matchPlayer($request->fd);
break;
//开启游戏
case 1001:
DbCenter::startRoom($request->fd,$data['room_id']);
break;
case 1002:
DbCenter::movePlayer($request->fd,$data['direction']);
break;
}
}
DbCenter中业务跟数据处理的代码
public static function matchPlayer($fd){
$key_fd = self::PREFIX_KEY . ":player_fd:" . $fd;
$play_id = self::redis()->get($key_fd);
$key = self::PREFIX_KEY . ":player_wait_list";
self::redis()->lPush($key, $play_id);
//发送匹配请求
self::$server->task(['code'=>3000]);
}
public static function startRoom($fd, $roomId){
$key_fd = self::PREFIX_KEY . ":player_fd:" . $fd;
$play_id = self::redis()->get($key_fd);
if(!isset(self::$global['rooms'][$roomId])){
self::$global['rooms'][$roomId] = [
'id' => $roomId,
'manager' => new Master()
];
}
}
可以看到的是,全屏都带着操作 redis的key,并且很多地方都是相同的代码,无限的在重复代码
甚至,假如把全部的业务都用一个文件完成,那代码可能就会是这个样子。
简直是 惨不忍睹,不忍直视。代码冗余,代码错乱
反思
现在重新回到项目开始,我发现对不同业务代码进行拆分是非常有必要的。但是,为什么要拆分?怎么拆分?拆分几部分?每一部分的职责都是做什么?
为什么要拆分?
假设一个功能一句代码就能实现,那根本不需要拆分。假设这个功能需要10行代码,那可能拆分的必要也不是很大,但是上百或者上千行代码,业务变得复杂,这就需要对业务进行拆分了。
怎么拆分?
假设我是算着代码行数,每写10行就分出一个方法。这可能也是一种拆分方式,但是却是不合理的。拆分是为了在别的地方用的时候不用重复写一遍,直接一句搞定。
拆分几部分?
正常是三大部分,网络层→业务层→数据操作层。但是每一层是否是多层还得视情况而定。比如说,数据操作层只是简单返回完整数据,就可能是Model,可能是多个Model集合成的Dao。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END