Android基础第九天 | 青训营笔记

70 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第9天

客户端架构设计和应用

01 架构面临的问题

1.1 产品和架构的生命周期

image.png

1.2 不同技术领域的架构问题

image.png

1.3 一些其他挑战

image.png

image.png

1.4 典型的客户端架构——Android OS

image.png

1.5 典型的客户端架构——IOS

image.png

1.6 典型的客户端架构——flutter

image.png

1.7 小结

  • 架构设计是为了解决特定领域不同发展阶段的业务问题

  • 不同领域的架构有明显的技术差异,但也有很多相似性

  • 架构不仅面临技术挑战,还要应对组织业务膨胀的嫡增

  • 移动端需要利用有限的设备资源设计符合小屏幕的架构

02 常见的架构手段

2.1 小的架构手段——GoF设计模式

2.2 小的结构手段——MVC

image.png

视图:XML

控制器:Activity中设置点击事件

模型接口:更新UI

数据和视图并没有完全解耦,控制器和视图耦合在一起,Activity会膨胀

2.3 小的架构手段——MVP

image.png

数据和视图完全解耦了,控制回路太庞大。

2.4 小的架构手段——MVVM

image.png

2.5 MVC/MVP/MVVM

image.png

2.6 小的架构手段——AOP

面向切片编程思想。

image.png

2.7 小的架构手段——IOC

image.png

2.8 小的架构手段——IoC:实例SPI

image.png

2.9 大的架构手段

image.png

2.10 小结

  • 不同架构手段的共同目标是高内聚低耦合

  • 找到适合业务场景的架构而不是炫技滥用

  • 一个复杂的系统是多种架构模型的组合体

03 架构演进的例子

3.1 孕育期

做一个信息流产品,可以无限刷的列表

  • 首先,需要实现一个列表,支持上下滑动

  • 然后,每次滑动,都需要请求服务端数据

  • 接着,列表的每一项都需要响应点击操作

image.png

3.2 婴儿期

产品功能开始变多,需要拆分模块

  • 首先,需要支持图文内容的组合混排显示

  • 接着,需要引入账号体系,用户注册登录然后,用户可以收藏感兴趣的内容并分享 ...

  • 继续,场景越来越多,拆分网络和多线程

image.png

3.3 学步期

业务场景变多,需要拆分业务

  • 首先,支持用户发布文章,并给予奖励

  • 接着,视频这个重要的内容也需要支持

  • 然后,不同业务之间越做越大需要拆分

  • 继续,拆分出视频业务,架构自成体系

  • 继续,拆分出中台业务,供多业务使用

image.png

3.3.1 学步期——分层架构

image.png

3.4 青春期

不同业务和模块混合,需要解耦

  • 首先,需要约定模块可以对外提供的能力

  • 接着,模块之间需要遵循相同的调用方式

  • 然后,旧的模块需要按照相同标准来改造 ...

  • 继续,使用方不应该直接依赖于实现方

image.png

3.4.1 青春期——事件驱动架构

image.png

3.4.2 青春期——事件驱动架构实例

image.png

3.5 壮年期

业务变得更加内聚,需要灵活插拔

  • 首先,扫一扫等能力不是所有场景都需要

  • 接着,视频的子能力可以拆解后按需使用

  • 然后,越来越多的业务想动态化发布产物

  • 继续,动态化发布引入很多问题需要调优

image.png

3.5.1 壮年期——微内核架构

image.png

3.5.2 壮年期——插件原理Mira ClassLoader

image.png

3.5.3 壮年期——插件原理Mira插件注册

image.png

3.6 稳定期

用户规模和团队稳定,历史包袱重

  • 首先,经过前期快速发展已经积累了大量历史包袱

  • 接着,需要深入了解业务才能设计出更合理的架构

  • 然后,很多改动牵一发动全局,代码被迫变得更差 ...

  • 继续,新旧技术栈共存,版本依赖冲突,冗余代码

image.png

3.6.1 稳定期——微服务架构

image.png

3.7 贵族期

image.png

3.8 官僚期

  • 人们相互甩锅

  • 代码混乱无序

3.9 不同形态的架构

image.png

3.10 小结

  • 架构随业务发展由简单变得复杂是规律

  • 没必要最初用复杂架构来解决简单问题

  • 需要用规范持续重构来对抗代码的腐朽

04 成为优秀架构师

定义问题 → 确定架构 → 方案落地 → 结果复盘

4.1 认清问题

4.1.1 认清问题——分类

架构的问题是盘根错节的,将所有问题放在一起,就有轻重缓急之分,就有类别之分

区分问题的类别,就能在一定的边界内,匹配上对应的人来解决问题

4.1.2 认清问题——分级

挑战、问题、手段这些经常混为一谈,哪些是挑战?哪些是问题?那些是手段?

其实这些都是一回事,就是矛盾,只是不同场景下,矛盾所在的层级不同

4.1.3 认清问题——问题背后的问题

image.png

4.2 勤于编码

Ctrl c + v

4.3 架构追求

image.png