zoukankan      html  css  js  c++  java
  • 对,这是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处理层”。

    注意,这一层一定与业务无关,它所做的是又臭又硬又脏体力活。

    那么问题来了,我们怎么判断它是否与业务无关的呢:

    业务层所提供的是需要保证业务完整性的,它就如你给乡下配送一个电视机一样,必须是完整的一台电视机,你不能讲显像管与机身分开,不是一个完整的业务。

  • 相关阅读:
    centos ppp拨号
    Xen、KVM和VirtualBox比拼
    static用法一
    linux浏览器,邮件客户端,输入法,双屏设置,应用软件,gnome-screenshot/scrot -s截图,office
    OpenGl学习总结
    DICOM医学图像处理:DCMTK在VS2012中的配置
    linux下用mail发送邮件
    (HLS播放器之中的一个)HLS协议之M3U8解析
    tcpdump抓包分析具体解释
    对账简单说
  • 原文地址:https://www.cnblogs.com/xiezhengcai/p/5199891.html
Copyright © 2011-2022 走看看