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处理层”。

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

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

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

对,这是http处理层的更多相关文章

  1. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  2. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  3. UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

    选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. ABP领域层

    1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...

  6. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  7. jQuery遮罩层登录对话框

    用户登录是许多网站必备的功能.有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框.这用方式比较灵活方便.而现在扫描二维码登录的方式也是很常见,例如QQ.微信.百度 ...

  8. 使用CSS3的box-shadow实现双透明遮罩层对话框

    box-shadow介绍 在我之前的一篇文章<从天猫和支付宝身上学习opcity与rgba>中,介绍了实现双透明遮罩层效果的两种方法,分别是opacity和rgba.他们需要分别依赖于不同 ...

  9. ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板 ...

  10. ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...

随机推荐

  1. linux java 版本

    之前linux已经安装了1.6的版本, 我想要升级,于是安装了1.7, /etc/profile 的最后几行是这么写的: JAVA_HOME=/usr/java/jdk1.7.0_79JRE_HOME ...

  2. [Hadoop大数据]——Hive数据的导入导出

    Hive作为大数据环境下的数据仓库工具,支持基于hadoop以sql的方式执行mapreduce的任务,非常适合对大量的数据进行全量的查询分析. 本文主要讲述下hive载cli中如何导入导出数据: 导 ...

  3. C#设计模式-代理模式

    在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替 ...

  4. 导入镜像文件,分区启动liunx

    1:更改虚拟机配置 2:导入系统镜像 3:启动虚拟机,选择第一个选项回车 4:这里问你是否检查镜像,我们的镜像肯定没问题不需要检查,点击Skip 5:语言选择,按提示默认下一步 6:主机名也默认 7: ...

  5. Spring学习记录(五)---bean的作用域scope

    作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...

  6. JAVA基础-输入输出:1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。

    1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上. package Test03; ...

  7. iOS点击状态栏回到顶部底层实现原理

    在iOS开发中,苹果其实已经帮你实现了点击状态栏回到顶部这个功能,但我们在开发中会遇到点击不能回到顶部.其实这都和 ScrollView中的一个属性scrollsToTop有关,我们先看看苹果关于这个 ...

  8. Sql Server系列:流程控制语句

    T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...

  9. jQuery 2.0.3 源码分析Sizzle引擎 - 高效查询

    为什么Sizzle很高效? 首先,从处理流程上理解,它总是先使用最高效的原生方法来做处理 HTML文档一共有这么四个API: getElementById 上下文只能是HTML文档 浏览器支持情况:I ...

  10. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...