65.9K
CodeProject 正在变化。 阅读更多。
Home

健壮的 MVC

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (15投票s)

2012年9月24日

CPOL

6分钟阅读

viewsIcon

49014

downloadIcon

2113

适用于桌面和 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.1GLSL 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++ 向导**的经验,请联系我。下载向导安装程序,开始基于此框架创建新项目!

另请参阅

© . All rights reserved.