许式伟的架构课
许式伟
七牛云 CEO
84945 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 89 讲
许式伟的架构课
15
15
1.0x
00:00/00:00
登录|注册

22 | 桌面程序的架构建议

数据一致性
数据组织
代码的内聚性
正交分解
用户交互
ViewModel 层
局部更新优化
数据结构的细节
委托机制
响应用户交互事件
界面呈现
职责:负责业务需求的内核逻辑
数据更新事件
承载业务逻辑的 DOM
数据
下期主题:基于浏览器的开发
MVC 的每一层的正确理解与设计
提供 API 的层
应用程序的二次开发接口
单一职责原则
最低耦合原则
Controller
View
Model
结语
API 与交互
架构评判标准
MVC 架构范式
桌面程序的架构建议

该思维导图由 AI 生成,仅供参考

你好,我是七牛云许式伟。
上一讲我们介绍了图形界面程序的框架。站在操作系统交互子系统的角度来看,我们桌面应用程序的结构是下面这样的。
今天我们换一个角度,站在应用架构的角度,来聊聊如何设计一个桌面应用程序。

从 MVC 说起

关于桌面程序,我想你听得最多的莫过于 MVC 这个架构范式。MVC 全称是 “模型 (Model)- 视图 (View)- 控制器 (Controller)”。
怎么理解 MVC 呢?一种理解是,Model 是 Input,View 是 Output,Controller 是 Process,认为 MVC 与计算机的 Input-Process-Ouput 这个基础模型暗合。
但更准确的解释是:Model 是数据,View 是数据的显示结果,同时也接受用户的交互动作,也就是事件。从这个意义来说,说 Model 是 Input 并不严谨,View 接受的用户交互,也是 Input 的一部分。
Controller 负责 Process(处理),它接受 “Model + 由 View 转发的事件” 作为 Input,处理的结果(Output)仍然是 Model,它更新了 Model 的数据。
View 之所以被理解为 Output,是因为 Model 的数据更新后,会发送 DataChanged(数据更新)事件,View 会在监听并收到 DataChanged 事件后,更新 View。所以把 View 理解为 Output 也并不算错,它从数据角度看其实是 Model 的镜像。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了桌面应用程序的架构设计,重点介绍了MVC(模型-视图-控制器)架构范式,并强调了最低耦合原则和单一职责原则对架构优劣的评判标准。在对Model层的理解中,强调了其重要性和独立性,应承载业务逻辑的DOM。对View层的理解中,强调了其负责界面呈现和响应用户交互事件的入口,同时提出了View层设计中需要考虑的问题。此外,还介绍了ViewModel层在复杂界面呈现中的作用。文章还探讨了Controller层的正交分解和内聚性,以及桌面程序需兼顾API与交互的重要性。总体而言,本文为读者提供了关于桌面应用程序架构设计的宝贵建议,对想要了解桌面程序架构设计的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《许式伟的架构课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(48)

  • 最新
  • 精选
  • Smallfly
    这几种模式中,对 MVVM 理解是最多样化的,很大一部分原因是取决于原来是如何使用 MVC 的,可以分为三种流派: 1、在 Controller 中处理所有的业务逻辑,包括监听 View 事件, IO 请求数据,格式化 Model 数据供 View 展示等。该流派认为 ViewModel 是 Controller 的瘦身。 2、在 Model 中处理大部分的业务逻辑,也就是所谓的“胖 Model”,Model 提供格式化的数据给 View,Model 就需要关心 View 的细节,导致 Model 的复用性变差。将格式化 Model 的数据转移到 ViewModel 中,认为 ViewModel 是胖 Model 的瘦身。 3、最后一种,是老师文中说的,ViewModel 属于 View 的一部分,辅助 View 局部更新,我还是第一次听到这种说法。在我看来局部化更新由 Controller 来触发,ViewModel 只负责提供数据,完全跟 View 扯不上关系。但从 Word 的例子来看,这么说也有道理。不过老师也解释了,该模式并不算 MVVM。 要理解一个名词真正的概念,需要追溯它的源头,MVVM 最早是由微软工程师 John Grossman 于 2005 年提出的。ViewModel 作为 View 的数据抽象层,持有 View 的状态和行为。 ViewModel 和 View 不应该有引用关系,而是由中间者,将它们绑定。ViewModel 改变后自动的触发对应 View 的更新,View 的触发事件后,ViewModel 接收并做处理。在实现层面这种绑定关系最适合由响应式框架来做,从而实现 ViewModel 和 View 的双向绑定。

    作者回复: 挺好的补充

    2019-07-06
    5
    63
  • 马哲富
    许老师好! 工作中也经常用到MVC模式开发,经常用个Mode层就是一个和数据库映射的实体,然后再View层和Controller层传输数据,不知道老师文中所指的Mode层应该是“负责需求的内核逻辑”应该如何理解?难道需求的逻辑不是应该放到Controller里的Services里去实现吗?

    作者回复: 你说的service,应该就是我说的model层。一些说法是把model层分为service和DAO层,但是实际上DAO根本算不上一层。

    2019-07-05
    2
    19
  • Lrwin
    不同视角看待架构的最终方向都是一致的: 稳定点和扩展点分离,分而治之的思想 《clean code》书中的架构设计,最核心的是领域Model,它是稳定的。 《实现领域驱动设计》中的战略设计是分之思想,将核心问题域与其他问题域进行分离,划分出核心域,支撑域,通用域,最终的目的是将架构的核心需求进行确定。 架构设计中,clean code架构、四层架构、六边形架构、微服务架构无一例外。 许老师讲Model的时候,我想起了领域驱动设计中的领域模型,真是不谋而合呀。

    作者回复: 👍,挺好的补充

    2019-07-12
    2
    17
  • 被讨厌的勇气
    比较抽象,许老师,有没有比较好的实例程序推荐,通过程序来理解应用架构的具体细节?

    作者回复: 后面会考虑讲一个例子

    2019-07-05
    17
  • 吴小智
    开始不理解了,需要多经历,然后再回头来看

    作者回复: 是的,这本书因为内容高度浓缩,需要反复看。这是练内功与练外功的区别。练外功可能有学完的那天,内功没法学完,甚至可能你会发现比书上更好的体悟。

    2019-07-06
    8
  • 1900
    “文档对象模型”中的“文档”应该如何理解?是因为linux中“一切皆文件”,所以这里一切皆文档么? 我目前只能理解“对象”和“模型”,对象指数据+操作,数据对应了结构体(数据结构),操作对应了方法(方法的集合可以封装成接口);模型本质上指的是抽象。 那“文档”该如何理解?

    作者回复: 这个是一个惯例,一般对象模型是一颗树,树根叫Document,所以叫DOM(文档对象模型)。xml的根对象就是Document是同样的道理。

    2019-07-05
    8
  • 诗泽
    许老师可否展开讲一下如何把model 层做厚,感觉这一部分挺重要的

    作者回复: 假设总代码量不变,那其实就是尽可能把view和controller代码尽可能转model层

    2019-07-05
    8
  • 请叫我eleven
    期待老许谈谈对DDD领域驱动设计的看法。

    作者回复: DDD 强调的就是 Model 的使用接口要自然体现业务,不要被框架绑架。

    2019-07-05
    2
    7
  • nativertc
    代理和委托到底是一种模式还是两种模式?

    作者回复: 两种,代理是模块B接管了A的业务,让别人把自己当作A,这叫代理。委托是A有件事情自己不擅长,把它明确标准后交给B干,这叫委托。

    2020-11-20
    2
    4
  • 靠人品去赢
    老师讲到了MVC和MVVM构架,我理解的前后端分离是一个趋势,model不单单是数据model,同样view也不单单只是用来展示。实际上要把control这个拆开,view也需要control,他可以是有向后台发送请求的,他同样也可以是只是简单的视图交互比如说弹一个对话框。model也是需要control,他可以接受前台请求进行逻辑判断处理数据返回结果,他同样就是跑一个任务,主动去推送不同的数据给用户。

    作者回复: 嗯,我这一讲还是单机软件,后面会谈b/s和c/s结构下的架构。

    2019-07-05
    4
收起评论
显示
设置
留言
48
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部