0x01.二期的主要目的

二期主要是为了解决DetailAdapter代码膨胀的问题。目前DetailAdapter代码量已经达到了4300行。里面充斥了网络请求、业务逻辑、埋点逻辑、弹窗逻辑等等。在最小化对功能的影响的前提下(因为落地页有很多关键指标的埋点,包括商品浮层、播放loading率、起播时间等等),我们都是期待尽量少的动到过去的业务逻辑,其实之前尝试过做简单的重构,不过更多是把大的方法块分割成多个小的方法。其实作用微乎其微。

所以二期的主要目标是:

  1. 更小的类
  2. 更少的代码
  3. 更少的耦合
  4. 删除实验代码

怎么最大化的减少代码量。看了下《重构》,对应的是3.3过大的类。书中给出的药方是:extract class和extract subclass两个方法。并且提到如果你的large class是个GUI类,你可能需要把数据和行为移到一个独立的领域对象中。

那这里我们可以确定,需要做的大策略就是:抽取类出来。

那怎么去抽取类呢?我自己简单的做了个头脑风暴,把一些想法罗列了一下:

大家可以看到,我的头脑风暴是比较凌乱的,只是几个关键字,其中也有一些目前来看无效无意义的想法,但是头脑风暴就是这样的,帮你搜集自己的过往的思路来应对这个问题。

仔细梳理一下后,在Android上我们可能旧需要对架构做一定的调整了。最终我选择使用MVP来简要重构一下DetailAdapter。

大方向有了,下面就是执行了。

下面是我的几次架构调整的简单的草稿图:

0x02.探索方案1:activity作为v层,adapter作为转发

看图说话:这个调整,我们把activity作为V层,抽出来了一些接口方法,P层主要处理网络请求,处理各种manager。这次调整,我们把activity中的数据处理和网络请求移动到了presenter中去,同时也把adapter中的大量的数据处理和网络请求也移动到了presenter中去。

这样的改动会有个问题:

  1. 改动很大,影响面很大
  2. 因为adapter中的网络请求和逻辑更多,但是v层接口设置在activity,所以presenter中关于adapter部分的逻辑,回调到activity中的接口的时候,很多方法体只是针对adapter做了一层转发、

在以往的项目经历里,MVP的场景里,adapter层其实没那么厚,adapter中不会出现那么多的网络请求等等。之前还没遇到过这么厚的adapter层。比较常规的写法如下:
使用MVP来实现recyclerview数据
https://blog.csdn.net/qq_39914866/article/details/78513810
可以看到,实际上adapter层应该很薄,直接是activity层处理好数据之后转发进去

基于这个问题,我专门去网上查了下相关资料,在MVP里,Adapter怎么处理。多数资料告诉我:adapter其实就是presenter。但是基于目前的现状来看,显然不适用我当下的场景。

直到了看了下面这篇文章:
MVP中对adapter的一次修改
https://zhuanlan.zhihu.com/p/21427751

文中提到adapter可以作为V层的。所以有了下面的计划,计划设置两个v层接口,activity的和adapter的。

0x03.探索方案3:两个v层,activity和adapter两个v层

这个是调整之后的架构。我们可以看到activity和adapter都依赖了presenter,且activity和adapter之间的双向依赖没有了。

不过,表面看,这个架构是比较好的调整。但是因为改动实在是太大,到后期,已经不可控了。所以这个改动最终被我revert了。

0x04.最终方案4:还是一个V层,adapter作为V层

这个图里面,我们可以看到改动就比较小了,不过看着有点别扭,不像平常的MVP架构。做到了,保证少量且清晰的改动

但是这也是折中和妥协的方案,受限于测试等等,重构肯定不可能完全完美的。

我记得,之前有个朋友说,他们公司的MVP太难用了,同事都吐槽。其实现在想想,可能在很多技术都是受限于它所在的时代,是有一定历史原因的,所以重构也是,不是照办,而是因事因地制宜,因为受限于旧的代码逻辑,所以不可能,一下子就用最完美最新的技术方案重写一遍。所以重构是基于现状的创造,而不是生搬硬套。

此外,我们阅读代码发现,分享相关的逻辑足足有800-900行代码,我们通过extract class的方式,我们又抽取了一个分享的管理类,提炼出来了900多行代码。

大层面的调整结束后,我们又做了很多微小的重构,更多运用的都是《重构》里提到的一些方法,比如简化函数调用,重新组织函数,在对象之间搬移特性等等。基本上又迁移出来了一部分代码。

  • 方法的归属
  • 降低对presenter的耦合
  • 一个变量那种直接public取用即可,可以减少方法数
  • 入口初始化代码内聚,不对外暴露了
  • 多增加adapter和presenter的空判断,空指针判断
  • 删除一些冗余的代码
  • 能移动到工具方法里的移动到工具方法里
  • 专门写个dialogutils类吧,太多dialog了
  • 迁移出来未迁移出来的部分网络请求
  • 所有网络请求回调的地方都要重新做判断是finish了

0x05.总结

以上是二期目前做的事情,主要概括一下:

  1. MVC - MVP
  2. 抽取分享管理类
  3. 落地小的重构点

最终我们把adapter中的代码量从4300行控制到了2200行。且需要QA check的点甚至比重构一期还要少。

说说重构那些小事二:小视频落地页重构二期相关推荐

  1. 零基础微信落地页小程序实战项目

    前言 微信小程序简单易上手,只要有一些编程基础,即可快速开发基本的项目. 本项目是常见的,商品广告落地页小程序.提供商品浏览,商品列表按钮,购买,微信授权,手机号绑定,验证码校验,用户协议,消息通知, ...

  2. Java使用Jsoup和Selenium抓取西瓜小视频

    最近在家里无聊每天刷头条,看到一个很可爱的小姐姐,突然蹦出一个主意,就是想把它这些视频全部搞下来存到本地.网上搜了一下,发现这些视频其实是来自西瓜视频,根据用户名搜索就找到了.刚好会一点爬虫,这下就好 ...

  3. Android仿微信小视频录制功能(二)

    Android仿微信小视频录制功能(二) 接着上一篇,在完成了录制功能后,伟大的哲学家沃兹基索德曾经说过:"有录就有放.",那么紧接着就来实现播放功能,按照国际惯例,先上下效果图: ...

  4. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)

    使用方法 Gradle依赖: compile 'cjt.library.wheel:camera :1.1.9' 引用源码 :  clone源码后 引入lib -> camera 尝试运行 : ...

  5. vue怎么取消按回车下拉框自动下拉_八月更新第二版,小视频自动竖屏全屏播放,失效校验再次升级!...

    新方圆小棉袄,传说中的贴心小棉袄,宇宙无敌超级厉害. 记住我们的付费群(大佬众多):978260150,免费群:1101359539 1.方圆和海阔的规则导入和支付宝口令类似,将口令全部复制打开最新版 ...

  6. videoleap怎么导出本地_视频号小视频怎么制作?(附工具软件)

    这就出现了两个新问题:视频号发什么内容?小视频怎么使用编辑?有哪些视频号制作工具软件?这里,我们主要讨论第二个问题:怎么快速通过视频号制作工具编辑小视频? 我是助力视频号日涨万粉的万粉君! 一.音频利 ...

  7. css 实现app图标样式_uni-app开发一个小视频应用(一)

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,是一种终极的跨平台解决方案,这里的平台,主要指的是App平台(android.ios).小程序平台.H5平台.开发者编写一套代码,可发 ...

  8. 火山小视频尼尔森:2019新线消费市场人群洞察报告(附下载)

    该报告由火山委托尼尔森,针对国内城市发展新背景下的营销现状,进行了深度数据分析和大量人群调研,从四大维度定义出全新的营销抓手--新线城市概念. <新线报告>中提出,"经济发展趋势 ...

  9. h5应用 vue 钉钉_uniapp开发一个小视频应用(一)

    " uni-app 是一个使用 Vue.js 开发所有前端应用的框架,是一种终极的跨平台解决方案,这里的平台,主要指的是App平台(android.ios).小程序平台.H5平台.开发者编写 ...

最新文章

  1. 用C语言编程 限定输入的年月日,C语言程序设计: 输入年月日 然后输出是星期几...
  2. 软件测试工程师的角度看论证学问
  3. python错误-第16天:Python 错误和异常
  4. 深度学习之线性回归模型
  5. 报告!钉钉宜搭的8月总结,请查收~
  6. java 多线程学习
  7. 如何在SQL Server 2016中使用R合并和拆分CSV文件
  8. 条件include_10_函数原型、条件编译与重复定义错误 | C语言入门
  9. 10个修复ie6下bug技巧[转]
  10. 2021最新软件测试V4.0版本教程
  11. Activity 过渡动画 — 让切换更加炫酷
  12. socket编程详解(一)——服务器端
  13. 经典网页设计:25个精美的全屏背景网站设计作品
  14. timus 1741. Communication Fiend URAL 解题报告 DP+读题
  15. 致联系报考我免试研究生的同学们-山世光 研究员-中科院计算所
  16. Gluster文件系统
  17. 07.极限的四则运算法则
  18. Maxwell和Simplorer联合仿真设置注意事项
  19. seqCNA笔记-处理来自肿瘤样本的高通量测序拷贝数数据
  20. Unity3D游戏开发之网络游戏服务器架构设计(如何做一名主程)

热门文章

  1. 计算机用户变量path的初值,Windows10系统环境变量默认值(PATH变量原始值)
  2. java的get请求获取网络中的图片
  3. 消息队列产生严重消息堆积怎么处理?
  4. Springboot+netty网络聊天
  5. 糖尿病数据独家震撼挖掘-基于上百万临床实验数
  6. Arduino制作天猫精灵朋友天狗精灵-LD3320语音模块
  7. 【技术贴】解决支付宝充值信用卡还款跳转到网上银行报错Error 404 - Not Found
  8. 重磅开源!吴恩达新书《Machine Learning Yearning》完整中文版
  9. 曾国藩家书之劝学篇 摘录3
  10. python button使用方法_python 批量添加的button 使用同一点击事件的方法