什么是抽象边界 ? 抽象边界的认识论起源在哪里?

通俗的说,MVC 就是认识伦中的二分法,加上一个皮条客。二分产生的对象是M与V,C是那个皮条客。

MVC是苹果官方力推的模式,把软件系统中的对象赋予视图、控制器或模型三种角色之一,三者间通过抽象边界进行通信。MVC既是一种设计模式也是一种架构模式,任何层级的模块都是以这三者角色之一对外提供服务。

  • 视图、控制器和模型只是三种角色而已,是相对的。
  • 对象通过抽象边界被分为三种角色。
  • 对象通过抽象边界进行通信。
The Model-View-Controller (MVC) design pattern assigns objects 
in an application one of three roles: model, view, or controller. 
The pattern defines not only the roles objects play in the application, 
it defines the way objects communicate with each other. 
Each of the three types of objects is separated from the others
 by abstract boundaries and communicates with objects of the other types
 across those boundaries.



⚠️MVC不是三层架构,很多人现在仍然在把它当三层架构来用。同时三层架构也不是从视图到模型的引用链的长度就是三。


Model-View-Controllerdeveloper.apple.com


mvc框架和三层架构 mvc和三层架构的理解_mvc三层架构


mvc框架和三层架构 mvc和三层架构的理解_三层架构和mvc能一起使用吗_02

图-1-苹果的MVC


mvc框架和三层架构 mvc和三层架构的理解_mvc试图 下拉框不重复_03

图-2-经典的MVC

认识论基础

当代认识论有一个基本的观点,即认识的是现象,而不是物体自身。物体是通过其相对于被作用物的对外特性标志其存在,就好比笛卡尔的抽象与具体同一的我是通过思而确定存在的一样。 这里就存在三中角色,物自体、现象和认知主体。它解决的是认知主体与物的二元关系,却选择引入这种三层的认知体系,即物自体、现象与主体。

苹果在接下来的对模型对象、视图对象与控制器对象的描述便很不恰当了!它完全固化了模型、视图、控制器的角色到长度为三的引用链条MVC不是苹果的,解释权属于每一个合理的解释。

现在考虑一下,在苹果对模型概念、视图概念和控制器概念的内部可否使用MVC。其实,视图便是数据的外部特性,外化展示,控制器便是二者的协调器。与当代认识论一样,现象协调了物自体与认知主体的矛盾。

比如把苹果的模型对象分为:网络层、数据解析层、与外部API层,网络层对应模型对象,数据解析对应控制器对象,外部API层对应视图对象,但是作为一个整体对外表现为一个数据对象或是控制对象或视图对象。同理适用与视图对象和控制器对象。

以上便是对MVC背后的认识论思考!

什么是抽象边界

在软件工程中,抽象便是接口。接口表达一个意愿,可以有多个对象来实现它。那么抽象边界便是,采用接口后对系统的抽象所产生的相对角色聚集。

试图与控制器之间、控制器与模型之间的通信,是跨越抽象的边界进行的,通信过程中传递的也应该是某种抽象(即接口),而不是具体的对象。

这样不是直接把真实的对象传递给视图了吗?视图可能直接持有模型了!

通过控制器向视图传递的是抽象的意愿,即接口,而恰巧模型接口与视图接口有一定的相似度而已!

⚠️这里传递的是抽象的接口,仅限于接口能力的固化。在保证效率的前提下,良好的架构设计不是为了运行时模型、视图和控制器通过什么通道进行通信,而完全是为人而设计的,是为了软件可扩展、可维护等等而设计。至于是采用一套接口,还是为视图与模型各创建一套内容相似的接口,完全可以灵活把握。

这样通过接口的粗粒度信息传递,进一步解放了控制器,让控制器专注在交互与协调上,做枢纽该做的事!

基于抽象接口的MVC

模型对象运行时直接通知视图对象,避免了很多控制器中不必要的代码。等价与模型通知控制器对象,控制器对象再更新视图对象。同时保持了模型与视图的独立性,它们是听过控制器与接口耦合在一起的。

控制器创建后,会在内部创建模型与视图,并把它们通过接口关联在一起,视图对象不知道模型对象。模型直接通知视图对象,视图对象与控制器交互,控制器操作模型对象。一个单向的环,完美!这便是MVVM模式了!


mvc框架和三层架构 mvc和三层架构的理解_mvc框架和三层架构_04

图-3-MVC

请阅读:

嘟嘟:系统架构解耦的一点思考zhuanlan.zhihu.com


MVP设计模式


mvc框架和三层架构 mvc和三层架构的理解_三层架构和mvc的区别_05

Model View Presenter (MVP) design pattern and data bindingwww.c-sharpcorner.com

mvc框架和三层架构 mvc和三层架构的理解_mvc三层架构_06


该模式有一个很大的问题是视图中的状态数据。当业务非常复杂的时需要界面联动时,使用该架构很不合适。

表现器完全通过api与模型进行数据的读写。与MVC一样视图与表现器间也存在双向的通信,即视图向表现器发送交互行为,表现器通过接口读写视图数据。

VIPER架构

Architecting iOS Apps with VIPERwww.objc.io

mvc框架和三层架构 mvc和三层架构的理解_mvc三层架构_07


mvc框架和三层架构 mvc和三层架构的理解_mvc试图 下拉框不重复_08


建议在MVVM上在一定的场景使用路由,灵活使用MVC架构。