编程思想-0x00架构
产生架构的原因?
1、代码均摊
将不同的代码进行分块,然后简历联系,低耦合、高内聚;
原则上:
合理的App架构应该是合理分配每个类、结构体、方法、变量的存在都应该遵循单一职责的原则
2、便于测试
测试确保代码质量;
单元测试、性能测试、UI测试 对单个方法或界面进行测试。 合理解决了分配决定了各个测试能够各司其职、不重复、不遗漏,让测试效率和覆盖率达到最大。
3、具有易用性
确保App架构也可以保证他们能快速学习并适应。
常见的架构有:MVC(MVCS)、MVP、MVVM、VIPER ...
0x01 MVC [model-view-controller]
Model层:负责数据处理,包括网络数据和持久化数据的获取、加工等;
View层:负责处理界面绘制,展示数据,并对用户产生及哦啊胡反馈等;
Controller: 负责处理业务逻辑等。
MVC分为主动模式
和被动模式
—— 根据Model来划分
被动模式
:不会主动将它的变化通知给View进行更新,而是由Controller更新View关于Model的变化; 而且只有Controller可以对Model进行更新;
主动模式
:Model的修改会通知View更新,利用观察者模式:View为观察者,Model为被观察者。 在Web端,传统意义上的MVC是主动模式; 而在移动端,对数据变化频繁的场景,可以应用MVC的主动模式。
优点
代码量少
:基于MVC上大量的逻辑和试图代码都集中在VC中,View和Model有严格区分,代码分配遵循一定原则
简单易懂
:新手可以快速上手
缺点 —— 主要是视图层
和控制器层
高度耦合造成的
1、代码过于集中
:VC两部分高度耦合,它处理交互、视图更新、布局、Model数据获取、修改、导航等几乎所有的操作
2、难以进行测试
:高度耦合,使得检测为主的单元测试需要配合特定试图才能够进行,让测试难度增大
3、难以扩展
:VC中添加性功能要格外小心,高耦合容易出错。 View和VC高度耦合,可能会改动很大的代码
4、Model层过于简单
:model层基本上只是定义几个属性,.m文件中基本上看不到代码
5、网络请求层无从安放
:网络层如果放在model层, 其异步调用API请求会使得整个model层变得复杂;放在“”VC中, VC更加复杂。 缺点会被更加的放大。
小结:MVC代码分配过于笼统,对于任何一个雷,主要不是View或Model就会放到vc中,VC类耦合了视图和控制器。
MVCS
针对MVC的优化;
S【store】【service】 一般存储层(eg:CoreData)就是store;将它从Model或者vc中才分出来构建单独文件; MVC的网络可以放到S层,逼近网络请求获得数据,要进行缓存和持久化处理,所以放在数据层中也比较合理。
拆分出来,代码更加均衡,VC难以单元测试,通过数据层拆分了之后,整体架构的维护和扩展也起到了促进的作用。
0x01 MVP [model-view-presenter]
相比MVC, model功能一样 MVC中的View和Controller耦合在View类中 MVP View是单独的UIView/UIViewController, Presenter是单独的类。
MVP中的View层是单独的Class[UIView/UIViewController],它持有Presenter作为变量; View接收到用户交互信息时,它会调用Presenter进行处理; View层不包括任何业务逻辑代码,它只会将交互给Presenter, 并从Presenter中接收结果来更新自己。
View持有Presenter,所以Presenter中的View应该声明为weak或unowned,避免循环。
优点:解耦View和Controller之间的耦合,将View和Presenter区分得更加清楚。将业务划分更加精细
缺点:View所有的交互都传给Presenter处理,一旦项目功能增加了,View的代码和Presenter的代码将会增加。 相比MVC在VC一个文件里面就解决,MVC总代码量会增加。App维护成本和文件会增大。
0x02 MVVM - [model-viewmodel-view]
ViewModel: 提供数据、交互响应, 替换presenter
ViewModel一般扮演两个角色: 1)视图层的真正数据提供者
一般视图层展示的数据经常是一个或多个模型的属性组合。
eg: 微薄数据流界面,可能一个微薄用户模型有FirstName, LastName, status, post等多个属性; ViewModel就会将这些数据整合在一起,使得视图直接调用单个数据就能够展示索要的效果。
2)视图层的交互响应者
所有用户的及哦啊胡都会传递给ViewModel, ViewModel会一次更新视图层需要的属性,同时相应修改模型层的数据,这里依靠的是属性观察
或响应式架构
; 这里是View和ViewModel关系,而MVC中的主动是View和Model的关系。
小结:ViewModel代替Presenter,增加了数据绑定的功能。
MVX的这三种架构的区别
M:Model模型层 V: View 视图层 C/P/VM: 中间层 Controller, Presenter,ViewModel
1)模型层几乎相同 三种架构的魔心从理论上说都是数据来源,没什么不同;
2)视图层在理论上都设计为被动,但是实际上略有不同
MVC
:实际上,视图层和中间层高度耦合,几乎所有的操作都是统一由ViewController包办;理论上,视图层是淡村的UIView或UIViewController,只是负责UI的更新和交互,不涉及业务逻辑和模型更新; —— 实际上,MVP和MVVM的视图是实现了MVC理论期望,即为中间层严格分离。
MVP
:视图层完全是被动的,单纯地把交互和更新传递给中间层
MVVM
:视图层并不是完全被动, 它监视中间层的变化,一旦产生变化,则视图层会响应变化。
3) 中间层的设计是三种架构的核心差异 逻辑上
:中间层的作用是连接视图层和模型层,用于处理交互、接受通知和完成数据更新;
MVC中间层Controller 持有视图和模型,主要起到组装和连接的作用;通过传递参数和实例变量直接完成所有操作
MVP中间层Presenter持有模型,在更新模型上与MVC中的Controller是一样的;但是它不用有视图,视图拥有中间层;中间层的工作流:从视图层接收交互传递更新模型;接受模型的通知,更新视图。 全部操作必须手动书写代码完成。
MVVM中间层View Model持有模型,在更新模型上与前两者相同,它完全独立于视图,视图层拥有中间层,通过绑定属性自动进行更新,全部操作由响应式逻辑框架自动完成。
优缺点 MVC的耦合度很高, 代码分配最不合理, 维护和扩展成本最高。 但是因为无需层级传递, 所以代码总量最少, 适合初学者理解和应用;
MVP和MVVM相似, 耦合度和代码分配都比较合理, 比较容易实现搞测试覆盖率。
MVP的缺点是视图层需要将所有的交互传递给中间层, 且要手动实现响应和更新, 所以总代码量远远超过MVVM。
MVVM 在响应和更新上, 通过响应式框架自动操作, 大大精简了代码量; 但是需要引入第三方响应式框架, 同时, 因为属性观察环环相扣, 调用栈很大, 所以Debug起来尤为痛苦;
三者都是以视图为驱动的架构;即为:以用户交互和试图更新为主要服务目标。
公共缺点:没有涉及到页面之间的跳转 —— 路由的设计
0x04 VIPER之间的各组件是如何交互的
关键词: 路由、interactor 五个组成部分:View、Interactor、Presenter、Enity、Router
1)视图层(View)
:与MVP、MVVM视图层类似,它包含UI相关的一切操作;它接收用户的交互信息但并不处理,而是传递给展示层(Presenter)
2)展示层(Presenter)
:与MVP的presenter或MVVM的VM类似,对于它更加类似MVVM还是MVP,取决于是否引入响应式编程架构; Presenter 在这里只响应并处理视图层传来的交互操作请求,并不直接对数据源进行修改,这个与MVX中间层最大的区别;若是需要修改数据,展示层会向其持有的数据管理层(Interactor)发送请求, Interactor 会处理一切有关数据源的操作。 此外他还有路由了路由层(Router)
3)路由层 (Router)
:专门负责界面跳转和组件之间的切换;当App占用空间较小时候,Router负责页面跳转; 当APP占用空间较大的时候,不同的功能和业务会被拆分成不同的模块和组件,Router的作用就是在不同组件之间进行连接。 这就是MVX架构所忽略的部分;
4)数据管理层(Interactor)
:专门负责处理数据源信息, 包括你网络请求、数据传输、缓存、存储、生成实例等操作。 实际上, 之前中间层和模型层的一些逻辑被进一步剥离至此, 整个架构的逻辑也显得更加清晰。
5)型层(Entity)
:只拥有初始化方法和属性相关set/get方法, 与之前的Model层大同小异;
小结
:由于分工明确, VIPER 层在代码分配、测试覆盖率上为所有架构之冠。而VIPER的缺点在于, 它依然与MVX架构一样, 是一个视图驱动的架构。同时VIPER由于分工精确, 不同的层级之间交互的代码很多, 总体代码量很大, 不适宜用在小型App中。
本文由 mdnice 多平台发布
相关文章:
编程思想-0x00架构
产生架构的原因? 1、代码均摊 将不同的代码进行分块,然后简历联系,低耦合、高内聚; 原则上:合理的App架构应该是合理分配每个类、结构体、方法、变量的存在都应该遵循单一职责的原则 2、便于测试 测试确保代码质量&…...
QCon演讲实录(上):多云环境下应用管理与交付实践
作者:阿里云大数据基础工程技术团队——郭耀星 大家上午好!我是来自阿里云大数据基础工程技术团队的郭耀星,花名雪尧。今天我很高兴能够来到QCon,与大家分享我的经验和心得。在当前的多云环境中,作为运维支撑团队&…...
async thunk 解决 API 调用的依赖问题
async thunk 解决 API 调用的依赖问题 一句话节省看下面一堆内容的时间就是: async thunk 中可以使用 async/await 锁住其他的 action 操作 一般 API 之间存在三种情况: A 和 B 之间没有依赖关系 这样的情况下,A 和 B 可以各调用各的&#x…...
java 黑马头条 day3 实名认证分布式事务问题 seata
1 完善实名认证功能 1.1 实名认证分布式事务问题 1.1.1 问题分析 在昨天的实名认证代码中,审核完毕后添加 id5的演示异常,重新使用postman进行测试, 会发现 出现异常后 本地方法因为有 Transactional注解 对ap_user ap_user_realname的操作会回滚 而…...
测试开发之Django实战示例 第七章 创建电商网站
第七章 创建电商网站在上一章里,创建了用户关注系统和行为流应用,还学习了使用Django的信号功能与使用Redis数据库存储图片浏览次数和排名。这一章将学习如何创建一个基础的电商网站。本章将学习创建商品品类目录,通过session实现购物车功能。…...
【C++之容器篇】造轮子:list的模拟实现与使用
目录前言一、关于list1. 简介2. 成员类型二、默认成员函数1. 构造函数1. list()2. list(size_t n,const T& val T())和list(InputIterator first,InputIterator last)2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数三、迭代器1. 普通对象的正向迭代器2. const对象的正向…...
自动驾驶:决策规划算法岗位面经分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页: 主要分享计算机算法类在面试互联网公司时候一些真实的经验 人情况是985本硕,硕士研究方向是强化学习在移动机器人路径规划中的应用,一段自动驾驶中小厂实习经历,秋招找的大都是机器人和自动驾…...
2.7、进程调度的时机、切换与过程、方式
1、进程调度的时机 进程调度\color{red}进程调度进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机 进程在操作系统内核程序临界区\color{red}操作系统内核程序临界区操作系统内核程序临界区中不能\color{red}不能…...
工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
ESP32S3系列--SPI从机驱动详解(一)
一、目的 在之前的博文中《ESP32S3系列--SPI主机驱动详解(一)》、《ESP32S3系列--SPI主机驱动详解(二)》我们详细讲解了ESP32S3上的SPI外设如何工作在主机模式并通过代码的形式帮助大家理解。 本篇我们将介绍SPI外设工作在从机模式下的使用知识点。 二、介绍 参考资料 http…...
【实战篇】移动端H5网页在ios滑动不流畅和禁止缩放问题
问题描述:移动端H5网页在ios滑动不流畅和禁止缩放问题 最近开发小程序,有一个富文本展示页面使用的是<webview>H5网页嵌入的,当你用 overflow-y:scroll 属性的时候,内容超出容器溢出滚动的效果很迟顿,特别是在IOS系统中,而且页面还会缩放。 解决方案: 1…...
12 循环神经网络(基础篇) Basic RNN
文章目录问题引入关于权重权重共享RNN CellRNN原理RNN计算过程代码实现RNN Cell维度说明代码RNN维度说明NumLayers说明计算过程代码参考实例问题分析多分类问题代码RNN CellRNN改进Embedding网络结构Embedding说明Linear说明代码课程来源: 链接课程文本参考…...
【C语言必经之路——第11节】初阶指针(2)
五、指针的运算1、指针与整数相加减看一下下面的代码:#include<stdio.h> int my_strlen(char* str) {int count0;while(*str!\0){count;str;//指针加减整数}return count; } int main() {int lenmy_strlen("abcdef");printf("%d\n",len);…...
SpringBoot学习(1)第一个SpringBoot程序
之前的SpringMVc就不在记录了,好像时间不太够了,但是springmvc作为javaweb的升级学一学对于springboot还是有较大的帮助的。 首先我们需要引入依赖,但是请注意,其中的一个不算是依赖,写法有所不同 首先需要引入 <…...
什么是热迁移?90%的企业都理解错误
科技的发展,新冠的冲击,让市场竞争愈发激烈。尽管云计算服务为企业免除了基础硬件的建设和维护成本,当企业需要进行业务跨架调整、升级维护、环境测试等场景而进行云迁移,其过程中所带来的停机时间,就变得尤为头疼了。…...
Scratch少儿编程案例-丝滑版贪吃蛇
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
Linux系统之网卡子接口配置方法
Linux系统之网卡子接口配置方法一、本地系统环境检查1.检查系统版本2.检查系统内核版本3.检查本地IP地址二、网卡子接口介绍1.网卡子接口简介2.网卡子接口的优点3.网卡子接口的缺点三 加载802.1q 模块1.查看系统802.1q 模块信息2.加载802.1q 模块3.检查802.1q 模块加载状态四、…...
2023上半年软考中级系统集成项目管理工程师2月25日开班
系统集成项目管理工程师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职…...
YOLO-V5轻松上手
之前介绍了YOLO-V1~V4版本各做了哪些事以及相较于之前版本的改进。有的人或许会想“直接学习最近版本的算法不好吗”,在我看来,每一个年代的版本/算法都凝聚着当年学术界的智慧,即便是它被淘汰了也依旧有值得思考的地方,或是可以使…...
CSS的优先级理解
权重 的 4个等级定义我们把特殊性分为4个等级,每一个等级代表一类选择器,每个等级的值相加得出选择器的权重。4个等级的定义如下:第一等级:代表内联样式,如style"",权值为 1000第二等级ÿ…...
前端工程师leetcode算法面试必备-二分搜索算法(中)
一、前言 二分搜索算法本身并不是特别复杂,核心点主要集中在: 有序数组:指的是一个递增或者递减的区间(特殊情况如:【852. 山脉数组的峰顶索引】); 中间数:用来确定搜索目标落在左…...
【数据库】MySQL 单表查询,多表查询
目录 单表查询 一,创建表worker 1,创建表worker的sql代码如下: 2,向worker表中插入信息 二, 按要求进行单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 …...
【c++】vector实现(源码剖析+手画图解)
vector是我接触的第一个容器,好好对待,好好珍惜! 目录 文章目录 前言 二、vector如何实现 二、vector的迭代器(原生指针) 三、vector的数据结构 图解: 四、vector的构造及内存管理 1.push_back() …...
VScode查看python f.write()的文件乱码
VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码, print(),汉字正常显示, 使用 with open()as f: f.write()文件后, 在 …...
excel应用技巧:如何用函数制作简易抽奖动图
利用INDEX函数和随机整数函数RANDBETWEEN配合,在Excel中做一个简单的抽奖器,可以随机抽取姓名或者奖品。有兴趣的伙伴可以做出来试试,撞撞2023年好运气。每次年会大家最期待的就是抽奖环节。为了看看自己今年运气怎么样,会不会获奖…...
CSI Tool 安装及配置记录
一、Ubuntu安装 1.下载Ubuntu 首先安装Ubuntu 14.04 LTS 64位下载地址(页面中第一个链接) 2.制作启动盘(注意备份) 可以使用官方的工具Rufus,下载地址:https://rufus.ie/ 打开Rufus,先备份…...
华为OD机试 - 最低位排序(Python)| 真题+思路+代码
最低位排序 题目 给定一个非空数组(列表),起元素数据类型为整型, 请按照数组元素十进制最低位从小到大进行排序, 十进制最低位相同的元素,相对位置保持不变, 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位。 输入 给定一个非空数组(列表) 其…...
C#开发的OpenRA使用TrimExcess方法
C#开发的OpenRA使用TrimExcess方法 当你在细看OpenRA的代码,就会发现在下面这段代码添加了一个方法: foreach (var nodes in levels) nodes.TrimExcess(); 在上面代码里遍历整个节点列表,把所有节点都调用TrimExcess方法处理一下, 这样做的意义何在?为什么我们在一般的代码…...
ImageMagick任意文件读取漏洞(CVE-2022-44268)
0x00 前提 前几天爆出一个 ImageMagick 漏洞 ,可以造成一个任意文件读取的危害比较可观,最近有时间来复现学习一下 主要是影响的范围很大,很多地方都有这个问题,需要来学习一下 0x01 介绍 ImageMagick 是一个免费的开源软件套…...
第十九篇 ResNet——论文翻译
文章目录 摘要1 引言2 相关工作3 深度残差学习3.1 残差学习3.2 快捷恒等映射3.3 网络架构3.4 实现4 实验4.1 ImageNet 分类4.2 CIFAR-10 和分析4.3 PASCAL 和 MS COCO 上的物体检测🐇🐇🐇🐇🐇🐇 🐇 欢迎阅读 【AI浩】 的博客🐇 👍 阅读完毕,可以动动小手赞一…...
招聘网官网/优化排名推广关键词
Swift之父Chris Lattner,也是LLVM之父,从2014年公布Swift后,版本一直不大稳定,在Swift3.0以后语法逐渐稳定,开发者对此比较青睐 Chris Lattner从苹果离职到了特斯拉,自己感觉不适合自己,结果又辗…...
免费网站建站/广西百度seo
孩子为什么要学编程?少儿编程有什么好处吗?人工智能时代,让孩子先人一步看见未来AI时代来临,很多工作将被人工智能取代,未来的人才必须具备学习与创新能力,而编程能让孩子站在这个时代的最前沿,…...
自学网站建设基本流程/廊坊seo推广公司
Vlookup函数,可以算是一个数据专员必须要会使用的基本函数了,确实很好用。但是你可能会注意到,Excel一旦数据量过大,打开都费劲了,何况打开后,你还要输入公式计算,就更费劲了,此时你…...
工商注册电话人工客服/seo优化的主要任务
1. 下载安装Android Studio https://developer.android.google.cn/ 2. 创建项目 API 24表示最低适配到7.0系统 3. 添加模拟器 点击右侧设备管理,创建设备。先选机型,再选系统版本API24。 下载安装完成后,设备管理区多了一台设备。 4. 运行…...
网站建设7个基本流程/淘宝搜索指数
综述:文本分析在市场营销研究中的应用文本大数据分析在经济学和金融学中的应用:一个文献综述倒计时4天|Python&Stata数据分析课寒假工作坊大数据时代到来,网络数据正成为潜在宝藏,大量商业信息、社会信息以文本等非结构化、异…...
大家做公司网站 都是在哪里做的/开发网站的流程是
【收到一封有深度来信,在原信中直接加入我的评论作为回复。】 最近又遇到了新问题,犹豫了多次才发邮件。犹豫的原因是没有自信,不知道其他人会不会有这个问题。 首先是我最近的思考: 1.看程序的时候可以本地跑起来debug看&…...