您的位置:知识库 » 手机开发

被误解的MVC和被神化的MVVM

作者: 唐巧  来源: InfoQ  发布时间: 2015-11-07 22:22  阅读: 35133 次  推荐: 127   原文链接   [收藏]  

  MVC 的历史

  MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示的是一种常见的客户端软件开发框架。

  MVC 的概念最早出现在二十世纪八十年代的施乐帕克实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式。

  现在,MVC 已经成为主流的客户端编程框架,在 iOS 开发中,系统为我们实现好了公共的视图类:UIView,和控制器类:UIViewController。大多数时候,我们都需要继承这些类来实现我们的程序逻辑,因此,我们几乎逃避不开 MVC 这种设计模式。

  但是,几十年过去了,我们对于 MVC 这种设计模式真的用得好吗?其实不是的,MVC 这种分层方式虽然清楚,但是如果使用不当,很可能让大量代码都集中在 Controller 之中,让 MVC 模式变成了 Massive View Controller 模式。

  Controller 设成了 濙些籟C 1吁其a:e计模C 决 这种设輌构下troller 模弯较了 濙些/p>还记名嫯原移动座谈stroa>时施p; ref="http://qwww.github/cn/agav>[woe/BeeFrameworkrget="_blank">原BeeFramework   ref="http://qwww.github/cn/ahackers-p> ters/samurai-natVierget="_blank">原Samurai-NatVie &nbs置: p; ref="http://q.cnieibo/cn/agav>[woerget="_blank">原集 &nbs濙Mas寸中库IVi「什么样戆容才应该放到troller 之丌让」/p>如架施䭤仴: 20D们没展MVC姆图就槍nbs正<里E谈谈庎 MVC籸濙些乃法/p>

  但滬对䮞看看 这种设輌构徉大夞不殡模式真:e耙,渀种Masp; rc)>Don't repeat ye" selfp;&nbs则玁MVC 该则求够复彍罁都黧尽复刑仝保证重大ont这种设计模式真缌让 对亏w Contel View䚄L合分屎则/p>

  但溎 MVC Cont说是使抽象吗f渪叹䱸 App历及画效烽以:便地移层别 App上VC 而 Github上也有:e UI 宾谱槍豻戶宾蛆䚄ont Cont兜:e台装模彆是吨礩够便地MVC给敮复/p>

  但溎 MVC l View说搨礞不暄W畞玭当务乮库佬庶施䭜有道云笔记 iPad 版乙,我们都阯直/a>e开版MMas有 l View罁都餧on创做些/a>端编繙开叧ePad 版 l View都再nbsMM了夽曠此留当务本身乮库<意义相关VC ViewM多数时倄on䱸产内刑体D让像t Cont样MVC给社区/p>

  但说完w Contel View我个对䮃想troller,是roller 模弜多少以复彍箩都阆完Mas屸 roller 之中后歽以:便地M夨礟其结论几非难M/p>on Ma场种 对亏让以p; rc)>erviubController。p;&nbs喽乐虽Mtroller,是是夨罍M夜还丝非少/p>

  但溜使对䤩够on姜瘯roller 模里阯只应该放豻潓复彍罁都鰱槍豻潁都包括/stro

uon初始化构造相应 Contel Vie/p> li>eadli>监听 l View罺谱将 l View繮库<传递/t Cont/p> li>eadli>监听 Cont罺谱并且将 Cont罺亏/tl View/p> li>ead/u

  但是,几廬都阍:难M籸就此留还有:e辑,廬都齓知道on哪里昺擄䘆到Massroller 之丌輌我个对䮎M瘯看看不,应该on哪里/p>

  Cont籟 Controller。 瘦身1吁其aref="http://qwww.infoobjc.io/rget="_blank">原objc.io &nbs种屸杞有名 开发中ﮢ园<搨上齍齓课p; ref="http://qwww.infoobjc.io/issues/1-)--roller) s/ter.js"-)--roller) s/rget="_blank">原《Ler.js"w Controller 模s》 &nbs囯餮兜:en技巧廬都阅为屸齍盾就tro

u UITServ Cont Data Se" hr 离另外屸希/p> li>eadli>库<获取祽换羑,斈另外屸希/p> li>eadli>装宾轍羑,彆搂离另外屸希/p> li>ead/u以 对亏以将troller 之里过MVC了 ,廊取瘯端新M复式眝或构弬/p>

  但滬寸人 MVC,客抽取 以M为/p>

3 Cont网络请求抽象单程庥希3p>  但滖手都齆直/a>ontroller 之里鸍tAFNetworking ,屸请求VC 请求户库传递给w Con夞n䱺成学知道把豻请求都移傰另外屸静态里/p>如滬觉圗还D仉以庻议屸络请求/a>装/p>

  但滊屸络请求装 象不暄不彺模式真缌薽 Command式。<搨络以MDtro

u络请求与具体齓虺依赖隔离仏便以后更/底睽络表际廬都阅亏 开号端编繜初枟Map; ref="http://q.cnallseemvc-i/cn/aASIHTTPest(); /rget="_blank">原ASIH//qest();  &nbs箩 对亏花Mas天是酜:轻松地M/到Masp; ref="http://qwww.github/cn/aAFNetworkingaAFNetworkingrget="_blank">原AFNetworking&nbs/p> li>eadli>便在希輤共的辑,彆例伌些/a>乮库<本号信擄我在希輤/p> li>eadli>便在希輤缓,彆以及不䱺的辑,/p> li>eadli>便做 象乌久化/p> li>ead/u原YTKNetwork&nbs/p>礜设輀考乌导 夰ssroller 之丌轍罁都瘦身1 而且进n演化加强,M礿诸复杂络请求仏续传仏輀又谱JSON 合法性检查等功/p>

  但这吂潁都齻sroller 之丌剥离后潓简化Massroller 之丌轍羑,彆也达到Mas络罁都复彍效/p>

3 Cont界齍繋装象  但滖手都齆喜欢Controller 之丸䱸个 UILabiewUIButtonUITextField 往p; rc)>self.)-p;  rc)>erviubContp;&nbs法放/p>庻议敮以姍届法把豻潁都齻sroller 之丌剥离/p>

  但滏法䰱t构造n繜彻底优雅乐虽盠潓过稍微麻烦䱺漌几嘯继把豻戶宾轍罺回调接彆再䯸䱸暴露回 roller。大

  但滏法姍屸静态 etil UIV帮助 ewCont历幋装工作/p>设輐虽稍微当D底是如漯较简单/p>

  但溎 MVC䱺复彍 UI 宾谱滬庻议式法/p>使目管程较复杂 对议式法/p>使目管稤紧歽外相关管琍罁都黣砹D歽以尝试法/p>

3 Cont构造w Conl Vie3p>  但证说t这环䓍帍t Conl Vie 箩 优廬都齓样M以借鉴夞体法那将 Conroller。 给w Con 传递库<籸过程 象构造w Conl Vie成程/p>

  但这样象后 Conta>w Conl VieVC 而 roller 之只继传递w Conl Vie籹行都/p>而外构造w Conl Vie成程们都阯以动傰另外庥希了

  但溌M体践让 庻议敮原斋<厂。<&nbs/p>外也以

3 Cont  但刚刚说到t Conl Vie构造以奖屸 ices(); /p>此相应䮩 库

 但滮库<取放onu M䱺廮库<加缓 li>eadli>库<移相关羑, li>ead/u这样酽以便地M/存弌M例佻ssqlitr /到 key-value M引擎等/p>

3 Cont结3p>  但通过M都抽取 对亏以将铜 l秡模式真缌薽 Conroller。 进n拆构造圽络请求/p Conl Vie/pices(); /pStorag; 等不UIV仝配合 roller 之工作从而使troller 模弛加简单VC 的程 App弛容易维护

  但溏外䓍知道敮注意到彆不troller 之弣丝难试MVC 使对䤩够ssroller 之瘦身1 酽以/便地M Unit T); w试各蘸界齍繗关羑,大帧动仇动化试,囆䯸D是如枰ssroller 之罁都黊取瘯患有助对亁测试工作/p>

  但溸望文帮助敮仏s正确不 的历叧势 iOS节里滬庰享屸庎 秜/p>

h1 但化的MVVM

  MVCref="http://qwww.en.wikipedia.org/wiki/l Vie_ Con_ Conl Vierget="_blank">原  现圛 MVC 这罍珲 种屸当新缌构a> 出MVC 2005 厢微,M WPFteSilverter.j 缌构师 John Gossman 提并且应夜微,M开发框渌/p>施 已经成䎢提Mass20 多年我亏讧者在位珣的差别多大/p>

  MVC a> iOS不庶渌谱通皿会利序向绑定是tl View化 Conl Vie会动/VC 而 Conl Vie化 Con 也䠚动变化/p>以 a> 真络戙,又匧作tref="http://qwww.en.wikipedia.org/wiki/l Vie_ Con_ Conl Vierget="_blank">原l)--)--bind

  但搞体OS 开希谱昽以不 KVO 或 Notifion/rss 达到设輕/p>

  MVC a> 猖的M吁其aOS不弌让 序䤚敮 MVC a> 以及 a> 衍罍缶,在p; ref="http://qwww.github/cn/aReactVieCocoaaReactVieCocoarget="_blank">原ReactVieCocoaroa>常 设 罁何批/p>

  但滬感觉原因首tla> i没有:e逻普及昚敮 MVC般䯸ﺆ进而輕妄加论/p>外ReactVieCocoa 本身手M杂性也让:e计感觉到设輯:高深难懂进而加重党敮 罍

  MVC a> 作庒濙些>

  MVC,a> iOS际不弌让 确够tl View Cont解耦是如果使用继掰我 a> 薽亏向绑定MIV渪叹通礰继掼入多复杂缶,实现我了

  但溯我a> 作者 John Gossman p; ref="http://q.cnb.com/msdn/cn/ab/johngossman/archVie/2006/03/ >543695.aspxrget="_blank">原批 &nbs该繜流肯/p>John Gossman 批籸漜两就tro

  现圬齓就t库<定tBug :难觰试/p>看和鼼缌我仜让嚄w Con罁都黜tBug也让嚄 l Vie戽都黜濙些/p>库<定寸䱸:  但本齺就t MVCe羮管箩 库<定继花费多戆存/p>

  但滟意义来说滬(那仮库<定ta> i复杂暾彺/p>如氱槍豸缺同也被:e计樭(/p>

  MVC ReactVieCocoaro其a函噽框木Fion() {al Programming响应框木React Programming也架前:火彸(最潆搨程庻合以:便地M我仮库 iOS 开框漌让 ReactVieCocoa 横空我亨罍翵最曆丝 /VC 包括/stro

u噽框木Fion() {al ProgrammingVC 函也了 M等垬民我亏以 象戊彆例亶斈>传递当作返回值等/p>看看 Swift 语溸罍众多函噽框徉性掯䯠知道疤srooew/p> li>eadli>应框木React Programming掇铝对亟Ma谱EventM虽盆䘼我䚨,M枟Ma输入OS ReactVieCocoa 里eSig{alM虽/p>入以通过函噽框进行各 Combine 或 Finate掯嚄各灵活M/p> li>eadli>状态Stateless状态枇庍羭鬼滗状态吇宩嚛<测试/p> li>eadli>]修就ImmutServ滮库<䚄ﯸ]修弌MVC 延开,宮单VC 也以<测试/p> li>ead/u斈看乙,我们集丸,我

  MVC 对人该观类ta> i ReactVieCocoaro其a如是,几廬突楃 庥象继屸 Conl Vie而已 庮称以单地M屸 Conl VieM<厂U或 ices(); U酽以我主浻么掼入籹时,在仜 l罄用廜叹羿些其

  现圛到,MVC ReactVieCocoa iOS外䚄on小众领域仲有M代a>主流的客樋框架,/p>ont开语 iOS别语漌让 例 Java 薽 RxJava 也有主流的/p>

  但滬弜里䓍仃说tReactVieCocoa f根仃说ta> 䌍f而仃让敮䤩够发昮观认/p>ReactVieCocoa iela> 䌍该化的M搨绀种常藻使䓍嘯驾驭tReactVieCocoa搐䠚造sroller 之丁都黿MVC复杂 都黑,维护濙些/p>

  MVC 为ro其a叺总追赶着滜什么新管三七世纪立阯刑为绞M坑

  但溏叺潆滀担心新罍风险䓍意学习/p>纓眨,M仺M RC 手娡引/p>

  但们想说VC 的禁继保持一种弈变化M以及性,态/p>on新鼉䓍盲从根守旧䓀实骆策人该立M,䞟上VC 这样应变化/p>

>

class="nav"diggnum""Artiidgg_cou 127an> >

class="contburyit" onclick="votecleCnt"(ent_pagId,'Bury')

class="nav"burynum""Artibury_cou 6an> >

class="contr">

clasArtiidgg_tips"ss="nav"digg-tips"sp;&nbsv> v> vclasArti elTag

class="conttag 宭tref="http/js/gmvclass="curreata">[收mvc » [收mvvm

vclass="currprevnextblock""ArtiPreNextcleClceId
vclasArticles/re_A4"> vclass="curradebott园
googggggletag.cmd.push(function() { googletag.display('div-gpt-ad-1471356552253-1');4}); pt> v>
v>
v>