仅作个人记录

学习自

https://blog.csdn.net/qq_22744433/article/details/77948442

模块化的优点

快速移植

这是许多模块化能做到但是没有去做的一点,我认为项目在一个新的工程里做是最好的,用新项目强行约束了developer不能依赖其他模块与基类

但是这样一来也会有问题

不依赖模块,怎么跳转到其他模块

比如我完成了车票的订单,现在要在订单完成页“交叉销售”酒店,我怎么跳转呢?

很简单,Intent隐式跳转(用路由代替为佳)。从显示依赖转移到了隐式依赖。

路由的设计很简单,只需要写一个xml,每个模块再写一个模块级路由器即可。

不依赖基类,怎么实现功能

比如下拉刷新?

可以由上面得到启发,隐式依赖功能。

先看一下ARouter框架是如何实现的

public interface IPullRefreshService {

void pullRefresh(RecyclerView rv);

}

IPullRefreshService service =ARouter.getService("下拉刷新");

service.pullRefresh(recyclerView);

耦合了ARouter和接口。更进一步可以取消接口的耦合,也省去了定义接口的麻烦。

ServiceExecutor. execute ("下拉刷新", recyclerView);

现在只耦合了依赖管理库,怎么更进一步解决依赖管理库的耦合呢?

Class clazz = Class.forName(“类路径”);

Object object = clazz.newInstance();

Method method = clazz.getDeclaredMethod(“execute”);

method.invoke(object, “下拉刷新”,recyclerView);

原理就是通过反射获取依赖库并反射调用其方法

Class和Method都可以缓存,但是invoke依然存在一点点的性能消耗(其实几乎没消耗了)。所以可以约定接口来调用方法。下面是进一步优化

public interface ServiceExecutor {

void execute(Object...obj);

}

ServiceExecutor executor =

(ServiceExecutor)Class.forName(“类路径”).newInstance();

executor.execute(“下拉刷新”,recyclerView);

ServiceExecutorImpl implements ServiceExecutor{

private void execute(StringdependencyName, Object...args) {

switch(dependencyName){

case “下拉刷新”:

if(args.length == 1 && args[0] instanceof RecyclerView)

PullRefreshService.wrap((RecyclerView)args[0]);

break;

default:

break;

}

}

}

这样的好处是有一个类可以集中管理依赖,坏处是依赖太多的时候,这个类的代码量会巨大无比,加载到内存中是一笔不小的开销(开销是多少还需要具体分析)。可以考虑仅仅让一个小服务比如PullRefreshService来实现ServiceExecutor接口,如果希望集中管理依赖,通过文本的形式就可以了。

最后一个思路是通过EventBus,我觉得这个方法很不错。

解耦首页,减少冷启动时间

一开始我还不太理解,接触了某个模块化的项目后才明白。因为如果不做模块化,在系统开启,某模块还未打开之前,或多或少会提前执行一些任务,做了模块化,再配合组件化编译隔离强行约束,就杜绝了这种可能。这样一来,首页启动优化只需要关注首页的必须逻辑即可。冷启动时间真的是会显著地下降的。

开发时减少build时间

这里的美团猫眼是另起了一个项目,自然build时间大大缩短。正常组件化都是放在一个项目里跑的,通过编译隔离,只编译入口模块和项目组维护的模块,使得一个大型项目,可以在很短的时间内运行到真机上,方便了调试。

原文说的很好:无沟通成本,快速,傻瓜式的在任何app上运行。这就是模块化要实现的目标,但是很显然,现在许多已模块化的项目还做不到这一点,解耦地不够彻底。

其实我感觉,做模块化的时候,注意单一职责,接口隔离,隐式即可。

资源拆分

原文说资源注意增加限定名,否则项目整合的时候资源名会冲突。这是比较一般的做法,正常的都会通过一些手段来区分,这个后续在atlas架构解析中会展开。

通信

原文说基础库防止膨胀,可以弃用EventBus,改用本地广播。此外减少不必要的通信,可以存数据库,另外的页面在onResume读取数据库即可,我觉得这也是个不错的思路。

监听宿主

因为有需要用户身份,位置信息等数据从主模块传过来。而且其一致性是非常重要的。原文采用的方式是ContentProvider。事实上许多模块都是独立的,退出后需要重新创建(如果留有备份反而不利于内存低水平运行),所以这个同步不是那么重要。非要同步急用

大型架构学习——美团猫眼模块化实践相关推荐

  1. 美团猫眼android模块化实战-可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://blog.csdn.net/qq_22744433/article/details/7794844 ...

  2. 美团猫眼电影android模块化实战--可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://www.jianshu.com/p/d372cc6802e5 目录 1 写这篇博客的初衷 首先一句 ...

  3. 大型网站架构学习笔记

    前言 最近一直在拜读两本书: 1.李智慧老师的<大型网站技术架构 核心原理与案例分析> 2.曾宪杰老师的<大型网站系统与Java中间件实践> 看了并结合自己目前的工作进行了思考 ...

  4. KDD Cup 2020 自动图学习比赛冠军技术方案及在美团广告的实践

    ACM SIGKDD (国际数据挖掘与知识发现大会,简称 KDD)是数据挖掘领域的国际顶级会议. 美团到店广告平台搜索广告算法团队基于自身的业务场景,一直在不断进行前沿技术的深入优化与算法创新.团队的 ...

  5. 带哨兵节点的链_深入学习Redis高可用架构:哨兵原理及实践

    原标题:深入学习Redis高可用架构:哨兵原理及实践 " 在上篇文章<深入学习 Redis 高可用的基石:主从复制>中曾提到,Redis 主从复制的作用有数据热备.负载均衡.故障 ...

  6. Presto实现原理和美团的使用实践

     Presto实现原理和美团的使用实践 Facebook的数据仓库存储在少量大型Hadoop/HDFS集群.Hive是Facebook在几年前专为Hadoop打造的一款数据仓库工具.在以前,Fac ...

  7. 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式

    进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...

  8. 业界分享 | 美团搜索排序实践

    作者 | 陈胜 美团 搜索排序负责人 整理 | DataFunTalk 美团的业务品类非常多,不同业务之间的履约方式差异很大.例如当用户进行搜索时,返回的是一个异构混排后的结果,可能会推荐一些具体的到 ...

  9. 大型网站系统与Java中间件实践

    大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4 ...

  10. 构建大型云计算平台分布式技术的实践

    本文基于章文嵩博士在2014年7月18日的全球架构师峰会ArchSummit上的主题演讲<构建大型云计算平台分布式技术的实践>整理而成.演讲slides可从ArchSummit官网下载. ...

最新文章

  1. Arduino可穿戴教程之第一个程序——Blink(一)
  2. Scrapy 1.4 文档 01 初窥 Scrapy
  3. 人人可懂的机器学习入门要点和阅读路径:学什么?怎样学?
  4. 【Pandas】dataframe 设置完全显示所有列
  5. Maven项目添加FindBugs、PMD插件
  6. Unreal4有哪些令你印象深刻拍案叫绝的设计
  7. Markdown 添加emoji
  8. Embedding 技术在推荐系统中的应用实践
  9. DEDE织梦标签名称:{/dede:arclist} 详解
  10. HD Tune Pro硬盘检测工具官方版
  11. JS编写人物行走动画
  12. secs/gem协议系统通讯平台
  13. mmdetection使用目标检测工具箱训练,测试
  14. 条码打印软件里如何批量编制69商品条码?
  15. 全志A10平板上的ubuntu终极安装版,支持HDMI和平板本机LCD
  16. 【进阶5-1期】重新认识构造函数、原型和原型链
  17. 区块链(一): 以太坊基础知识
  18. linux 登陆sybase_SYBASE在linux下的安装
  19. 深度学习基础之一个神经元
  20. 寻梦环游记:教你打造独特的职场标签

热门文章

  1. 四、随机变量及其分布函数的基本定义和性质 random variables and distribution
  2. python中的error:excepted an indented block
  3. html好看css标题样式,比较好看的css 自定义样式(标题 h1 h2 h3)
  4. 三角函数公式及工程应用
  5. 第六章 用正三和弦为含跳进旋律配和声
  6. 抖音快手短视频去水印API,接口开发文档
  7. 迅雷下载遇到“应版权方要求无法下载”,怎么办
  8. ubuntu20.04显卡驱动3分钟安装方法
  9. OSI参考模型各层的功能详解
  10. python类似图片查找_python检测相似图片