热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MVVM用了都说好

纯属娱乐,就是看着怪好玩这篇文章主要是对工作两年来用过的架构发表一下自己感触,如果说的不对请轻喷.关于架构      根据百科中的软件架构,架构描述的对象是直接构成系统的抽象组件,

《MVVM 用了都说好》 纯属娱乐,就是看着怪好玩

这篇文章主要是对工作两年来用过的架构发表一下自己感触,如果说的不对请轻喷.

关于架构

      根据百科中的软件架构,架构描述的对象是直接构成系统的抽象组件,各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象….Android架构目前有许多不同的模式,如MVP, FLUX, MVI, MVVM等.我们当然知道,还用在这bb!!!
    挖干的说,决定和实现一个特定的代码体系结构或设计模式都是为了解决我们开发人员时常面对的问题。

一些问题

      说到问题我可能有很多要吐槽的了,刚爬进Android这个坑,因为Android本身被写为MVC,所以用的就是MVC模式,那时候只是简单的写一些简单的功能,一个activity处理所有工作,显示View,网络请求,但是毕竟功能简单,一个activity也不会超过百行,所以不会考虑什么耦合,性能问题.对于简单的应用来说,这可能是足够的,但是随着复杂性的增加,问题的数量和水平也会上升。
      正式投入Android开发岗位,因为项目前期由一个人完成,所以写的很随意(你懂得),一些业务逻辑稍微复杂的activity或者Fragment超过3000行代码是很正常的,看的时候都不知道从哪开始,每次想要修改点功能都要耗费大量时间看代码逻辑…如果继续这样代码堆砌最后肯定得崩,所以决定采用大家都在口口相传的MVP模式来进行解耦合.当时对于MVP不是很熟,然后一开始的写法是把回调接口写到一个单独的接口中,一个activity对应一个iview,像这种

《MVVM 用了都说好》 但是后来业务逻辑增加处理的功能也变多,iview中的接口增加,每改动一次就需要把实现了这个iview的activity全部都改一遍,可谓是牵一发而动全身,说好的开闭原则呢?说好的单一职责呢?后来痛定思痛,觉得肯定是自己的姿势有问题,参考GitHub上的几个项目,改成用contract契约类来作为盛放IView和Presenter的容器,
《MVVM 用了都说好》 这样一个activity或者Fragment就对应一个contract,然后xxPresenter实现contract中presenter方法,

public class xxPresenter implements xxContract.Presenter {

activity或者Fragment实现contract中的view的方法,

public class xxFragment implements xxContract.View {

这样确实做到了view和逻辑的解耦.
      愉快的开发了一段时间后,发现每当我有两个功能相近的页面,而且还要同样的一个请求方法,于是想复用一个contract中的presenter中方法,然后就会造成在某个页面的中会有多余的空方法,而且还不能删除,

《MVVM 用了都说好》 真是感觉芒刺在背,简直看着难受.

      这就是使用的mvp的历程,代码的紧密耦合,即使是代码中的一小部分的更改,也会导致代码的其他部分的更改或者引起错误。减少了可重用性,最终导致代码复制粘贴,冗余严重,就不要再说什么单元测试之类的.

为什么MVVM…??

      我们最终的目标是以这样一种分布式的方式构建项目,将Android相关的东西放在一个地方,并分离出不需要Android运行的所有其他实体,然后进一步分割非Android相关的片段,从而实现代码模块化、可扩展性、易维护性、测试友好性等。
      我们会在公众号博客和技术网站上看到无数关于架构模式的文章和架构设计教程的文章,毫无疑问现在最流行和广泛采用的是MVP~Model—View—Presenter.说明MVP是一个成熟的模式,在一定程度上解决了很多方面的问题,但是也会有上面我提出的问题。当然了没有什么是完美的,总有一个改进的余地。但与此同时谷歌引入了Android架构组件,其中包括ViewModel而不是Presenter,因此证明了谷歌支持MVVM。
      可能这些并不能说明MVVM比MVP好,那就让我们看看上述MVP中所面临的几个问题,MVVM是如何来克服的。

1.代码耦合

      对于每个Activity/Fragment,我们需要一个Presenter,这是一个硬束缚的规则。Presenter持有对Activity的引用和Activity持有Presenter的参考,两者1:1的关系,就是最大的问题所在。随着视图的复杂性的增加,对这种关系的维护和处理也随之增加。而我们的最终目标以分布式的方式构建项目,对项目做分割,为了实现这个目标并避免这种紧密关系的ViewModel被引入。
      ViewModel是负责为activity或Fragment准备和管理数据的类,它还处理activity或Fragment与应用程序的其余部分的通信(例如调用业务逻辑类)。只有View(比如activity)持有对ViewModel的引用,而ViewModel却不持有任何View,这就解决了我们的紧密耦合问题。同时一个View可以引用多个ViewModel。即使对于复杂的视图,我们实际上可以在相同的层次结构中拥有不同的ViewModel。

2.接口冗余

      使用这种方式不用写很多的接口,因为ViewModel中会提供数据,如果需要使用数据时可以直接从viewmodel中获取到,不像MVP那样通过接口来回调数据,这样就不会写很多的接口,也不会又接口声明没有使用的情况.

3.可测试性

      由于Presenter很难绑定到View,所以编写单元测试变得有点困难,因为View有很多的依赖关系。
      ViewModel在单元测试会容易一些,因为它们只是暴露状态,因此可以独立测试,而不需要测试数据将如何被消耗,总之,是不依赖于View的。

      这是几个选择MVVM的原因,可能你也有更多原因,期待你的分享!!

一点感想

      架构模式是不断发展的,MVVM有能力或者说有潜力变成更加强大,有用,令人惊讶的模式。而MVP已经发展到一个相当高的水平,但金无足赤,没有任何东西是完美的。当然学习MVVM有一点轻微的学习曲线,当时也是试验了好久,但最终它帮助我们克服了一些缺点。有人可能喜欢MVVM,也可能不喜欢MVVM,这完全取决于他们的判断。但我是喜欢的那个,同事也是用了都说好的那种,哈哈,只要我们能达成最终目标,其他事情都无关紧要。

PS:再次重申,这是我个人的一点经验、想法以及我们为什么用MVVM重构项目。请不要怀疑我的意图,我并不是想比较和找出差异。我所想的是分享我的经验和MVP的一些缺点,以及如何用MVVM克服。如果惹闹了您,请轻喷,谢谢


推荐阅读
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • MVC中的自定义控件
    怎么样创建自定义控 ... [详细]
  • MVC就是model模型control控制view视图把web开发的分工明确各施其职,互不干涉在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相 ... [详细]
  • ASP.NET MVC 小牛之旅3:Routing——网址路由
    网址路由(Routing)在ASP.NETMVC中有两个主要用途,一个用途是匹配通过浏览器传来的HTTP请求,另一个用途则是响应适当的网址给浏览器。3.1匹配通过浏览器传来的HTT ... [详细]
author-avatar
手机用户2502853457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有