摘 要 探讨了不同类型试题的自动批改方法。采用Visio二次开发技术,通过分析UML模型图的组成和结构,提出了一种基于图形元素比较的UML模型图的自动批改方法。基于组件方式实现,具有良好的可扩充性。
关键词 UML模型;自动批改;Visio二次开发;组件开发
0 引言
软件建模是学生从事软件开发的必备能力,在教学过程中,无论是结构化开发方法,还是面向对象开发方法,建立软件模型能有效提高软件的可视化程度,是工程化开发的核心。UML建模技术是一种总结了以往建模技术的经验并吸收了当今优秀成果的标准建模技术,利用UML表达的软件模型,可以直接将UML模型转化为某种程序设计语言的源代码框架[1]。
常用的UML模型图有用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图、部署图等类型,Microsoft Visio可以方便地绘制这些图表,有效地进行面向对象建模,是计算机类课程最易使用的建模工具。
目前,试题自动批改技术的研究方兴未艾,对于客观题(如选择题、判断题),处理比较简单。对于主观题,也有较多的研究,但因为涉及到领域知识和语义理解,难于用同一种方法解决,文献[2]提出了一种基于带权概念网络进行分层相似度计算的主观题自动批改的解决方案,文献[3]对算法的验证和批改提出了解决方法。这些能够在一定程度上解决一般性主观题和算法设计题,但软件建模结果UML模型的自动批改技术还是空白,本文研究UML模型的自动批改技术,这在网上作业系统、实验、实训等教学系统中应用相当广泛,可以有效地减轻教师的工作压力和劳动强度。
1 UML模型自动批改技术
从广义上看,正确的UML模型是指符合软件需求的模型,判断UML模型的正确性也就是验证模型和软件需求的一致性。从狭义的可操作的自动批改技术看,正确的模型是指符合标准答案要求的模型。本文主要讨论后者。在软件项目建模训练过程中,学生使用Visio完成UML建模任务,提交绘图文件。教师给出标准绘图文件作为参考答案和评分标准,自动批改程序打开学生提交的绘图文件,对比参考答案,检查并判别图形元素的正确性,根据评分标准,计算出得分。通过开发Microsoft Visio解决方案的Visio automation技术,可以实现上述功能。
2 Visio开发的关键技术
2.1 Visio对象模型
Visio对象模型表示Microsoft Visio引擎通过Automation展示的对象、属性、方法和事件,描述了对象之间的相关方式。模型中大多数对象对应于Visio界面中看到和选定的项目。例如Shape对象表示选定的Visio绘图页中的内容(形状、组合、连接线等)。有些对象可以表示其它对象的集合,集合中包含0个或多个对象。Visio对象模型(部分)如图1所示。
图1 Visio对象模型(部分)
2.2加载COM组件
Visio提供了COM对象、ActiveX控件支持, 可以对UML模型进行图形控制,读取或写入信息到UML模型的各种类型图 [4]。在VS.NET 2008环境中,在工具箱上添加Microsoft Visio 11.0 Drawing Control组件,然后就可以在Form中调用其对象。项目引用中会自动增加AxVisOcx,VisOcx和Visio的引用。在项目中首先添加Microsoft. Office. Interop.Visio和AxMicrosoft.Office.Interop.VisOcx两个namespace。然后,就可以通过C#操作Visio对象。得到control对象后,设置其src属性就可以打开一张Visio图,例如axDrawingControl.Src=“C: \standard.vsd”。
2.3 读取UML模型元素信息
为了读取UML模型元素信息,需要分析模型图的结构组成。一个UML模型包括若干页。图2是一个简单的类图页。包括Employee和Address两个类以及类与类之间的组合关系。其在Visio中的结构组成如图3所示,类图页包括Shapes集合,该集合有Class、Class11、Compsition、Watermark Title 4个元素。其中Class为类Employee的形状,Class11为类Address的形状,Compsition为Employee和Address之间的组合关系形状,Watermark Title为水印标题形状。每一个形状也是一个集合,包含若干元素。其中,类形状包含8个元素,Name为类名,Attributes为类的属性, Operations为类中操作,Parameters为参数,另外4个未定义。组合形状集合包含4个元素,end1_mp为端点1的阶数,end1_name为端点1的名称,end2_name为端点2的阶数,end2_mp为端点2的名称。此外,类图中Generalization(泛化) ,Binary Association(二元关联), Dependency (依赖)等形状均包含若干元素。
图2 UML模型中的类图
图3 类图的结构组成
每一个形状(元素)是一个对象,通过引用对象的属性可以取得相应的值。设类图页为standardPage,standardPage. Shapes[i].Text取得当前页第i个形状的文本,standardPage.Shapes[i]. Name取得当前页第i个形状的名称,类之间的组合关系的名称可以通过语句standardPage. Shapes[i]. Characters.Text获得。在类形状中,Shapes[4]表示Attributes, Shapes[5]表示Operations,Shapes[6]表示Parameters ,Shapes[7]表示Name,返回这些形状的Text属性值,分别可以获得类的属性定义、操作定义、参数的详细信息和名称。
2.4 读取关联关系
类图的比较,不仅要比较类的名称、属性和方法,还应该考虑类与类之间的连接关系,包括二重关联、泛化、组合、依赖等连接关系。语句currentPage.Shapes[i]. Connects[j].ToCell.Shape.Name能够返回当前页形状i(连接线)的第j个连接所连接的形状(类)的名字;对于二重关联、泛化、组合、依赖的形状,Connects[]中都有有两个元素,对于泛化形状,Connects[2]表示有三角形继承符号(父类)的一端,Connects[1]表示无继承符号(子类)的一端,对于组合形状,Connects[1]表示有菱形符号(整体)的一端,Connects[2]表示无菱形符号(部分)的一端。
3 UML模型自动批改算法
3.1 UML模型图的比较
UML模型自动批改通过模型图的比较实现,算法compDiagram()实现了两个模型图的比较,standardPage表示标准答案模型图中页,currentPage表示需要批改模型图中页。算法调用compShape()方法对两个页中的形状逐一扫描比较,判定两个形状的是否相等。其中,score变量表示得分。Split()方法可以将字符串以参数字符为分界点划分成若干个子串。若模型图的当前页包含n个元素,则问题的规模为n,其时间复杂度为O(n2)。
int compDiagram(Page standardPage,Page currentPage)
{ for (i = 1; i <= shapenum1; i++)
{ curname=standardPage.Shapes[i].NameU.Split('.');
for (j = 1; j <= shapenum2; j++)
{ standardname = currentPage.Shapes[j].NameU.Split('.');
if (compshape(i, j, standardname[0],curname[0]))
{score++; break; }
}
}
}
compShape(int i, int j,string s1,string s2)实现类图中形状的比较,参数i,j指定了不同的形状,s1,s2表示形状的类型。类图的形状类型有Watermark Title,Generalization ,Composition,Class,Binary Association, Dependency等。算法对同类型的两个形状进行比较,根据名称判断是否相等。
Boolean compShape(int i, int j,string s1,string s2)
{ if (s1.Equals(s2))
{ switch (s1)
{ case "Watermark Title": return true;
case "Generalization":
if (standardPage.Shapes[i].Characters.Text. Equals(currentPage.Shapes[j].Characters.Text))
return true;
else break;
case "Composition":
if (standardPage.Shapes[i].Characters.Text. Equals(currentPage.Shapes[j].Characters.Text))
return true;
else break;
case "Class":
if (standardPage.Shapes[i].Shapes[7].Text. Equals(currentPage.Shapes[j].Shapes[7].Text))
return true;
else break;
case "Binary Association":
if (standardPage.Shapes[i].Characters.Text. Equals(currentPage.Shapes[j].Characters.Text))
return true;
else break;
case "Dependency":…
…
}
return false;
}
else
return false;
}
3.2 基于组件的实现
将类图模具中所有形状的比较方法定义为Class.dll组件,以便动态调用。针对其它模型图,如功能模型(数据流模型图),也可将模型图模具中所有形状(外部实体、处理、数据流、数据存储等)的比较方法定义为DFD.dll组件,基于VS2008平台,通过C#动态调用委托的DLL,根据图形元素类型选择指定的方法比较,可以完成批改功能[6]。这种开放性设计模式,使自动批改模块可通过增加DLL组件增加新的模型图批改功能,修改某个组件不会影响其他的组件,也不需要修改自动批改模块架构,该方法结构稳定,可以推广到其他模型,具有良好的可扩充性和可修改性。
4、结束语
基于VS.NET平台,使用C#语言,应用Visio二次开发技术,通过模型元素的比较,可以有效地实现UML模型的自动批改。这种开发方法可以充分利用Visio软件提供的编程接口,节省了大量的编程时间。该方法实用性强,可以广泛用于作业系统、实验、实训系统中。但UML模型的主观性很强,其正确性判断涉及到相关的业务领域知识,如何从需求层面,检验模型的准确性,需要在领域知识方面进一步研究。
参考文献
[1]郭宁.UML及建模. 北京:清华大学出版社[M].2007:33-45
[2]王津,严蔚敏.基于服务器组件技术的在线练习环境[J].计算机应用与软件, 2003,20(9):26-27.
[3]黄康,袁春风.基于领域概念网络的自动批改技术.计算机应用研究[J], 2004,21(11):260-262.
[4]朱昊,雷鸣,高. Visio二次开发技术在电气工程教学图形化中的应用[J].电气电子教学学报,2006,28(1):95-97.
[5] Microsoft 公司.开发Microsoft Visio 解决方案[M].北京:北京大学出版社, 2002:251-323.
[6] Hejlsberg等. C# 编程语言祥解(第2版). 电子工业出版社,2007.8