Computer Science and Application
Vol.06 No.11(2016), Article ID:19044,12 pages
10.12677/CSA.2016.611088

Modeling and Application of a General Questionnaire Solution Based on DSL

Yuzeng Chang, Guangyan Lin, Hongyu Fang, Tantan Man

College of Software, Beihang University, Beijing

Received: Nov. 2nd, 2016; accepted: Nov. 22nd, 2016; published: Nov. 25th, 2016

Copyright © 2016 by authors and Hans Publishers Inc.

This work is licensed under the Creative Commons Attribution International License (CC BY).

http://creativecommons.org/licenses/by/4.0/

ABSTRACT

Based on business area analysis and concept extraction to the survey questionnaires, using XML and Backus-Naur Form, the paper defines a domain specific language which is suitable for questionnaire, and then with template engine and XSLT generates the ultimate code, resulting in a relatively complete survey questionnaire generation solution. At last, a practical demonstration is given out for the verification and retrospection of the solution.

Keywords:Questionnaire, Domain Specific Language, Domain Analysis, Concept Extraction, Object Code Generation

基于DSL的通用调查问卷建模和应用

常玉增,林广艳,方弘宇,满坦坦

北京航空航天大学软件学院,北京

收稿日期:2016年11月2日;录用日期:2016年11月22日;发布日期:2016年11月25日

摘 要

本文对调查问卷业务进行领域分析和概念抽取,基于XML、巴科斯范式定义了一种适用于调查问卷的领域特定语言,并结合模板引擎和XSLT技术生成了最终目标代码,由此形成一套较完整的调查问卷生成方案。最后通过案例对该方案进行了验证。

关键词 :调查问卷,领域特定语言,领域分析,概念抽取,目标代码生成

1. 引言

由于无地域限制、低成本等因素,在线调查问卷已经成为目前最普遍的信息采集手段之一。然而设计实现调查问卷系统并非易事。倪浪 [1] 提出基于模板的动态表单技术来实现问卷制作功能,但模板的元数据是保存在数据库中,并需用PHP解析后才生成页面,这种方式对于问卷的多变性支持较差,且每次都需耗费时间来生成问卷页面。陆茜茜 [2] 把问卷定制分为出题、组卷两个步骤,虽然逻辑很清晰,但留给业务人员的可定制空间较小。由此可见,若使用通用型语言(如C++、Java)描述调查问卷领域,当业务逻辑复杂时,会造成代码结构庞大、判断逻辑复杂,这会降低开发人员效率,并且客户难以通过代码了解开发者思路,为客户和开发者的交流造成障碍。

针对上述问题,本文提出一种面向问卷的领域特定语言,并以该语言为辅助生成了目标代码,从而弥补通用语言的不足。领域特定语言(Domain Specific Language, DSL),是针对某一特定领域的、具有受限表达性的一种计算机程序设计语言,也被称为应用型语言 [3] [4] 。使用针对调查问卷的DSL,可以在开发者和领域专家之间建立起一座桥梁,使开发者能迅速的构建出满足客户需求的软件。本文旨在设计并实现一种调查问卷生成方案,主要是通过构建调查问卷领域的DSL,借助该DSL进行编程,并最终生成目标代码,发挥了提高软件开发效率和产品质量的作用。

2. 方案提出

本文的调查问卷生成方案主要包括三个环节:概念抽取、DSL定制以及模板填充和目标代码生成,如图1所示。其中概念抽取环节的主要工作是领域界定与分析;DSL定制环节需经过DSL元模型构建,再使用巴科斯范式进行语法描述;模板填充环节中,需针对需求使用该DSL进行描述,并结合模板进行填充以生成目标代码。

3. 概念抽取

分析领域是设计DSL的前提,首先需要认识问题领域,其次对领域进行概念抽取并划分问题空间,最终针对问题空间设计DSL,但DSL的设计并不是一个简单的串行过程,需要不断回溯验证 [3] 。DSL涉及内容包含语法、语义、案例、方法、工具等 [5] ,如图2所示。

3.1. 领域对象的概念抽取

在领域分析过程中,通常由领域专家提取特定领域的关键概念,创建特定领域的元模型。本研究涉及的领域为问卷调查领域,DSL设计的目的是为了生成在线调查问卷的题目,DSL需要描述不同类型和选项数量的题目。

Figure 1. Solution of questionnaire generation

图1. 调查问卷生成方案概览

Figure 2. Flow of analysis of the domain and customization of DSL

图2. 从分析问题领域到定制DSL

每个问卷下包含若干个、数量不等的题目。题目包括单项选择题、多项选择题、填空题、提示语句、选择填空题、矩阵题等6种类型,图3是一道矩阵题目的样例。

3.1.1. 题目的基本结构

虽然调查问卷的题目类型不同,但题目间具有一些共同的基本结构:

1) 包含一个题干,用于对问题的总体描述;

2) 包含一个题目类型属性,用于标记该题目所属的类型;

3) 包含一个至多个选项个数,用于用户作答;

4) 包含一个必填选型属性,用于标记该题目的作答是必须还是非必须。

对题目共同基本结构的总结有助于抽象对题目的描述。

3.1.2. 题目的其他特性

题目根据用户的要求会具有一些特殊的性质,主要表现为:

1) 逻辑关联性。题目之间会有逻辑关系,题目的不同答案会关联其他题目。

2) 问题嵌套。一道问题里可能包含多道其他问题,以矩阵题目为例,整个矩阵可视为一道题目,而每一行可视为被包含的小题。

3.2. 界面展示的概念抽取

包含各类题目的问卷的目标代码是HTML,展示在浏览器上,题目按题号顺序排列;对于有选择项的题目,提供选择框控件;对于有填空项的题目,提供输入框控件。

用户在终端界面作答时,系统代码会对其输入进行判断,并根据判断结果采取对应的交互操作:

1) 题目的输入答案具有校验规则,如只能选择一个答案;

2) 题目具有必须填写的属性,会要求用户在填写完毕后才能提交;

3) 题目和其他题目具有关联关系,会跳转到关联题目。

Figure 3. An example of matrix type of questionnaire

图3. 调查问卷的矩阵型题目样例

3.3. 数据访问的概念抽取

在数据输入方面,问卷内容根据题目模板和用户定制的具体内容共同生成。题目模板由业务员编写;题目具体内容由问卷编辑人员通过浏览器在网页上填写,数据被收集后封装成指定数据结构,通过模板引擎与题目模板结合。

在数据存储方面,DSL模板、模板引擎生成的DSL文件以及HTML目标代码均以文本文件的方式存储于系统磁盘上,对于其中频繁访问的文件可以使用数据库和缓存存储以优化性能。

4. DSL定制

本论文设计的DSL基于XML,因为使用XML具有两个优势:第一,XML可通过XML Schema验证其内容合法性,故XML Schema可以作为DSL的元模型来规范语法,减少编写编译器检查语法的环节 [6] ;第二,XML拥有相关规范能将XML文档直接转化为目标代码——HTML文档,减少编写解析器转化代码的环节。

4.1. 使用XML Schema制作DSL元模型

本文以题目为粒度划分调查问卷,以题目为描述对象设计DSL的元模型 [7] [8] 。DSL的使用者可将多个描述对象组合成一个调查问卷。

4.1.1. 定义question类型描述题目

通过领域分析抽取question类型的属性如表1所示。

其中,qItems表示对题目选项的描述,是复杂类型,将在4.1.2小节给出其数据结构的描述。subQs表示子题目,因为题目可能具有嵌套性而包含其他题目,所以设计时采用自引用结构,子题目的类型也是question类型。fQRef标记了包含本题目的父类题目的ID,该属性的引入实现question类型自引用的解决方案,通过类似数据库外键的机制关联question类型对象。ifNecessary字段标记了题目是否必须作答,它是枚举类型,将在4.1.3小节给出其数据结构的描述。

question类型的属性字段和描述以及其关联关系如图4所示。

4.1.2. 定义item类型描述题目选项

通过领域分析抽取item类型的属性如表2所示。

其中,value属性限定了题目选项取值范围,是枚举类型,将在4.1.3小节给出其描述。logicQRef记录了与该选项有逻辑关联的题目,用户作答该选项后,会根据题目ID跳转到关联题目。parentQRef表示选项所属的题目。

item类型的属性字段和描述以及其关联关系如图5所示。

Figure 4. The data structure of question type

图4. Question类型的数据结构

Figure 5. The data structure of item type

图5. Item类型的数据结构

Table 1. The fields of question type

表1. Question类型的字段名称及释义

Table 2. The fields of item type

表2. Item类型的字段名称及释义

4.1.3. 定义枚举类型约束DSL语法

枚举类型主要针对question类型中的necessary以及item类型中的value属性,XML Schema定义的枚举类型如图6所示。

综上所述,借助XML Schema,本文建立了包含question类型、item类型和枚举类型的DSL的元模型,该元模型充当DSL的规范。至此使用XML Schema定制调查问卷DSL的过程完毕。客户和开发人员可以使用该DSL进行问卷描述和开发。DSL的完整元模型如图7所示。

4.2. 调查问卷DSL的巴科斯范式描述

巴科斯范式(Backus-Naur Form, BNF),是用于描述计算机语言语法的符号集,本文使用巴科斯范式描述调查问卷DSL,声明DSL语法,巴科斯范式符号声明如表3所示。

调查问卷DSL的巴科斯范式如图8图9图10所示。

5. 模板引擎使用与目标代码生成

DSL定制完成后,相关人员可以使用该DSL进行业务需求描述,但只是产生了中间结果,还需进一步转换为最终结果,即目标代码。生成目标代码的主要逻辑是:编写DSL代码模板,使用相应的引擎填充DSL代码模板,并把生成的中间文件最终转化为目标代码 [9] 。

本节以DSL的设计和DSL代码模板制作为基础,以模板引擎和相关规范为途径 [10] ,阐述目标代码生成方案。

5.1. 使用引擎填充DSL模板

本文使用基于标签替换原理的模板引擎FreeMarker制作代码模板,标签替换是根据标记的名称在DSL中查找相应的值进行替换而生成具体代码。FreeMarker通过${}与#指令标记代码模板的特定部分。${}引用动态数据,#指令建立模板语言的控制结构,如选择、循环等。FreeMarker标签替换示意如图11所示。

模板制作人员将DSL编写的文件存储成ftl格式就可以使用FreeMarker对其进行生成,其工作流程如图12所示。这个过程主要借助于Java原生的SAX接口和开源XML解析库DOM4J。其中,读入环节是通过创建SAX读取器,解析相应路径上的DSL模板,从而得到一个Document对象;验证环节,创建SAX解析器,指定Schema、XSD、异常处理器等属性,然后对读入环节的Document对象进行校验,若

Figure 6. The enumeration types defined by XML Schema

图6. XML Schema定义枚举类型

Figure 7. Meta-model of DSL

图7. DSL元模型

Figure 8. Base elements described by BNF

图8. 基础数据的巴科斯范式描述

Figure 9. Compound types described by BNF

图9. 复杂类型的巴科斯范式描述

Figure 10. Simple types described by BNF

图10. 简单类型的巴科斯范式描述

Figure 11. Demonstration of how FreeMarker works

图11. FreeMarker标签替换示意图

Figure 12. How FreeMarker works with DSL templates

图12. 使用FreeMarker填充DSL模板

Table 3. Symbol declaration

表3. 符号声明

有异常则输出报错日志并警告相关人员,否则正常执行后续环节;在验证DSL模板成功后开始生存问卷环节,FreeMarker模板引擎使用具体问卷信息对DSL模板中的占位符进行解析和填充,从而得到最后的问卷描述文件。

FreeMarker输出结果是题目的DSL描述文件,问卷中每一道题目都对应一个DSL描述文件。最终这些DSL描述文件保存在系统磁盘上。

DSL描述文件具有两个作用:第一,它作为一种数据结构定义了某个题目,并保存了制作题目者的输入信息;第二,充当了开发者和领域专家交流的媒介。

5.2. 使用XSLT技术生成目标代码

调查问卷最终展示于浏览器,目标代码为HTML。本文采用XSLT技术将DSL描述文件,即XML类型的文件直接转化为HTML目标代码。

XSLT技术的工作原理是利用名为stylesheet的文件作为源文档和目标文档的转换映射。用户在stylesheet文件中定义源文档节点和与之对应的欲转换的预定义模板,XSLT处理工具会遍历XML源文档,一旦在文档中匹配到指定节点,就会把匹配部分用预定义模板填充,从而转换为结果文档 [11] 。其工作过程如图13所示。

6. 案例与验证

6.1. 抽象DSL代码模板

DSL通过XML标签描述对象,输出较冗长。业务员若对每道题目手动编写,复杂且易错。所以需要抽象代码模板,通过模板引擎填充用户输入的信息,自动化生成题目的DSL描述。模板有两个优点,第一,自动化生成DSL,提高效率;第二,模板编写一次可以多处运行,提高复用率。

图14是矩阵题目的抽象DSL代码模板缩略图(模板中嵌套了供引擎解析的相关语法,如${}占位符以及循环)。

6.2. 用DSL编写不同类型题目

本文以较为复杂的业务情况为例阐述调查问卷DSL的实际应用,假设有一道矩阵题包含两道小题,分别是多项选择题和填空题,其中多项选择题第一个选项与填空题有逻辑关联,该题目样例如图15所示。

首先使用DSL描述外层的矩阵题目,因为矩阵题中包含两道小题,所以最终目标文档中包含两个subQ节点,目标文档如图16所示(subQ具体内容由后文阐述)。

矩阵题中包含的小题均为question类型,挂载于父question的subQ节点。此外需要设置多项选择题第一个选项与填空题的逻辑关联,具体的DSL描述文档树形结构示意如图17所示。

利用XSLT技术对DSL文档进行转化,可将XML树形结构转化为HTML树形结构,得到目标代码。经验证,最终生成的目标代码可以在浏览器上正常展现,如图18所示。

Figure 13. Demonstration of object code generation by XSLT

图13. 利用XSLT生成目标代码过程示意图

Figure 14. Matrix questionnaire problem DSL template

图14. 矩阵题的DSL模板缩略图

Figure 15. An example of matrix questionnaire problem

图15. 包含多选题和填空题的矩阵题目样例

Figure 16. The outline of DSL document structure

图16. 外层矩阵题的DSL文档结构示意图

Figure 17. The outline of sub-questions document structure

图17. 多选题和填空题的DSL文档结构示意图

Figure 18. Screen shot of the example on the browser

图18. 矩阵题目在浏览器上的展现截图

7. 结论

XML具有通用的、不被特定目的限制的语法,并且拥有完善的规范和技术支持,可作为快速创建DSL的方案。

本文在抽取调查问卷领域概念的基础上,探讨了使用XML Schema制作DSL的元模型、规范DSL文档结构,从而创建自定义DSL的过程;使用FreeMarker模板引擎和XSLT技术将DSL文件模板生成目标代码;最后通过实际案例展示了DSL编写模板文件及目标代码生成的效果。通过DSL编程和目标代码生成技术实现了提高软件开发效率和产品质量的目的。

合理的领域分析与设计方法是提取特定领域关键概念与创建完整的DSL的基础,我们希望在不同领域能抽象出普遍的DSL创建方法;此外基于XML的DSL虽可以减少语法检查和语言解析的工作,但XML由于是标签式语言,比较冗长,我们希望可以设计出更加简洁DSL。以上两点将是本文以后研究的方向。

基金项目

中央高校基本科研业务费专项资金资助。

文章引用

常玉增,林广艳,方弘宇,满坦坦 . 基于DSL的通用调查问卷建模和应用
Modeling and Application of a General Questionnaire Solution Based on DSL[J]. 计算机科学与应用, 2016, 06(11): 736-747. http://dx.doi.org/10.12677/CSA.2016.611088

参考文献 (References)

  1. 1. 倪浪. 基于B/S的在线问卷调查系统的设计与实现[D]: [硕士学位论文]. 成都: 电子科技大学, 2014.

  2. 2. 陆茜茜. 面向精神卫生领域的问卷调查系统的设计与实现[D]: [硕士学位论文]. 苏州: 苏州大学, 2015.

  3. 3. Mernik, M., Heering, J. and Sloane, A.M. (2005) When and How to Develop Domain-Specific Languages. ACM Computing Surveys, 37, 316-344. https:/doi.org/10.1145/1118890.1118892

  4. 4. Fowler, M. 领域特定语言[M]. 北京: 机械工业出版社, 2013.

  5. 5. 张伟, 梅宏. 一种面向特征的领域模型及其建模过程[J]. 软件学报, 2003, 14(8): 1345-1356.

  6. 6. 王伟良, 施佺, 曹渠江. 基于XMLSchema 抽象模型的XML模式验证方法[J]. 计算机应用与软件, 2007, 24(3): 41-43.

  7. 7. 殷丽凤, 郝忠孝. 存在XML强多值依赖的XML Schema规范化研究[J]. 计算机科学, 2010(1): 192-196.

  8. 8. Jiang, T. and Wang, X. (2012) Research on Metamodels Consistency Verification Based on Formalization of Domain- Specific Metamodeling Language. Journal of Shanghai Jiao Tong University (Science), 17, 171-177. https:/doi.org/10.1007/s12204-012-1248-2

  9. 9. 杨兴涛, 苏桂平, 王瑞芳, 等. 特定领域建模与代码生成的研究与实现[J]. 计算机系统应用, 2009(4): 100-103.

  10. 10. 管太阳. 基于模板的自动代码生成技术的研究[D]: [硕士学位论文]. 成都: 电子科技大学, 2007.

  11. 11. 王海林. 特定领域建模与Web应用系统生成[J]. 计算机与信息技术, 2011(7-8): 24-29.

期刊菜单