这些年经历的项目架构

 这些年,参与的项目大大小小应该有六七个。所采用的项目架构,也是从 MVC 到 MVP ,后来使用 ReactNative 进行跨平台开发,再到后来回到原生,使用 MVVM。本节,打算聊一聊我的项目架构的演变之路。

MVC

 M, Model,主要负责进行数据访问,产生数据;C,Controller,主要负责对接 View 和 Model,将 Model 反映到 View 上,或者响应 View 上的动作,修改 Model,处理业务;V,即 View,主要负责 UI 渲染。

MVC组件之间的典型合作

上图来自维基百科。我们可以看到一个典型的 MVC 模式下的数据流向。上图中,View 监听 Model 的数据变化,然后进行 UPDATES 工作,这其中也会有业务逻辑处理。事实上,有些时候我们还需要对 Model 层的数据做进一步处理然后再做前端展示,这也是部分业务逻辑。
所谓架构只是一种设计理念,目的就是在于保持逻辑的清晰,面向改变易扩展,功能易复用。对于 MVC 模式而言,看上去各司其职,请求数据的产生数据;负责逻辑的处理逻辑,负责渲染的进行渲染,清晰明了。
 然而,View 层对 Model 有着很强的依赖。为了能够使得 Model 发生的变化及时反映到到 View 上,View 需要注册成为观察者到 Model 上。鉴于这种关系,View 、 Model 需要互相持有对方的引用。
image

 首先,这种相互持有引用会导致层次的独立性、可重用性要降低一些,而且这种行为也是危险的,暴露更多的能力给 View,可能使得部分本应在 Controller 处理的逻辑放在 View,因为这样做确实更加快捷方便。这样做也会带来一个很严重的问题:View 会客串 Controller 的角色,从而越来越臃肿,解耦能力越来越弱。

MVP

 使用 MVC 没多久,同事建议组长采用 MVP 开发模式,于是,就是这么快的就跳转到了 MVP 的阵营。当时最感兴趣的还是这种架构中突出的对接口的应用,面向接口的编程思想
 面向接口的编程,实际上是 Java 开发一直所倡导的。优势在于解耦,降低依赖关系。但是也会让开发工作更加复杂。

MVP模式

上图同样来自维基百科。相较于 MVC 模式,它切断了 View 层和 Model 层的直连。Model 和 Presenter 之间, Presenter 和 View 之间相互暴露接口,并通过接口相互访问,接口构成了它们通信的通道。与 MVC 类似, Modle 负责数据访问和处理;Presenter 像胶水一样,把 Model 和 View 绑在一起,它主要处理业务逻辑,对 View 提供处理好的数据,对 Model 请求数据;View 处理 UI 渲染。
 后来的开发过程中,很少使用 MVC,当然并不是因为觉得它比 MVP 差。更多的,自己是想增强接口使用的意识,以及对新事物的一种探索欲。现在想想,其实它们更多的是理念上的不同,如果控制的足够好,各有千秋吧。下面我们就来比较一下。

MVC vs MVP

 这两种结构,都体现了良好的解耦理念。将一个需求拆分成数据访问模块、UI渲染模块、业务处理模块,相对独立,分工明确,各谋其政。同时,各个模块之间又可以在一定程度上相互组合,尽可能地进行功能复用。但是,在具体使用上,我觉得还是有一些偏好。
 保证结构的清晰是一件非常重要的事,对此,大多数情况下宁愿牺牲性能。这一点上我认为 MVP 要比 MVC 做的好,职责划分的更加清晰。Activity 只负责渲染,很清爽;当然,这就意味着更多的处理逻辑需要搬到 Presenter 中去;Model 只负责向 Presenter 提供数据支持。为了保证逻辑的清晰,整个过程却会显得复杂,有些地方甚至没必要。View 层明明只是需要改一下 Model 的数据,都需要 Presenter 代劳。显然,这种清晰性牺牲了高效。
 结构上的清晰,职责上分工更加明确,更细,也应该就意味着更好的复用性,更加灵活。但是,同样这也未必总是需要的。如果一个需求交互不多,Presenter 可能就会非常小,又何必将一个文件能够搞定的事一定要分成三个文件去完成?

MVVM

 MVVM 是由 MVP 演化而来的。我觉得它主要解决了 MVP 没有很好解决的两个问题:

  • 对于 MVP 的 Presenter 层,由于要处理所有业务逻辑,又要完成 Model 和 View 的沟通,最终可能也会非常臃肿。
  • 通常情况下,我们总是要通过 findViewById 找到控件,然后进行数据填充,如果一个页面很复杂,需要填充的数据很多,这样在 View 层会显得很不优雅。
     这样,就交给 MVVM 来解决吧。


    MVVMPattern

 上图(来自维基百科)中很好的解决了这两个问题。ViewModel 集合了 Presenter 的能力,同时兼顾了 View 需的数据基础。它将数据直接绑定到 View上,这种绑定是一种双向绑定,即数据的变化会自动导致 UI 的刷新,而 UI 上的动作,同样会自动调用响应的绑定的函数修改数据。
 Android 所提供的 DataBinding 技术很好的体现了这一点。之前翻译过一篇官网上关于 DataBinding 的介绍,感兴趣的可以看一下。现在 View 层可以更加清爽,不用再为了填充数据而找出所有的 View,一个一个填充,而 View 也会由于某个用户动作而自动回调修改数据,这一切都是自动完成的。当然,有利必有弊,这种框架的使用,首先需要我们去了解它的特性;而且自动完成,未必会有我们手动完成效率高,多半会牺牲部分性能。

小结

 架构, 一种理念,一种思想,一个工具。它的目的,旨在帮助我们更好地面对、处理变化;更加清晰地认知我们正在做什么。
 工具是有了,这只是一个基础。更为关键的我觉得还是对这种工具的把控能力。因此,也并非是说你使用了 MVVM , 你的项目应对变化的能力就一定会比 MVC 好。对于需求的理解,将需求进行抽象的能力,以及对于技术扎实的能力,这些都将会对架构的把控提出挑战。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容