小白网-奉贤部落-奉贤免费信息发布平台

查看: 66|回复: 0

软件开辟架构形式浅谈软件设想架构形式分析(软件架构形式描写了若何)

[复制链接]

2万

主题

0

回帖

8万

积分

论坛元老

Rank: 8Rank: 8

积分
88256
发表于 2025-7-26 12:48 | 显示全部楼层 |阅读模式
一 布景和题目我小我平常会比力慎用“架构”这个词
一方面是感觉业界有很多架构大师和架构形式,而我的认知和理论有限;另一方面是由于这个词看着挺高峻上、有点务虚,假如不连系现实场景的具体题目来会商,轻易堕入“PHP是最好的说话”这样的辩说赛中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。而分歧场景中又有各自的题目,法式员们经过自己的了解和思考、针对现实场景对一些架构形式停止了扩大理论,以此来处理碰到的题目,也会基于同一个形式延长出一些派生概念他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。兵无常势,水无常形他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。所以,我小我的概念是:以要处理的题目为动身点,去会商我们要采用的架构形式(技术计划)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
别的,由于我们是站在很多伟人肩膀上的,会商时可以站在一些如SOLID等软件设想/开辟原则的根本上他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
写这篇文章,我也是从处理一些题目标目标动身的:
比来和团队同学会商了相关话题,虽然大大都同学在理论上根基分歧,但具体到话术、名词概念和具体利用的了解和理论上有些差别(这是很一般的,由于业界对同一个形式的了解和理论也分歧)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。我连系一些现实编码场景做了一番陈说,为了避免后续反复大费口舌,所以筹算写下来,今后有需要间接发文章链接他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。由于我小我的认知和理论有限,所以也希望能抛(huan)砖(ying)引(lai)玉(pen),让我学到更多他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。虽然同一个架构形式在分歧营业/技术范畴的实施会有区分,但同一个团队内应当连结分歧性,由于这样有助于平常的code review、功用模块的交接backup等活动,特别是有益于利用同一的单测扶植计划来保障我们的产物资量他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。现实题目:我比来在开辟商家合并发货的功用,但由于之前根本发货功用的界面和逻辑并不是我开辟的,所以我在点窜原有代码、支持有很是多细节逻辑的合并发货才能时,就在担忧对原有发(zhong)货(yao)才能的影响他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。而这时辰,倘使有单测的保障,我便可以更安心地停止功用升级革新了 —— 别说更复杂的合并发货才能了,而这类诉求在复杂的买卖场景里很普遍他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]提炼一下我碰到的具体题目:
在由分歧开辟职员延续迭代、停止功用升级的软件开辟活动中,若何保障具有复杂逻辑的商家经营工具的产物资量他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
软件开辟活动是全部流程的焦点环节:接收产物和视觉设想需求/变更作为输入,然后输出客户可用的终端产物他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
而同一的软件开辟架构形式,则是我们保障软件开辟质量的根本他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。(这里就不具体展开WHY了)
由于会商的是具体面向客户利用的营业场景,少不了客户操纵交互的视图层(View),所以我从MVC起头谈起他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
二 从表示层的MVC谈起虽然我平常比力慎用“架构”这个词,但我平常喜好随手拍一些修建物他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。由于修建之美,会让我联想到软件的架构也应当有美感,究竟Software Architecture这个概念也是起源于Architecture他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
这时辰,架构这个词就会给我一种接地气的感受:有几多块砖,每块砖做什么用、放到那里去,这块砖 和 那块砖怎样黏在一路或相互支持他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。固然,由于软件的可移植性、可复用性,从某些角度来说,软件架构相比修建架构有其更复杂的地方他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
MVC诞生至今已经跨越40年了(Since 1979),10多年前就获得过很普遍的会商和理论,穿越时空到明天必定有其反懦弱性和内在焦点代价他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。虽然现在乍看起来似乎已经过气、被会商过千百遍了,但仍然有很多法式员会有分歧了解和看法,或多或少他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这是很一般的,上面也提到了部分缘由,这里具体再展开下他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
1 MVC在典范三层架构里的位置
MVC是一种通用架构形式
早期PC时代利用在桌面客户端,后来在Web时代变得风行(我之前写PHP也用过相关MVC框架),现在在移动互联网时代也获得普遍利用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。上面这三个场景的利用,都是面向客户的,需要交互表示的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
从MVC命名中的View(视图)也可以看出,MVC形式利用在软件系统架构里的表示层他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
在业界某著名公司的官方文档里,也明白把MVC放在Web Presentation Patterns下他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
我之所以没有在上图中对M-V-C增加箭头线条,是由于在这一点上,分歧法式员也有分歧了解和理论他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
这是第一个需要明白的点:MVC架构形式在多层系统架构里的利用范围他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
左侧 营业表示层-营业办事层-根本办事层 是移动端三层架构形式,未触及到 C/S 交互;右侧是Web B/S场景的三层架构形式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
由于有些利用会比力简单,底子不需要营业办事或根本办事层,纯洁靠一个MVC(大概VC)就能交支出一个Mobile/Web App;
而且在一些营业系统里,Web前端/桌面客户端/移动App 也能够会被简化为 大前端/大终端表示层;
所以能够基于分歧信息,分歧法式员对此会有分歧认知他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
但随着用户终端利用的重要性和复杂度的提升,已经从简单利用成长到复杂多团队协同的平台型或航母级利用,仅靠一个MVC来完成托付是分歧适的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
我们也可以反过来想,法式员会把以下代码放在客户端代码的哪一层:
对Web引擎的扩大逻辑他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。通讯协议的结构界说,以及响应的socket毗连和通讯代码他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。一个营业相关且UI无关的平台开放才能他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。Crash捕捉、卡顿监控、日志埋点等功用实现,比如Android在做APM相关工作时会采用AOP方式,操纵ASM、AspectJ等计划来做字节码插桩他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。……2 业界基于MVC形式的分歧理论
前面提到分歧法式员对MVC形式的了解和理论存在差别
业界大厂亦然,以下会连系业界一些著名且有影响力的公司在MVC形式上的理论,做进一步的展开会商他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
著名公司A
著名公司A在指导开辟者利用MVC时,保举下图方式:
可以看出在他们的理论上:
Controller可以援用View和Model他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。View可以援用Model他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这里的Model偏向因而Passive他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]同时,他们倡议:
在强范例视图场景,控制器从模子建立并添补ViewModel实例,该ViewModel 实例包括要在该视图上显现的数据他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。当控制器由于义务过量而变得过于复杂时,也就是业界戏称的“MVC means Massive View Controller”,需要将营业逻辑从控制器移出并推入域模子中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。著名公司B
说到Massive View Controller,著名公司B在移动互联网方兴日盛的时辰,保举下图所示的MVC理论计划:
上图显现出:
Controller援用View和Model他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。Model经过一些松耦合方式来触达Controller,如广播告诉、callback等,驱动Controller做出响应他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。View经过代理形式等计划弱依靠Controller,由Controller对各类用户操纵、UI衬着诉求做出响应他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。而View和Model之间是隔离的,Model变化后对View的更新操纵全数由Controller负责他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]不外响应的官方文档已经被声明是过期文档了,并备注纷歧定是今朝的最好理论他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
是的,随着移动互联网兴旺成长,十年前的“最好理论”被一路多种应战 —— 在采用这类计划的开辟范畴中,若何重构Massive View Controller为Lighter View Controller已经成为了一个专题他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
对照和思考
A和B的异同点
不异点:Model包括 所需的数据结构封装,以及响应数据操纵的方式界说他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。即Data + 当地或远真个CURD他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。差别点:在著名公司A给的图中,View可以援用Model,而在著名公司B给的图中则不可他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。一些题目和思考
View有箭头指向Model,这里的援用关系是指什么?是View持有Model.Data数据工具,还是View挪用Model.CURD方式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。Controller的本意是Controing Logic,那除了ViewController外,能否还可以有别的的XxController,比如DataSourceController、NotificationController?从命名上看,既然ViewController 既有View 又有Controller,那为什么把它放在 C里面,而不放在V里面呢?比如当我们在iOS/Android开辟中引入MVVM形式后,ViewController或Activity属于M-VM-V的哪部分呢,代码放在哪个目录下呢?我有类名利用ViewModel后缀就代表我利用MVVM形式了吗?Martin Fowler
作为
《重构 : 改良既有代码的设想》、《企业利用架构形式》等著作的作者;灵敏软件开辟宣言创作者之一;MVVM形式诞生时参考援用的技术专家他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]Martin Fowler给的MVC形式图以下:
和上面著名公司A和B的图,又纷歧样了,不外他这里也是以为View可以援用Model的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
MVC和DDD
Martin Fowler和《范畴驱动设想》作者Eric Evans也会商过MVC中Model的设想理念:
贫血模子:将Model分为简(pin)单(xue)的Model数据工具,和处置操纵数据工具的Service/Manager/BizLogic等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。示例:为aPerson点窜name,则由 CitizenService.changeNameOfPerson( aPerson ) 这类方式来实现他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。充血模子:将对应范畴的处置逻辑放到范畴模子中,使得这个范畴模子更饱(chong)满(xue)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。示例:aPerson要刷牙,则由 aPerson.brushTeeth() 来实现他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。补充:充血模子更有面向工具编程的味道,特别是搭配买卖范畴等营业场景,更有体感他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。不外稍微细想一下,能够就会发现DDD对设想的要求会更高,从而对研发周期和质量保障提出了新的要求,而且能够引发对现有系统的大范围重构他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。(盒马的DDD理论)也就是说,大到MVC各个模块的依靠援用关系,细到Model中的代码设想方式,业界都有分歧的理念和理论他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
Java Web开辟范畴也对Model的设想发生过很是剧烈的会商他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
小结
先抛开具体模块的代码设想计划,基于以上几种业界大厂或专家的描写,我小结了以下这张图并标注了待解题目:
题目一:若何处理MVC中Controller的收缩臃肿题目?
要回答若何处理,需要先思考为什么收缩他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
题目二:View能否援用Model?
要回答能否援用,需要先界说援用关系是什么他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。是持有工具,还是挪用CURD接口操纵工具他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。又大概这两者没有需要区分,由于持有的工具自己便能够带CURD接口他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。参考上面相关材料,今朝业界有的支持、有的否决他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。题目三:存在View -> Model,那末能否可以反过来存在 Model -> View?
和题目二在描写上相反但又有关联,假如对题目再进一步提问的话:
利用 -> 援用关系,是为领会决什么题目?利用 -> 援用关系,会发生什么题目?如同文章开首所说,以上题目需要连系具体场景来展开(见 现实案例连系),只管从务虚到务实他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
3 Redux-like Architecture and framework
随着前后端分手得更完全,终端装备性能和用户体验重要性的提升,前端范畴也获得了兴旺成长,开辟方式也有了比力大的变化,MVC-like方式不再是支流:
UI开辟方面从早期的号令式到现在的声明式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。整体利用和营业逻辑实现方面,从早期的OOP写法,转向基于FP的响应式编程他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。比如Redux的数据流、React的Hook特征等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。各类框架兴旺成长,一些概念和形式的提出、理论利用方面,我小我以为是领先并影响客户真个他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。其中Redux是一个典范案例,而且我感觉Redux官方也挺开放包容的,比如Dan Abramov写的《You Might Not Need Redux》他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。和MVC延长派生出的MVC Family一样,Redux提出或重新带火了数据流、状态治理等概念,起头影响别的平台范畴,并诞生了一些框架他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
比如ReSwift、swift-composable-architecture,以及SwiftUI里的State and Data Flow他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
虽然我也写过点React,但并没有怎样理论过Redux他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
不外这些变化和影响,是我们在处理题目标进程中需要连系斟酌的他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
三 现实案例连系1 常见的数据结构界说和利用
法式 = 数据结构 + 算法他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
—— Nicklaus Wirth,Pascal之父,图灵奖获得者
这句话乍看起来能够会有点面向进程设想的感受,但OOP中的工具实在也是由数据+方式组成,而FP则更不用说了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
在编码开辟活动中,会存在以上3种数据结构界说和利用方式:
原生数据结构,比如list/array、map/dictionary、tuple等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。类似MyContact的数据结构界说,由办事端返回的数据停止转化,并能够按照营业逻辑按需加上一些标志位给Controller消耗他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。类似ContactViewModel这样的纯洁为视图View办事的数据结构界说他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]补充:
(1)MyContact 和 ContactViewModel 只是特地域分的命名,现实上 MyContact 也可以是纯洁为视图View办事的数据结构界说他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
(2)可是,合适的命名有助于帮助我们思考和编码,从表达上显现出我们的偏向和重点他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
"There are only two hard things in Computer Science: cache invalidation and naming things."
—— Phil Karlton
2 常见的多复杂卡片的列表场景
这个场景可以部分回答题目一:为什么Controller会收缩,以及若何处理他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
别的部分答案则落在复杂页面场景的多delegate、target-action、notification-observer等视图交互响应的处置逻辑上他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
我以为,之前否决View援用Model,就是致使MVC酿成Massive View-Controller的一个缘由他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
另一个缘由我以为是工具链只供给了ViewController这样的Controller模板,隐式教导开辟者都在这里写代码他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
这也能够是由于十几年前移动互联网还没成长起来,移动App的复杂度低,所以供给了在那时简单够用的计划他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
当只能由Controller 持有-> Model的时辰,那末在多复杂卡片的列表场景中,必须由Controller来更新每个View的属性/状态他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
MyViewController需要为ContactCell更新它的各类相关属性,类似的还有AddressCell、PackageCell等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MyViewController在更新AddressCell展现前,能够还需要先为它计较出合适的富文本展现内容他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MyViewController需要响应分歧Cell的点击交互行为,包括但不限于按钮点击、输入框变化、富文本跳转、键盘升降等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MyViewController需要响应CollectionView/TableView的DataSource/Delegate各类方式实现他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MyViewController需要响应Model层的变更告诉,大概是别的一个ViewController抛过来的广播告诉他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。……[/ol]然后MyViewController就爆炸了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
针对这类场景,我的解法是:
1.经过让View->Model,基于工场形式,把组件化Cell基于数据更新的结构逻辑交给View负责,如contactCell.configUIWithModel( contactModel )他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这样有点类似上面DDD提到的充血Model,具有高内聚的特点,带来益处:
a.和减轻控制器负担、推入域模子类似,经过把数据驱动结构的代码推入组件域内,减轻了MyViewController的负担他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
b.利于做这部分组件化Cell的UI测试他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
c.利于这些组件化视图复用到别的场景,比如买卖治理场景的定单卡片可以复用到搜索场景中,不用在SeachViewController里复制粘贴一大堆代码,只需要从Model取一个数据工具丢给组件化Cell即可他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
2.基于ViewController,拆分出分歧职责的扩大,比如MyViewController+Delegate专门复杂响应代理事务处置他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
3.界说出别的范例的Controller,比如MyDataSourceController,专门为TableView供给数据源,可以类比参考Android中ListView的Adapter+ViewHolder他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
工场形式下,产物的刷漆、烘干、印花等操纵会在内部完成,不会丢一个模子让客户去自己贴logo他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MVC的每一部分都可以用分歧的设想形式来组合实施,实现解耦或静态灵活的方针他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
对应下图:
到这里已经回答了前面的题目一和题目二他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
更多解法可以参考上面提到的相关倡议,比如lighter view controllers
这里采用了 VIew -> Model 的计划,用来介入处理Massive View-Controller的题目,而且让View更轻易复用和做UI测试,带来了益处他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
可以连系前面提到的
“当控制器由于义务过量而变得过于复杂时,需要将营业逻辑从控制器移出并推入域模子中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。”
再进一步会商下他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
我的了解和举例:
存在一个输入框,让用户提交物流单号他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。用户在输入进程大概完成输入后,由View经过delegate形式路由给Controller做校验,而Controller能够还要进一步依靠Model去做更完整的校验(如收集请求到办事端,由于物流单号的法则很多而且能够静态更新)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。当Controller义务过量、代码收缩、过于复杂时,就将物流单号这块营业逻辑推入 物流(单号)域模子中,即由View间接经过delegate形式交给 LogisticsModel来做校验他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。也是 View -> Model 他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]纷歧定对,抛(huan)砖(ying)引(lai)玉(pen)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
那末,存在VIew -> Model,有什么害处吗?
3 一个Kotlin跨平台场景案例
这里不具体展开讲Kotlin及其跨平台相关内容,只是描写从MVC形式做跨平台迁移时碰到的题目他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
这里的ViewController/Activity放在那里,也和上面的一个题目相照应他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
虽然D-KMP主张经过全新构建工程写代码的方式来理论,但从现真相况动身,绝大大都现有系统城市是以单点尝试、渐进式的方式来落地,或成长、或回撤他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
那末,如上图所示:
假如在既有MVC代码结构中,View -> Model,在这类渐进式迁移场景下,就需要点窜View来适配新的ViewModel他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。假如 View 不援用 Model,则是由 Controller来做胶水层设备更新视图(号令式UI)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。后者的益处是,连结View的自力性,只需要点窜这个营业场景对应的单个Controller即可他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。由于View具有可复用性,能够在别的还没预备迁移/改变的模块里也有益用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。[/ol]所以,此处不倡议 View -> Model他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。那末,谁对呢?
4 谁对谁错的务虚会商
当有法式员要保举利用别的架构形式的时辰,凡是开首的一句话就是先说MVC形式的题目他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
比如ReSwift在写 Why ReSwift? 时,开首第一句话就是:Model-View-Controller (MVC) is not a holistic application architecture.
我小我以为
架构是一个名词(n.)+动词(v.)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。架构(n. & v.)是为了帮助 开辟者在交换时有分歧的了解、在营业需要时可以便于扩大、在出题目时可以快速定位等等(匹敌熵增)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。具体还是看采用这个架构的得失,要处理什么题目或带来什么益处,然后带来什么本钱或支出什么价格他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。架构(v.)经过度派每部分代码的职责并为他们取名(比如iOS/Android开辟工程师这样的岗位称号,让他人一看就晓得是做什么的),然后几个名字加在一路 构成了架构形式这个笼统概念他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。从具体到笼统,然后再由这个笼统概念去指导法式员理论写代码,促进了架构的传布,比如MVC、MVP、MVVM、MVVM-C、MVI、MV-Whatever,VIPER,Redux and More……偶然辰并纷歧定是架构形式的错,还有能够是平台/框架在让架构形式自传布时采用的具体计划出了点题目,又大概是开辟者自己写代码的题目他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。偶然辰架构形式之间也不是互斥的,也可以在分歧场景下互补他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。比如在MVC里,每个营业表示模块纷歧定要有三个元素齐聚,甚至也可以 VC-M-VC 共用一个M(可参考斯坦福iOS开辟课程内容)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。有一个现实的营业场景是这么理论的:
MVC和MVVM在一个营业场景里相连系他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
这里提到了MVVM,前面的Kotlin跨平台图,除了触及到 View -> Model 的援用关系能否应当存在的会商,也触及到了Declarative-UI和MVVM架构形式等概念,再顺便展开下他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
1)MVVM 和 MVW
MVC、MVP 和 Declarative-UI 这三个名词概念都有几十年历史了,其中声明式UI在近十年又起头火了起来;而MVVM则有十几年历史他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
官方对MVVM有这么一些描写:
V和VM是一对多的关系,即View 1:n ViewModel他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。相比于 MVC里 Controller 1:n View,明显MVC的C更轻易收缩,所以上面也提到了利用多Controller计划他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。V援用VM,VM操纵M,而VM不需要援用V(和MVP分歧)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。VM作为V的高低文,包括V所需用来展现的数据,响应V被用户触发的事务他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。V对M无感知,反过来 M 对 V和VM 也无感知他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。整体是疏松解耦的形式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。当VM的属性值发生变化时,经过数据绑定方式转达给V他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这就需要有机制支持,有对应的机制MVC也能做数据绑定他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。基于上述描写我画了下图:
整体来说,MVVM是基于事务驱动的、以数据绑定机制为支持的疏松解耦架构形式他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
它的条件是有系统/平台/框架的机制支持,否则实现本钱和复杂度有点大他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。相比MVC,它的上风是视图控制逻辑不太会收缩,代码单元更轻易被测试,在可读性、可保护性上更好他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。它能够带来的本钱/题目是入门上手较难,简单场景下利用轻易过度设想,复杂场景下出题目调试比力麻烦他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。斟酌到ViewController在该场景的薄胶水特质,以及也介入视图展现和用户响应,所以我把它放在V里他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
由于业界有太多MV-开首的形式名词了,所以Angular官方间接声了然一个MVW:
I hereby declare AngularJS to be MVW framework - Model-View-Whatever. Where Whatever stands for "whatever works for you".
这类声明有个益处,就是免除了谁对谁错/谁好谁坏的争论,而重点关注于谁合适他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
5 谁对谁错的务实案例:VIPER和分层演变
关于谁对谁错/谁好谁坏,可以再来看一个案例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
VIPER架构形式的利用
VIPER概念由View、Interactor、Presenter、Entity、Router几个元素组成,大致以下:
我之前写过MVC、MVP、MVVM、VIPER等架构形式下的代码,完全实现或不完全实现他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
有一次,我在某个营业表示模块里利用VIPER,然后界说了一个XxxNetworkInteractor类,用来负责做收集请求他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
VIPER架构形式的演变
后来随着营业场景的变化,一个营业模块能够需要对接多套网关办事,XxxNetworkInteractor就要做笼统隔离,消除营业逻辑对多套网关请求的感知,而且利用到别的营业模块他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。这就有点像 VPER - I - VPER 形式 —— 多个营业模块对 Interactor 停止了复用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
进化
随着对接网关数的增加、网关才能的增强,XxxNetworkInteractor也配套扶植了更多才能他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。随着利用XxxNetworkInteractor的模块越来越多,分歧营业的一些通用诉求和处置逻辑也随之增加他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。随着XxxNetworkInteractor的功用越来越强大,代码越来越多,逐步需要抽离出一个零丁模块,非论是从进步编译速度,还是从封装表露等角度他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。因而,XxxNetworkSDK.framework诞生了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
退化
再后来,随着技术和营业的变化,底层网关办事ATop成为了范畴范围内的究竟标准,之前碰到的题目也消失了,而XxxNetworkSDK又带来一些本钱,比如要配套ATop的才能升级停止迭代保护他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
此时,XxxNetworkSDK可以退出历史舞台了,让营业模块间接面向ATop编程,这样既下降了保护本钱,又带来了一定的包巨细收益他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
今后,倘使有别的一个范畴范围的营业场景(采用了XTop),要复用最上层的营业模块,由于在别的一个范畴范围,营业模块要从 挪用ATop 改成挪用XTop他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
那末,接手或负责迁移复用的开辟者,会不会在想:为什么这些营业模块间接挪用ATop,而没有益用一个XxxNetworkInteractor来做分层隔离呢?让营业不要感知具体的数据库或收集办究竟现他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
倘使有,他只要做一件工作:让XxxNetworkInteractor对接XTop即可他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。假如没有,他需要去替换点窜每个营业模块的挪用代码、返回值处置等等他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。四 写在最初,回到题目非论是务虚的会商,还是务实的案例,大概是Angular的“whatever works for you”的概念,结论是没有谁对谁错、谁好谁坏,只要现实场景下要处理的焦点题目他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
兵无常势,水无常形他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。那末,回到想要处理的题目:
在由分歧开辟职员延续迭代、停止功用升级的软件开辟活动中,若何保障具有复杂逻辑的商家经营工具的产物资量他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
我的想法是以可测性作为手段,来保障功用升级革新或代码重构后,可在公道时候范围内获得充实回归验收,保障相关组件、模块或整体产物的质量他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
具体的计划实施上,由因而以可测性为重要关注点,再连系今朝的技术偏向,我会偏向于采用MVVM他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
MVVM的架构形式在了解和认知上比力成熟(应当是移动端开辟范畴TOP2风行的),便于实施和传布,并经过形式的称号来表现要夸大的关注点:可测性他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MVVM可以更好地连系SwiftUI+Combine、Kotlin跨平台等技术偏向他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。MVVM完全版的上手门坎和简单场景的过度设想题目,可以经过采用不完全版MVVM来处理他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。不完全版的MVVM可以cover适用于简单场景的MVC,近似于 超集-子集 关系他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。虽然也可以经过量Controller的方式来处理MVC收缩题目,但MVC的命名在理论中就轻易让法式员弱化掉可测性这个关注点(也能够是我小我了解和理论不够正确)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。复杂场景的调试题目、更多可测性的理论,需要再试探下,也希望获得相关分享和指导他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。作者 | 思禽
原文链接:https://developer.aliyun.com/article/832823?utm_content=g_1000313179
本文为阿里云原创内容,未经答应不得转载他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白网-奉贤部落-奉贤免费信息发布平台  

GMT+8, 2025-11-12 09:33 , Processed in 0.611193 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表