对,这是http处理层
16年2月的一次代码重构,面对如此肮脏丑陋的代码我困在了座椅上整整一天的时间。
底层用java写的api接口,通过http去调用,在之上是用php写的业务逻辑层,重构的代码,正是php这一层。
public function meetList(){ $timeBucket = array( "all" => array("start"=>"","end"=>"",'type'=>1,'playStatuses'=>''), "now" => array("start"=>date('Y-m-d'),"end"=>date('Y-m-d'),'type'=>1,'playStatuses'=>''), "week" => array("start"=>date('Y-m-d', time() + 86400 * 1),"end"=>date('Y-m-d', strtotime("+7 day")),'type'=>2,'playStatuses'=>''), "month" => array("start"=>date('Y-m-d', time() + 86400 * 1),"end"=>date('Y-m-d', strtotime("+30 day")),'type'=>2,'playStatuses'=>''), "weekHistory" => array("start"=>date('Y-m-d', strtotime("-7 day")),"end"=>date('Y-m-d', time()),'type'=>4,'playStatuses'=>3), "beforeWeek" => array("start" => date('Y-m-d', strtotime("2000-1-1")),"end" => date('Y-m-d', strtotime("-7 day")),'type'=>4,'playStatuses'=>3), "day" => array("start" => date('Y-m-d', strtotime(I('get.day'))),"end" => date('Y-m-d', strtotime(I('get.day'))), 'type'=>1), ); if(I('get.select') != "") { $hot = array('click','join'); $postData = array( 'page'=> I('get.page', 1), 'limit'=> I('get.limit',20), 'uid' => I('get.uid'), 'meetClass'=> I('get.meetType')?I('get.meetType'):"", 'type' => in_array(I('get.select'), $hot) ? I('get.select') : $hot[1], 'timeType' => $timeBucket[I('get.timeBucket')]['type'], 'playStatuses'=> $timeBucket[I('get.timeBucket')]['playStatuses'], 'sdate' => $timeBucket[I('get.timeBucket')]['start'], 'edate' => $timeBucket[I('get.timeBucket')]['end'] ); $result = $this->getData('meet/hotMeetList',$postData); } else { $postData = array( 'uid'=> I('get.uid',''), 'meetClass'=> I('get.meetType')?I('get.meetType'):"", 'page'=> I('get.page', 1), 'limit'=> I('get.limit',20), 'type' => $timeBucket[I('get.timeBucket')]['type'], 'playStatuses'=> $timeBucket[I('get.timeBucket')]['playStatuses'], 'sdate' => $timeBucket[I('get.timeBucket')]['start'], 'edate' => $timeBucket[I('get.timeBucket')]['end'] ); $result = $this->getData('meet/meetList', $postData); } if(!$result['success'] && !$result['data']['topics']['items']){ $this->ajaxReturn($result); } $items = $result['data']['topics']['items']; $mids = i_array_column($items,'id'); $status = $this->getData('user/relatedMeetStatus', array('uid' => I('get.uid'), 'mids' => implode(',', $mids))); $favoriteds = array_reduce($status['data']['meets'],function($w,$v){ $w[$v["mid"]]= $v; return $w; } ); foreach ($items as $k => $val) { $value['mid'] = $val['meetBase']['mid']; $value['playStatus'] = $val['meetBase']['playStatus']; $value['priority'] = $val['meetBase']['meetPriority']; $value['meetTitle'] = $val['meetBase']['meetTitle']; $value['holdDay'] = date('Y-m-d', strtotime($val['meetBase']['startTime'])); $value['startTime'] = date('H:i', strtotime($val['meetBase']['startTime'])); $value['endTime'] = date('H:i', strtotime($val['meetBase']['endTime'])); $value['addr'] = $val['meetBase']['addr']; $value['oid'] = $val['meetBase']['oid']; $value['cnName'] = $val['orgBase']['cnName']; $value['guestSpeaker'] = $val['meetBase']['guestSpeaker']; $value['pstatus'] = $val['meetBase']['pstatus']; $value['coverUrl'] = $val['meetBase']['coverUrl']; $value['logo'] = $val['orgBase']['logo']; $value['favorited'] = $favoriteds[$value['mid']]['favorited']; $items[$k] = $value; } $result['data']['topics']['items'] = $items; $this->ajaxReturn($result); }
这些代码都做了什么。第一部分根据http发送过来的参数不同而做适应接口调用传递的参数。通过get.select[GET请求的select参数]值的判断而组装不同的数据调用不同的接口。再根据页面的需求调用user/relatedMeetStatus接口将数据组装到response中,最后还有一段数据的抽取与格式化。
整整70行代码,绝大部分是赋值语句,这样的代码看起来又臭又硬,编程的艺术在哪儿?
我想优化它,却无从下手!
它应该存在,就是一坨屎,与艺术无关。
这些代码就像是一个肮脏的动物进城之前清洗衣服而已,或许是一个快递员将一个货物送进城。不管它进城之后的加工有多么的艺术优雅,总之进城之前就是用马车压过马屎拉过进来的。这些就是马屎,碾过这些马屎才能进入优雅的大堂。同样,在response的时候也如下乡一样,快递员又用马车压过马屎拉下乡了,这是体力活,没有艺术,别谈优雅。臭,去臭吧。
或许,我们应该给它一个名字“HTTP处理层”,
它干什么呢:
表单数据验证
数据过滤
拼接
调整
字段重命名
格式化
这些工作,是与业务无关的,它的实现也没有什么艺术价值,完全可以单独隔离出来,称它为“HTTP处理层”。
注意,这一层一定与业务无关,它所做的是又臭又硬又脏体力活。
那么问题来了,我们怎么判断它是否与业务无关的呢:
业务层所提供的是需要保证业务完整性的,它就如你给乡下配送一个电视机一样,必须是完整的一台电视机,你不能讲显像管与机身分开,不是一个完整的业务。
posted on 2016-02-19 09:41 xiezhengcai 阅读(445) 评论(0) 编辑 收藏 举报