健壮的 MVC






4.76/5 (15投票s)
适用于桌面和 Web 开发的健壮 MVC 框架。
引言
在开发一个大型软件产品时,有许多方面需要考虑:总体架构、物理布局、对象生命周期管理、可维护性、性能、设计(反)模式等等。开发可以从零开始,一个一个地添加所有上述方面,或者从一个解决其中一些问题的模板开始。但是,唉,这样的模板不存在,现有的模板往往只关注这些方面中的一个或两个,而在其他方面则采取捷径。
在本文中,我们将探讨一个更完整的示例,并提供一个更健壮的框架,可以根据未来的需求进行调整。
真实世界
大多数创建应用程序的讨论都以对模型-视图-控制器 [MF] 的沉思开始,但大多数原生应用程序项目仍然从具有文档-视图“架构”的 MFC 模板开始。事情往往从那里开始走下坡路,过了一段时间,业务逻辑与表示层交织在一起,物理布局与 MFC 交织在一起。再加入几个外部库,你就得到了一个庞大的单体代码库,编译时间越来越长,解决问题或引入新功能需要越来越多的英勇努力。旁注,托管应用程序模板也好不到哪里去,但请查看我关于托管应用程序/WCF 的另一篇文章 [wcf 技术术语]。
健壮的模型-视图-控制器
为了改进模型-视图-控制器 [MVVM, MVP],已经确定了一些创新,但似乎更重要的是改进 MVC 与用于构建应用程序的平台/库的集成方式。更重要的是,今天的应用程序很少只涉及一个平台,有些部分在桌面运行,有些在后端(或其某个层)执行。因此,集成方法应允许跨多个平台重用*实际*模型和控制器实现。视图的实现通常更依赖于表示/外观/可视化技术,因此尝试为表示逻辑获得相同的实现通常不值得。但是,如果模型/控制器逻辑已经完成,那么重新实现视图(但请参阅下文如何通过重用可视化构建块来简化该任务)以适应相应的平台就会变得更加直接。
范围
那么,让我们定义本例将涵盖的范围。提醒一下,我们希望涵盖一些相当复杂的内容,以免跳过重要方面。让我们做一些图形化的东西,使用 OpenGL,更好地使用一些更新的东西——着色器。通常应用程序不是从头开始构建的,所以让我们使用一些外部库,看看它们如何适应:Boost 是一个流行的库,还有 GLEW 来帮助处理 OpenGL。可维护性和物理布局如何:为相应的功能建立独立的模块,并允许构建单元测试,以及在其他项目中重用。
现在,让我们选择实际的平台,并实际定义将与平台无关的部分。模型和控制器应与平台无关。视图的渲染将是 OpenGL,由于它是跨平台的,我们也将渲染部分保持跨平台。
现在是应用程序本身——连接和绑定所有内容的“胶水”(请注意,它只是绑定,没有太多其他功能)。我们实际上会设置两个这样的应用程序:一个将使用 MFC,另一个将是一个独立的 HTTP 网络服务器。为什么要选择 MFC?因为**你**很可能已经了解它的优点和痛点。为什么选择独立的网络服务器?显然是因为与网络连接的框架非常有用。但也因为它与桌面 MFC 应用程序截然相反,这应该能显示出该方法的健壮性。
最重要的是,文档将自动生成,并且(如果有时间)进行源代码分析和代码覆盖率测试。
预览
有时最好从甜点开始,在这种情况下,让我们看看快照
![]() |
![]() |
使用 OpenGL 着色器的应用程序 | Web 服务器和 Chrome 浏览器 |
以下是使用网络服务器的屏幕截图。请注意,半径会增加/减少,直到达到指定的限制。这些限制由控制器强制执行。
集成
以下是桌面集成的快照,其中突出显示了相应区域。请注意以下关键区域
- 模型和控制器不依赖于胶合代码 (MFC)。
- 胶合代码对模型和控制器的依赖性最小。
- 对模型的修改只能由控制器执行(即,模型只能作为 const 从文档中检索)。
- 视图类只负责图形管道的初始化,并将渲染的其余部分委托给 ModelRender 类。
以下两张图显示了项目的物理布局,其中包含以下关注区域
- 模型和控制器不依赖于胶合代码。这一点与上一节中的一个点类似,但在物理结构层面上。
- 模型和控制器不依赖于视图代码。
- 在胶合代码中,文档不依赖于用于可视化的图形 API (OpenGL)
图形
本文中的示例针对 OpenGL 2.1 和 GLSL 1.20 着色器。选择此版本的 OpenGL/GLSL 主要是为了确保它可以在“普通”硬件上执行(实际上这将在今天笔记本电脑中常见的裸机 Intel 集成显卡上运行)。同时,这将涵盖以下重要方面
- OpenGL 上下文初始化
- 使用 GLSL 着色器,其 uniform 值基于模型
- 多个视图共享同一个 OpenGL 上下文
- 当**所有**视图关闭时,OpenGL 上下文将关闭
- 每个文档/模型使用独立的上下文以强制一致性
绘图实际上是一个使用 OpenGL 固定管线绘制的四边形,然后是第二个四边形,由模型中指定的值的半径裁剪。裁剪是使用 GLSL 着色器完成的,它保持非常简单
GLchar* vSource = "varying float x; \r" "varying float y; \r" "void main() { \r" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \r" " gl_FrontColor = gl_Vertex; \r" " x = gl_Vertex.x; \r" " y = gl_Vertex.y; \r" "} \r" ; GLchar* fSource = "uniform float radius; \r" "varying float x; \r" "varying float y; \r" "void main() \r" "{ \r" " float r = sqrt(x*x + y*y); \r" " if( r <= radius ) { \r" " gl_FragColor = gl_Color; \r" " } else { \r" " gl_FragColor = vec4(0.01, 0.01, 0.01, 1); \r" " } \r" "} \r" ;
单元测试和测试覆盖率
本节展示了单元测试报告和单元测试达到的覆盖率快照:
安装
最后总结一下最好的部分:所有上述内容都可以通过一个新的 Visual Studio **向导**合理地重复使用。要安装,您可以导航到 Visual Studio 库,使用如下所示的 Visual Studio,或者在顶部下载安装程序
在 Visual Studio 中打开新项目对话框。输入搜索词:“igor okulist”。选择“Robust MVC”项,然后继续安装。如果一切正常,您应该会看到如下所示的对话框:
安装后,新项目对话框将有一个新的 **向导** 类别:
摘要
本文介绍了将 Model-View-Controller 框架实现并集成到现有应用程序开发框架中的关键点。该方法保持最小的依赖性并促进跨平台开发。此外,相同的 Model-View-Controller 实现与一个网络服务器集成,允许通过网络浏览器访问相同的模型[渲染]。
常见问题解答
- 问:源代码在哪里?!
- A
仍在准备中。请收藏、投票或发表评论,以帮助我优先处理与其他业余项目。顺便说一下,如果您有为 Visual Studio 2010 制作 **C++ 向导**的经验,请联系我。下载向导安装程序,开始基于此框架创建新项目!