北漂IT民工 的博客

MVC及其递归性和MVC变种

MVC是一种很古老的软件架构模式。这种模式对于计算机刚出来时是一种比较完备或者比较适用的描述。

但是随着时间的流逝,软件变得越来越复杂,MVC这种结构就会看上去显得不准确。但是我们只要能基于巨人的肩膀跳出来看问题,我们就能更好的理解MVC结构的价值。

首先我们来看看什么是MVC。

简单来说

M:就是模型,英文原文是Model。
他的意思就是对基本业务单元的抽象。但是这种业务更多是指对可存储的数据模型的抽象。
C:就是控制,英文原文是Controller。
他的意思就是对基本业务处理的抽象。但是更多的偏向于非存储的业务模型的抽象
V:就是视图,英文原文是View。
他的意思就是对于人机界面交互处理的抽象。但是更多的是偏向于如何展示的人类可见的界面。

M,V,C三者是对计算机系统或者软件最简单的抽象,而实际的计算机系统或者软件往往是对这三块的丰富,所以本质是要比MVC复杂的。

所以我们在这里再深入的讨论MVC模型下面的子模型。

首先是M这个部分。

M作为数据部分,
我们可以想象的到的实物产品有:
1.磁盘或者存储盘(包括光盘,U盘,硬盘,存储阵列等)
2.内存
3.网络(包括有线,无线的数据传输介质)
我们可以想象到的软件产品有:
1.数据库(Mongodb, Mysql, Oracle等)
2.文件
3.管道
4.共享数据
5.缓存等(CPU缓存,Session缓存,加速缓存等)
所以我们可以看出来M这个概念本身就是非常广泛的。我们列出来的都是概念上的M,而在实现M的过程中,必然会同样涉及到M里的MVC。
比如我们的Msql数据库,

  1. 首先Mysql必然有文件作为存储媒体保存数据库的信息,我们可以将文件当成是Mysql的M
  2. 同时Mysql具备自己的SQL语言,可以将对SQL语言的解析当成是C
  3. 而Mysql是有命令行的操作界面的,这个界面可以称为V。当然Mysql也推出了基于图形的界面工具Mysql workbench,还有一些其它的图形工具比如navicat之类的,都可以称为Mysql产品的View端

所以我们可以看到在一个M产品里,仍有一个完整的MVC链

然后我们再看看V这个部分

软件领域的V我们大概可以看到以下三类V

  1. 手机端的V
  2. 桌面端的V
  3. Web的V
    那么这么View里一般会包含有
  4. 视窗( window)
  5. 菜单
  6. 按钮
  7. 进度条
  8. 文本框

    等等
    我们可以看到大部分的菜单,按钮,都是包括
  9. 文字(M)
  10. 控件能力(C)
  11. 外观设计(V)
    这三个部分的。
    那么从MVC的角度来看,这三者组成了一个完整的MVC。
    所以V也是递归的MVC结构

最后我们看看C的部分

C的部分相对来讲更加的广泛一点。因为C的部分除了通用的部分外,还有很多专用的内容。
所有的软件从本质来讲都是C。
也就是所有的软件都是为了达成某一种控制目标而存在的。
C就是控制器,我们可以想象到的最常见的物理上的控制器就是CPU,键盘,鼠标。
而软件上最常见的就是协议,指令,信号,业务逻辑等。
他的作用是让我们的所有信号按照预定的方式执行。
那么C部分有没有MVC的递归性呢?C部分的MVC递归性看上去要显的弱很多。

  1. 首先我们可以看到的是C部分所处理的所有内容都是数据,我们可以将他看成是M。
  2. C部分天然拥有很多的控制代码与业务处理,将他们理解成C也是没有任何问题的
    3.那么View在MVC的C里有没有呢?

如果单纯从可视化来讲,C是可以没有V的。
但是C的View是可以表现在接口上的,也就是通常我们理解的API或者SOAP等。
这是一个机器的View。人类理解它们会有文档,会有对这个接口的描述。

但是C里也是可以有可视的V的。目前来讲大部分的运行监控都是针对C的处理能力的监控。
比如处理了多少的用户,调用了多少次API,使用了多少的内存,完成了多少次请求等等。

因些我们可以发现,除了我们在C部分遇到了一点点困难外,我们很轻松的将MVC递归的拆分成功了。

并且当我们将MVC的递归性应用到更多的领域时,我们就很容易理解真正的MVC的意义是什么。

比如在Web领域。
后端可以更加明确成一个MVC的变种: RRRMVC
RRR => (Request Route Response)

目前Web Component就是一个MVC组件,将MVC全部包装在一起然后供上层MVC调用。

还有一种是MVVM变种:
将V与M通过C绑定,让其它的C独立出来不再做绑定的工作。

结论

MVC是一种对基本的计算模型的抽象,他会随着时间的变化而变化,但是当你回到最小数据集去描述一个程序或者软件时,MVC还是最适用的一个模型,我们去理解MVC时,不应该直接去否定MVC的价值,而是找到MVC的本质,理解新的变种与MVC本身之间的关系,这样我们才能更要的利用MVC模型,达成我们自己的需要。