iOS - App架构
不想成为架构的程序员不是好程序员。这篇文章主要是对App架构的理解
常见概念剖析
在做系统初始框架设计与系统重构的过程中,我们都会遇见下面的词。
系统与子系统
系统
系统
泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件
不能单独完成的工作的群体
。它的意思是总体
整体
或联盟
。
提炼一下关键内容:
- 关联:
系统
是由一群_有关联的_个体
组成的。例如:把一个发动机和一台 PC 放在一起不能称之为一个系统,把发动机、底盘、轮胎、车架组合起来才能成为一台汽车。 - 规则:系统内的个体需要按照指定的规则运作,而不是单个个体各自为政。规则规定了系统内个体分工和协作的方式。例如:汽车发动机负责产生动力,然后通过变速器和传动轴,将动力输出到车轮上,从而驱动汽车前进。
- 能力:系统能力与个体能力有本质的差别,系统能力不是个体能力之和,而是产生了新的能力。例如:汽车能够载重前进,而发动机、变速器、传动轴、车轮本身都不具备这样的能力。
没有关联的个体堆在一起不能成为一个系统。
子系统
子系统也是由一群有关联的个体所组成的系统,多半会是更大系统中的一部分。
其实子系统的定义和系统定义是一样的,只是观察的角度有差异,一个系统可能是另外一个更大系统的子系统。
以微信为例来做分析
- 微信本身是一个系统,包含聊天、登录、支付、朋友圈等子系统。
- 朋友圈这个系统又包括动态、评论、点赞等子系统。
- 评论这个系统可能又包括防刷子系统、审核子系统、发布子系统、存储子系统。
- 评论审核子系统不再包含业务意义上的子系统,而是包括各个模块或者组件,这些模块或者组件本身也是另外一个维度上的系统。例如,MySQL、Redis 等是存储系统,但不是业务子系统。
模块与组件
模块
和组件
都是系统的组成部分,只是从不同的角度拆分系统而已。
模块 | 组件 | |
---|---|---|
拆分角度 | 逻辑 | 物理 |
划分目的 | 职责分离 | 单元复用 |
最简单的网站系统为例
假设我们要做一个学生信息管理系统
- 从逻辑的角度来拆分,可以分为
登录注册模块
,个人信息模块
,个人成绩模块
等; - 从物理的角度来拆分,可以拆分为
Nginx
、Web 服务器
、MySQL
。
框架与架构
框架是和架构比较相似的概念,且两者有较强的关联关系,所以在实际工作中,这两个概念有时我们容易分不清楚。
从软件系统来说,框架是规范也是约束,可以理解为封闭性的话题,定义好,让别人如何去使用,而架构是一种结构,是一种开放性的话题,如何去设计组织架构,如何让架构更具有拓展性,减少沟通错误成本。
框架是规矩,架构是按照规矩做规划。系统是学校,子系统是班级,模块是学生老师,组件是课桌椅。每一层级的作用意义和范围不一样,要求和可复用度也不一样。
但是在iOS中
框架
- 编程规范,比如说MVC,MVVM等
- 静态库和动态库,比如Foundation,AFNetworking
架构
- CPU架构
- 分层架构
- 上面的框架
- 软件开发中的设计方案
- 类与类之间的关系、模块与模块之间的关系、客户端与服务端的关系
框架
MVC - Apple官方推荐
- Model
- View
- Controller
优点:View、Model可以重复利用,可以独立使用
缺点:Controller的代码过于臃肿
MVC - 变种
优点:对Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现
缺点:View依赖于Model
MVP
优点:对Controller进行瘦身,将Controller的一些业务代码移植到了Presenter里面
MVVM
一般搭配KVO实现双向绑定;
分层
架构进行分层理解