基于MVC框架的系统重构方法研究与实践

2015-11-14 12:11李景炤等
电脑知识与技术 2015年22期
关键词:计算机软件

李景炤等

摘要:ASP.NET的WebForm开发模式控件丰富,能够迅速搭建Web应用,但是存在可重用性差、安全性低、运行速度慢等缺点,不适合中大型系统的开发。为了提高论文管理系统的安全性、可维性和运行性能,采用ASP.NET MVC框架模式进行系统结构的重构,利用对象关系映射和Active Record技术进行数据层的重构。对比测试结果显示,重构后的系统可维护指数提高,圈复杂度、代码克隆数和CPU使用率降低。

关键词:计算机软件;系统重构;MVC框架;ASP.NET

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)22-0063-04

Abstract: The WebForm ASP.NET development mode control is rich, can quickly build Web applications, but there is a low reusability, low safety, running speed, etc., is not suitable for the development of large systems. In order to improve the security, maintainability and performance of the paper management system, MVC ASP.NET framework is adopted to reconstruct the system structure, and the data layer is reconstructed by using object relational mapping and Record Active technology. Compared with the test results, the system can be improved, the loop complexity, the number of code clones and the usage rate of CPU can be reduced.

Key words: computer software; system reconstruction; MVC framework; ASP.NET

1 问题背景

ASP.NET中的WebForm是一种可视化开发模式,用户通过拖拽控件进行网页界面的设计,Visual Studio编辑器自动在网页文件生成相应的代码,然后双击控件或者在事件视图中双击相应事件,将在另外一个对应的.CS文件中进行编码,实现对网页控件的交互操作[1]。由于开发方便、上手容易,WebForm模式在小型项目开发中广泛应用。但是对于中大型项目,采用WebForm模式进行开发的话会出现不少问题:项目中充斥着大量的网页文件和后台代码文件,文件数量过多难以管理;项目网页文件与逻辑代码文件紧密耦合,代码重用性不高;网页代码中暴露过多的系统实现细节,容易遭受网络攻击导致信息安全问题;数据库操作的代码实现比较繁琐,每次涉及到数据库交互操作都要重新写SQL语句;功能扩展麻烦,当需要扩展新的功能页面时需要重新设计网页界面和进行编码。

我们在开发论文管理系统的过程中,初期为了快速实现系统的主要功能,使用了 ASP.NET WebForm模式来进行项目的开发工作。但随着项目的进行,由于系统功能的不断扩展,同时用户需求有了一些更改,WebForm模式带来的问题逐步显露出来。针对开发工作中出现的问题,项目组决定使用ASP.NET MVC框架重构系统,希望开发工作向着代码的结构规范、冗余度低、重用性好,系统扩展方便、安全性更高的方向发展,使系统具有更高的稳定性和可维护性。

2 MVC框架分析

MVC框架是现代大型项目开发中广泛使用的开发模型,其基于面向对象的设计模式极大提高了程序的开发速度,降低了功能扩展维护带来的不便,使功能像组件一样自由变换[1]。

2.1 MVC核心部件

MVC框架模式将系统按功能模块化地分成三个主要的部件:模型(Model)、视图(View)、控制器(Controller)。它们各自处理自己的任务,相互之间通过接口进行交互[2],其功能划分及相互关系如图1所示。

跟传统的WebForm模式相比,ASP.NET MVC框架放弃了很多有缺陷的特性,如Code-behind页面、服务器控件、数据绑定、URL Rewrite等,取而代之的是Controller、HtmlHelper、Routing等类库和组件[3]。与WebForm相比,ASP.NET MVC在Web开发领域显得更加专业化,对Web开发的效率提升非常明显,特别是在规模较大、功能点多、页面数量多逻辑结构复杂的大型应用程序开发中,MVC模式在健壮性、代码重用和结构方面有了很大的提升 [4]。使用MVC架构开发出软件代码有较强的可理解性、重用性、系统稳定性、可维护性,能够减少软件的修改、再次开发等方面的工作量,减少了在系统方面所投入的成本[5]。

2.2 ASP.NET MVC框架运行流程

在ASP.NET MVC4中,所有请求都是通过项目根目录中的一个Global.asax文件作为唯一的入口,客户端向服务器提交的请求首先由这个文件接收,由该文件执行Application_start()方法实例化启动进程,并调用路由匹配注册表确定指派到某一个控制器处理。控制器接到请求后,可以调用某一个对象模型来处理;模型根据相应的业务逻辑进行逻辑处理,并且与数据库进行交互,返回所需的数据;最终控制器加载并渲染指定的视图来将处理好的数据呈现给用户。系统采用ASP.NET MVC 后的运行流程如图2所示。

3 系统结构的重构

在ASP.NET的WebForm模式中,系统的代码模块是按页面来分的,也就是说有多少个页面就有多少个逻辑处理文件,每个代码文件仅仅处理自身页面的代码逻辑,这种划分代码模块的缺点是,一旦页面过多,就会变得很杂乱,代码文件查找困难,维护难度高,而且不利于日后功能迭代或者功能修改。而在ASP.NET MVC中,项目代码文件按部件来划分,而每个部件又通过系统功能的模块化对应来实现二级划分,整个项目就变得有层次和条理,维护起来也变得方便。

3.1 系统功能分析

毕业设计管理系统是一个教师、学生和系统管理员使用的教务管理平台。按使用角色可以对系统的功能作以下分类:教师有发布课题、修改个人信息、查看课题列表、查询学生信息等功能;学生有选择课题、修改个人信息、查询课题列表、查询教师信息、提交上传文档等功能;系统管理员有审核课题、课题信息管理、网站功能设置、用户信息管理、角色分配、论题管理等功能。

3.2 按功能划分模块

在MVC框架中,控制器实际上就是以相近功能组成的模块。对系统的功能进行分析后,我们进行模块的划分,将功能相近的代码逻辑放到同一个控制器里面,而每一个功能都通过控制器里的方法来实现,方便调用。根据对系统的功能进行分析,本系统的控制器可分为:教师控制器、学生控制器、角色控制器、用户控制器、论题控制器、系统设置控制器等。

在每个都模块抽象为MVC框架中的控制器后,根据每个模块中需要的页面在视图部分进行添加。这样,我们就把整个系统的功能进行了模块化的划分。模块之间既相互独立,又可以通过接口进行相互调用和联系。

3.3 代码文件结构

图3(a) 是WebForm模式中的文件结构,大量的文件都堆放在同一个目录,显得杂乱无章;图3(b)是使用了MVC模式重构后的代码文件结构,为每个核心部件都分配了不一样的目录,这样的做法分层合理,文件结构显得规范有条理;图3(c)是控制器部件目录的展开图,控制器目录中的每个文件都对应每一个模块,有些模块因需要分开两个控制器文件来实现,对应的视图文件在Views目录下。

4 数据层的重构

系统结构的重构完成之后,我们还利用对象关系映射(Object Relational Mapping,ORM)和Active Record技术来进行数据层的重构。

4.1 ORM和Active Record技术

ORM是随着面向对象思想的成熟而产生的一种软件开发技术。目前主流的框架产品,如ASP.NET MVC、Hibernate等,已经将ORM集成在内。Microsoft Entity Framework 是一个对象关系映射(ORM)工具,它能将关系型数据转换成.NET数据对象,也可以将.NET数据对象转换成关系型数据 [6]。

Active Record是一种领域模型模式,最早由Rails提出,它在ORM的基础上,把负责持久化的代码也集成到数据对象中[7]。传统的ORM只是把数据对象与负责持久化的代码分隔开来,数据对象只是单纯的包含了自身的数据结构体。而在Active Record中,他们不仅是数据实体,而且包含了业务逻辑,集成了把自己持久化的操作。在ASP.NET MVC中,Active Record已经定义好了集成持久化操作方法的模型父类,数据对象类只需要继承这个父类,就可以继承这些持久化操作的方法,通过简单的方法调用,就可以实现持久化操作。

4.2 重构系统的数据层

利用ORM和Active Record技术,我们在处理有关操作数据库的业务逻辑时,不需要接触到SQL语句。对数据的操作简化成了对象的操作,为一张表声明一个类,并使类中的成员对应关系型数据库中的字段,就可以跟这个类的实例进行交互了。至于这个对象中的数据怎么跟数据库交互,我们完全不用关心。ORM会根据实际需要生成相应的SQL语句执行,返回的结果又会自动处理成对象或者开发者想要的形式。

重构系统数据层的具体操作分以下两个步骤:

1)为系统的数据对象建立模型,将数据对象转化为关系型数据库中的表和列。

2)修改业务逻辑中需要与数据库交互的代码,将SQL语句替代为由Active Record操作数据对象。

重构系统数据层后,我们能够轻易地通过实例化数据对象来从模型中获取需要的数据,以系统的用户模块为例,用语句“List userList = db.users.ToList();”即可获取所有用户模型的集合。与直接使用SQL语句相比,Active Record技术更为简洁,不易出错,能够进行参数过滤和绑定,还能够屏蔽数据库之间的差异。Active Record技术简化了开发者的工作,使得系统的功能扩展或者修改都比较容易。

5 系统重构效果测量

为了比较重构后系统源代码的重用性、可维护性、冗杂度和性能上的差异,我们使用Visual Studio 2013分别对代码度量值、代码克隆分析和CUP使用率这三个指标进行了测量。

5.1 代码度量值

代码度量是一组对软件质量进行度量的数值,开发者依靠这组数值可以更好地分析他们开发中的代码。通过代码度量,开发者可以清楚看到哪些类型和/或方法应该重写或者进行更加彻底的代码测试。 开发团队也可以通过这组数值识别代码中哪些有可能出现的风险、对项目的状态进行了解,并对软件开发的进度进行跟踪[8]。代码度量会检测出项目代码中所有定义的命名空间,再在其中统计可维护指数、圈复杂度、继承深度等检测值。图4与图5为重构前后代码度量值的结果。

我们的目标是对可维护指数和圈复杂度进行分析。可维护指数的范围在0 至 100 之间,表示了代码维护的相对容易程度,数值越高意味着可维护性越好;而圈复杂度则是描述了代码在结构上的复杂度,它是通过计算程序流中的不同代码的路径数量来创建的 [8]。

对本次重构前后的系统代码检测结果显示,代码重构后可维护指数提升了14%,圈复杂度减少了原来的约40%。同时从层次结构看出,使用了MVC框架模式,代码的根命名空间比原来的少了很多,代码层次分明,可见代码的可维护性有了一定程度的提高。加上使用Active Record技术进行数据层对象封装,对数据对象的操作不再需要局部定义对象的结构,只需要调用Active Record的数据层对象就能胜任,这样相同功能的代码就相对集中在同一个目录,圈复杂度相应地降低。

5.2 代码克隆分析

代码克隆分析就是检测系统项目源代码中重复的部分,使开发人员能够整理重复的代码,提高代码质量。我们在研究中发现,Visual Studio的代码克隆分析不是仅仅匹配字面上的代码,而且能通过代码分析检测逻辑相同的代码,它不仅能搜索代码相同的模块,而且还能搜索语义上类似的结构。图6与图7为重构前后的代码克隆分析结果。

通过对比重构前后的代码克隆分析结果,可以看出使用MVC框架重构后的代码克隆数远小于重构前。而这意味着重构前有大量的重复代码存在,这样的坏处是,通过复制粘贴的源代码一旦需要修改部分代码,就需要查找所有涉及相同功能的地方一并修改;也有可能需要修改某些特定的地方,其他地方保持不变,这时候即使IDE编辑器有批量修改代码的功能也无济于事了。基于MVC框架重构后的代码高度抽象和封装,模块与模块之间已经有了明确的分工,很多相同的逻辑将合并起来;而ORM将通过写SQL语句来获取数据操作的源代码转化成了通过调用ORM封装的方法来生成数据对象的源代码,重复的SQL语句将不再出现,这也是克隆代码降低的其中一个原因。在软件开发的过程中,使用重复代码的频率越少,日后源代码的维护就会越容易。可见,重构后的源代码可维护性有了很大的提高。

5.3 CPU使用率

使用MVC框架重构后的项目抽象封装程度高,有人觉得会对性能造成影响,因为每次运行都要初始化封装好的对象,有可能会加载一些不需要的组件来增加服务器的开销。我们根据重构前后的代码,使用Visual Studio运行代码分析,访问论文管理系统的同一个页面,监听CPU使用率随时间变化的过程,测试时间大约是1分半钟。期间页面每隔一段时间(约10秒)被刷新,不断向服务器发送请求。图8与图9为重构前后的CPU使用率曲线图。

从图8和图9的对比可以看出,重构后的系统CPU使用率总体上都是比重构前要低的。前10秒左右是Visual Studio工具编译部署项目的时间,可以看出使用MVC框架后编译部署过程CPU使用率是使用前的约4倍。这是因为使用WebForm在很大程度上要依赖比较多还没有编译好的部件,很多如图片上传、文件生成、视图渲染的功能都要开发者自行通过源代码实现,编译起来就要耗费相对较多的资源;而MVC框架将绝大部分的部件封装成为二进制文件,只需要编译主要的代码就可以了,CPU使用率自然就低了。

约过了10秒后,是页面接受请求进行逻辑处理的过程。可以看出重构后的系统除了第一次处理请求CPU使用率相对较高,为23%左右,接下来处理请求的CPU使用率都是不到10%。而重构前的系统CPU使用率一直都在波动,居高不下,平均在20%。产生这些差异的原因是,.NET MVC框架在页面第一次被请求的时候就生成了页面的缓存,往后的请求处理就不再需要进行处理页面渲染的步骤;同时,因为服务器已经装上了.NET MVC框架的组件,运行的时候就不再需要额外的CPU资源,所以如果没有在处理请求的情况下CPU使用率都接近0。而传统的WebForm模式没有缓存机制,每次加载都需要重新进行页面渲染工作,CPU使用率偏高,而且在解释非系统自带组件也需要占用一定的CPU资源。

6 总结

本文使用了ASP.NET MVC框架进行了论文管理系统的重构,按系统的功能进行抽象分类,各个部分的功能分成了各个模块,使耦合性尽量低,并通过接口进行交互。对于系统的数据层,运用ORM与Active Record技术进行重构,为数据处理提供了更加直观便捷、便于维护的方式。

对重构前后的代码度量值、代码克隆分析和CUP使用率的对比结果表明,使用MVC框架对于解决代码冗余、增强系统可维护性和运行性能都有比较大的帮助。

致谢:本文作者向指导老师孙宇锋教授、李林同学以及有关老师表示真诚的谢意!

参考文献:

[1] 吴昌钱.net框架下软件开发模式研究[J].哈尔滨师范大学自然科学学报,2014,30(3):99-102.

[2] 林永良,胡建平,吴树林.基于.NET MVC架构下的科研项目管理系统[J].计算机系统应用,2014(12):217-220.

[3] 吴胜,刘建波,刘士彬. ASP.NET MVC框架下内容管理系统的探索与实现[J].微计算机信息,2010(36):30-32.

[4] 周泉.浅谈从 WebForm 开发模式到 ASP.NET MVC 开发模式的发展[J].计算机光盘软件与应用,2012(15):248-270.

[5] 苑庆涛,张新柱,马博,等. 基于ASP.NET MVC的数字化管理平台[J].计算机技术与发展, 2013(12):164-167.

[6] 龚兰兰.基于.Net MVC4 的Code First 模式数据库开发和迁移[J].信息通信,2014(12):99-99.

[7] 许日丹,杨俊.基于Rails框架的ActiveRecord模块研究与应用[J].软件导刊,2007,57(13):127-129.

[8] Microsoft. 代码度量值[EB/OL]. https://msdn.microsoft.com/zh-cn/library/bb385914.aspx, 2015-01-01/2015-04-30.

猜你喜欢
计算机软件
基于C语言的计算机软件编程
浅谈不同编程语言对计算机软件开发的影响
浅谈基于C语言的计算机软件程序设计
基于计算机软件开发中分层技术的应用