CN103279631B - 设计模式制导的爪哇代码评审方法 - Google Patents
设计模式制导的爪哇代码评审方法 Download PDFInfo
- Publication number
- CN103279631B CN103279631B CN201310264462.XA CN201310264462A CN103279631B CN 103279631 B CN103279631 B CN 103279631B CN 201310264462 A CN201310264462 A CN 201310264462A CN 103279631 B CN103279631 B CN 103279631B
- Authority
- CN
- China
- Prior art keywords
- class
- rule
- java
- design mode
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种设计模式制导的爪哇代码评审方法,用户首先要提供待评审的爪哇(Java)程序的源代码及其设计时信息,对设计时信息中的类图进行分析,提取出设计模式信息,生成设计模式的各个参与角色的对应关系,根据该信息,利用预定义的规则模板,将规则模板实例化为一组应该在代码上满足的约束规则,读入这些规则对待评审的Java源代码的抽象语法树进行分析,判断其实现是否满足了设计时的约束,对于那些不满足约束的情况给出提示。本发明能够自动的对代码进行评审,减少整个评审过程中人工检查代码的工作量,提高代码的评审效率。
Description
技术领域
本发明涉及一种用于自动检测设计模式信息在设计类图与爪哇(Java)代码实现之间的一致性的方法,属于计算机技术领域。
背景技术
自从设计模式的概念被提出之后,它已经在科研和工业界中被广泛地使用。设计模式是一种高度抽象的设计时信息,提供一种良好的模块化解决方案,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。,设计模式在代码实现时需要程序员的理解,故这个过程很容易地引入人为的错误。
代码评审方法是一种在测试之前对代码进行检查的过程,它根据一系列事先准备好的检查项列表,在代码中查找是否存在不满足检查项描述的约束的情况,从而能够提前发现代码中存在的缺陷。现有的代码评审工具大部分关注的是代码的修改所引入的缺陷检查,还有的关注的是代码本身应该满足的特性,很少关注设计信息,所以可结合设计模式信息,将设计模式在设计时的信息规约成一系列的规则,这些规则也就是所谓的检查项。将这些规则表示成计算机可以识别的格式,那么就可以自动地检查代码实现是否符合设计时的意图,提供一个自动检查工具来检测这种一致性约束,从而减少整个评审过程的人为干预。
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE、JavaEE、JavaME)的总称。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
发明内容
技术问题:本发明目的是提供一种设计模式信息从设计类图到Java代码实现的一致性代码评审方法,解决代码评审中的过多人为干预问题。
技术方案:本发明所述设计模式制导的Java代码评审方法中,首先用户提供待评审Java程序的源代码及其设计时信息,然后对设计时信息中的类图进行分析,提取出设计模式信息,根据该信息,利用预定义的规则模板,接着根据设计模式的各个参与角色的对应关系将规则模板实例化为一组应该在代码上满足的约束规则,最后读入这些约束规则对源代码的抽象语法树进行分析,判断其实现是否满足设计时约束,对于那些不满足约束的情况给出提示。
本发明所述设计模式制导的Java代码评审方法包括以下步骤:
步骤1、用户提供待评审的爪哇Java源代码及其包括类图的设计时信息;
步骤2、分析类图中存在的继承和关联关系,提取出相应的设计模式,将每个设计模式描述成各个类所扮演的角色关系,将这些角色关系提交给用户选取出有效的设计模式;
步骤3、用户提供用于Java代码评审的预定义的规则模板,根据有效设计模式的角色关系,用类名以及类的位置信息对规则模板进行实例化,形成与各个类相关的规则;所述预定义的规则模板定义所有适用于设计模式的角色关系的约束,包括以下模板:
规则1,继承规则:类的父类或者继承的接口是否满足约束;
规则2,关联规则:类是否有满足约束的属性;
规则3,参数方法定义规则:类是否有方法的参数满足规则约束;
规则4,this参数方法调用规则:类的方法内部是否用参数调用带this指针的方法;
规则5,同名方法调用规则:类的方法的实现中是否调用了另外一个对象的同名方法;
规则6,返回值方法定义规则:类的方法是否有一个方法返回值满足约束;
规则7,返回子类方法实现规则:类中返回值为约束描述的方法在实现时是否返回的是返回值的子类;
规则8,集合关联规则:类的属性是否有一个集合关联到规则约束描述的类;
规则9,接口方法互相调用规则:类是否继承了一个接口方法,在这些继承方法中调用另外一个接口的方法;
规则10,引用调用接口方法规则:类继承了一个接口,并且保存一个到另外一个类的引用,在继承的接口方法中,是否用这个引用来调用其方法;
规则11,私有构造方法规则:类的构造函数是否是私有的;
规则12,参数构造方法定义规则:类的构造函数是否定义了满足参数约束的构造函数;
规则13,内部类规则:类是否为一个内部类;
步骤4、读入与实例化后形成的规则相关的类对应的待评审Java源代码,建立这些类的抽象语法树,根据语法树对上述规则进行匹配,检查类是否满足规则的约束,如果不满足,告诉用户待评审的Java源代码不满足哪些规则,所述抽象语法树是Java源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构,根据预定义的规则模板,针对设计模式中类a与类b之间角色关系,对实例化形成的规则评审后给出的结果如下:
规则1、类a未继承类b;
规则2、类a未关联类b;
规则3、类a未定义参数为b的方法;
规则4、类a未在方法m内用this参数调用类b的方法;
规则5、类a在方法m内未调用类b中同名的方法;
规则6、类a未定义返回值为类b的方法;
规则7、类a在返回值为类b的方法m内未返回一个类b的子类;
规则8、类a未关联一个类b的集合;
规则9、类a未在继承于类b的方法内调用继承于类c的方法;
规则10:类a未在继承于类b的方法内用一个类c的变量调用类c的方法;
规则11、类a存在一个非私有的构造函数;
规则12、类a未定义一个以类b为参数的构造函数;
规则13、类a不是类b的内部类;
所述类a、类b和类c均为Java类的名称。
有益效果:本发明所述的设计模式制导的Java代码评审方法实现了Java源代码与设计模式之间的一致性检查功能,从设计模式的角度提供了Java代码正确性的评审依据。具体来说,本发明所述的方法具有如下的有益效果:
(1)在本发明所述设计模式制导的Java代码评审方法中,将原来不被实现关注的设计时信息与源代码紧密结合,提供了一种设计与实现的一致性评审方法;
(2)本发明所述的设计模式制导的Java代码评审方法从设计类图中提取设计模式信息,可以自动地检查代码实现是否符合设计时的意图,提供一个自动检查工具来检测这种一致性约束,从而减少整个评审过程的人为干预。
附图说明
图1是设计模式制导的Java代码评审方法具体实施框架,
图2是设计模式与规则的对应关系。
具体实施方式
本发明给出一种Java代码评审方法,用于检测设计模式信息在设计类图和源代码上的一致性,图1是设计模式制导的Java代码评审方法具体实施框架,在具体实施中,可以利用现有的设计模式检测器、规则编辑器、规则产生器、规则评审器等工具或者自行构建这些工具。
本发明具体的实施过程如下:
步骤1、用户提供待评审的Java源代码及其所有类的类图、Java源文件以及类图的位置等信息。
步骤2、设计模式检测器分析类图中存在的继承和关联关系,获得有效的设计模式。在具体实施中,可以利用设计模式检测器工具,提取出类图中用到的具体设计模式,每个设计模式的定义都会有一组角色参与,这些角色间存在一些约束关系。在得到类图的设计模式后,将这些类对应到设计模式的各个角色上,这样就形成了具体的与各个类相关的角色关系。有了这些设计模式中的角色关系后,提交给用户进行人工确认,哪些确实是有效的设计模式,确认后的结果供后续的步骤使用。
步骤3、用户根据规则编辑工具,为Java代码评审提供预定义的规则模板,根据有效设计模式的角色关系,通过规则产生器,对规则模板进行实例化,形成与各个类相关的规则。在具体实施中,所述预定义的规则模板定义所有适用于设计模式的角色关系的约束,包括以下模板:
规则1(继承规则):类的父类或者继承的接口是否满足约束;
规则2(关联规则):类是否有满足约束的属性;
规则3(参数方法定义规则):类是否有方法的参数满足规则约束;
规则4(this参数方法调用规则):类的方法内部是否用参数调用带this指针的方法;
规则5(同名方法调用规则):类的方法的实现中是否调用了另外一个对象的同名方法;
规则6(返回值方法定义规则):类的方法是否有一个方法返回值满足约束;
规则7(返回子类方法实现规则):类中返回值为约束描述的方法在实现时是否返回的是返回值的子类;
规则8(集合关联规则):类的属性是否有一个集合关联到规则约束描述的类;
规则9(接口方法互相调用规则):类是否继承了一个接口方法,在这些继承方法中调用另外一个接口的方法;
规则10(引用调用接口方法规则):类继承了一个接口,并且保存一个到另外一个类的引用,在继承的接口方法中,是否用这个引用来调用其方法;
规则11(私有构造方法规则):类的构造函数是否是私有的;
规则12(参数构造方法定义规则):类的构造函数是否定义了满足参数约束的构造函数;
规则13(内部类规则):类是否为一个内部类。
在具体实施中,结合预定义的规则模板,根据步骤2获得有效的设计模式,有了参与设计模式的各个类角色,就可将这些类用于规则的实例化,图2给出了设计模式与规则的对应关系表,当读入一条设计模式后,查找该设计模式应该生成哪些具体的规则,将生成的这一组规则保存下来供后续步骤使用并继续读入下一条设计模式。在遍历完所有的设计模式后,就得到了针对本次评审所需的所有规则。
步骤4:根据步骤3生成的结果,对于每一条实例化的规则,读入规则中描述的类对应的Java源代码,建立这些类的抽象语法树,通过规则评审器工具检查Java源代码是否满足规则的约束。在具体实施中,评审源代码是否满足设计模式的约束时,采用的是建立抽象语法树并根据语法树对规则进行匹配的方法,该方法利用EclipseAST库建立类的抽象语法树,根据不同的规则,匹配抽象语法树应该满足的约束条件,遍历完各条规则后就得到的本次的评审结果。
步骤5:根据步骤4所作的评审,对于那些不符合设计模式约束的源代码实现给出提示,告诉用户所不满足哪些规则,根据预定义的规则模板,针对设计模式中类a与类b之间角色关系,对实例化形成的规则评审后给出的结果如下:
规则1、类a未继承类b;
规则2、类a未关联类b;
规则3、类a未定义参数为b的方法;
规则4、类a未在方法m内用this参数调用类b的方法;
规则5、类a在方法m内未调用类b中同名的方法;
规则6、类a未定义返回值为类b的方法;
规则7、类a在返回值为类b的方法m内未返回一个类b的子类;
规则8、类a未关联一个类b的集合;
规则9、类a未在继承于类b的方法内调用继承于类c的方法;
规则10:类a未在继承于类b的方法内用一个类c的变量调用类c的方法;
规则11、类a存在一个非私有的构造函数;
规则12、类a未定义一个以类b为参数的构造函数;
规则13、类a不是类b的内部类。
在具体实施中,所述类a、类b和类c均为Java类的名称。
在具体实施中,最终用户可以根据上述评审结果修改其代码实现。
Claims (1)
1.一种设计模式制导的爪哇代码评审方法,其特征在于该方法包括以下步骤:
步骤1、用户提供待评审的爪哇Java源代码及其包括类图的设计时信息;
步骤2、分析类图中存在的继承和关联关系,提取出相应的设计模式,将每个设计模式描述成各个类所扮演的角色关系,将这些角色关系提交给用户选取出有效的设计模式;
步骤3、用户提供用于Java代码评审的预定义的规则模板,根据有效设计模式的角色关系,用类名以及类的位置信息对规则模板进行实例化,形成与各个类相关的规则;所述预定义的规则模板定义所有适用于设计模式的角色关系的约束,包括以下模板:
规则1,继承规则:类的父类或者继承的接口是否满足约束;
规则2,关联规则:类是否有满足约束的属性;
规则3,参数方法定义规则:类是否有方法的参数满足规则约束;
规则4,this参数方法调用规则:类的方法内部是否用参数调用带this指针的方法;
规则5,同名方法调用规则:类的方法的实现中是否调用了另外一个对象的同名方法;
规则6,返回值方法定义规则:类的方法是否有一个方法返回值满足约束;
规则7,返回子类方法实现规则:类中返回值为约束描述的方法在实现时是否返回的是返回值的子类;
规则8,集合关联规则:类的属性是否有一个集合关联到规则约束描述的类;
规则9,接口方法互相调用规则:类是否继承了一个接口方法,在这些继承方法中调用另外一个接口的方法;
规则10,引用调用接口方法规则:类继承了一个接口,并且保存一个到另外一个类的引用,在继承的接口方法中,是否用这个引用来调用其方法;
规则11,私有构造方法规则:类的构造函数是否是私有的;
规则12,参数构造方法定义规则:类的构造函数是否定义了满足参数约束的构造函数;
规则13,内部类规则:类是否为一个内部类;
步骤4、读入与实例化后形成的规则相关的类对应的待评审Java源代码,建立这些类的抽象语法树,根据语法树对上述规则进行匹配,检查类是否满足规则的约束,如果不满足,告诉用户待评审的Java源代码不满足哪些规则,所述抽象语法树是Java源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构,根据预定义的规则模板,针对设计模式中类a与类b之间角色关系,对实例化形成的规则评审后给出的结果如下:
规则1、类a未继承类b;
规则2、类a未关联类b;
规则3、类a未定义参数为b的方法;
规则4、类a未在方法m内用this参数调用类b的方法;
规则5、类a在方法m内未调用类b中同名的方法;
规则6、类a未定义返回值为类b的方法;
规则7、类a在返回值为类b的方法m内未返回一个类b的子类;
规则8、类a未关联一个类b的集合;
规则9、类a未在继承于类b的方法内调用继承于类c的方法;
规则10:类a未在继承于类b的方法内用一个类c的变量调用类c的方法;
规则11、类a存在一个非私有的构造函数;
规则12、类a未定义一个以类b为参数的构造函数;
规则13、类a不是类b的内部类;
所述类a、类b和类c均为Java类的名称。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310264462.XA CN103279631B (zh) | 2013-06-27 | 2013-06-27 | 设计模式制导的爪哇代码评审方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310264462.XA CN103279631B (zh) | 2013-06-27 | 2013-06-27 | 设计模式制导的爪哇代码评审方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103279631A CN103279631A (zh) | 2013-09-04 |
CN103279631B true CN103279631B (zh) | 2016-01-20 |
Family
ID=49062148
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310264462.XA Active CN103279631B (zh) | 2013-06-27 | 2013-06-27 | 设计模式制导的爪哇代码评审方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103279631B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103902383A (zh) * | 2014-03-26 | 2014-07-02 | 浪潮电子信息产业股份有限公司 | 一种基于继承机制的资源管理器设计方法 |
CN106909604B (zh) * | 2015-12-22 | 2022-06-24 | 清华大学 | 基于规则的excel表单和access数据库的自动检查方法及系统 |
CN109426720B (zh) * | 2017-09-01 | 2021-01-22 | 北京国双科技有限公司 | 接口参数的验证方法及相关装置 |
CN108491189B (zh) * | 2018-03-22 | 2021-07-27 | 华东师范大学 | 一种基于差异比较对设计类图进行评价的方法 |
CN108469949B (zh) * | 2018-03-22 | 2021-07-27 | 华东师范大学 | 一种基于差异比较对分析类图进行评价的方法 |
CN109002283B (zh) * | 2018-06-14 | 2021-07-27 | 南京航空航天大学 | 一种基于文件路径分析的代码审查者推荐方法 |
CN109254774A (zh) * | 2018-08-30 | 2019-01-22 | 郑州云海信息技术有限公司 | 软件开发系统中代码的管理方法和装置 |
CN111309634B (zh) * | 2020-03-23 | 2023-06-16 | 安徽中科国创高可信软件有限公司 | 一种基于继承和代理的代码检测规则框架建立及使用方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5946490A (en) * | 1996-03-22 | 1999-08-31 | Northeastern University | Automata-theoretic approach compiler for adaptive software |
CN102385505A (zh) * | 2010-08-30 | 2012-03-21 | 北京理工大学 | 针对面向对象程序设计语言源代码的软件可视化方法 |
-
2013
- 2013-06-27 CN CN201310264462.XA patent/CN103279631B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5946490A (en) * | 1996-03-22 | 1999-08-31 | Northeastern University | Automata-theoretic approach compiler for adaptive software |
CN102385505A (zh) * | 2010-08-30 | 2012-03-21 | 北京理工大学 | 针对面向对象程序设计语言源代码的软件可视化方法 |
Non-Patent Citations (7)
Title |
---|
Design pattern directed clustering for understanding open source code;Zhixiong Han等;《ICPC"09.IEEE 17th International Conference on Program Comprehension, 2009》;20090519;全文 * |
Java程序中设计模式的抽取方法;李文锦;《中国优秀博硕士学位论文全文数据库 (硕士) 信息科技辑》;20051015(第06期);正文第1页第4段,第6段,第7页第3段,第13页第2.3节第1段,第14页第2.3.1节,第15页第2.3.2节,第18页第2段,第28页第1段,第36页第1段,第40页第1段 * |
Recovering Design Patterns to Support Program Comprehension;Linzhang Wang等;《EAST"12 Proceedings of the 2nd international workshop on Evidential assessment of software technologies》;20120922;第49页第1节第1,4-5段,第50页第3节第1段,第51页第3.1节第1段 * |
Reverse engineering of design patterns from java source code;Nija Shi等;《Proceedings of 21st IEEE/ACM International Conference on Automated Software Engineering》;20060922;全文 * |
从源码中抽取设计模式技术研究综述;冯铁等;《计算机应用研究》;20050810(第8期);全文 * |
软件设计模式的研究及应用;郭领艳;《中国优秀硕士学位论文全文数据库 信息科技辑》;20070715(第01期);全文 * |
面向JAVA的设计模式探测研究与工具开发;但蕾蕾;《中国优秀博硕士学位论文全文数据库 (硕士) 信息科技辑》;20050715(第03期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN103279631A (zh) | 2013-09-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103279631B (zh) | 设计模式制导的爪哇代码评审方法 | |
Maoz et al. | GR (1) synthesis for LTL specification patterns | |
CN110389896A (zh) | 代码自动化分析和测试方法、装置及计算机可读存储介质 | |
CN102236549A (zh) | 跨动态边界的运行时分析的可视化 | |
Lin et al. | Semantic classification and hash code accelerated detection of design changes in BIM models | |
CN102662825B (zh) | 一种面向堆操作程序的内存泄漏检测方法 | |
CN112765031B (zh) | 一种群智化漏洞挖掘任务的分解方法 | |
Biswal et al. | A novel approach for scenario-based test case generation | |
CN103294596A (zh) | 一种基于程序不变量的合约式软件故障预警方法 | |
CN106295346A (zh) | 一种应用漏洞检测方法、装置及计算设备 | |
CN106339313B (zh) | 一种Java API程序异常与文档的描述不一致自动检测方法 | |
CN114547611A (zh) | 一种基于多模态特征的智能合约庞氏骗局检测方法及系统 | |
CN112199512A (zh) | 面向科技服务的事理图谱构建方法、装置、设备及存储介质 | |
CN102541282B (zh) | 利用图标移动对已完成词汇再编辑的方法、装置及系统 | |
Antony et al. | An approach to clone detection in behavioural models | |
Saxena et al. | Impact of coupling and cohesion in object-oriented technology | |
Mehlmann et al. | Modeling multimodal integration with event logic charts | |
Asuncion et al. | Capturing custom link semantics among heterogeneous artifacts and tools | |
CN104899042A (zh) | 一种嵌入式机器视觉检测程序开发方法及系统 | |
Liu et al. | NaviDroid: a tool for guiding manual Android testing via hint moves | |
Lacueva-Pérez et al. | Assessing TRL of HCI Technologies Supporting Shop Floor Workers | |
Zhang et al. | Distributed system model using SysML and event-B | |
Grechanik et al. | Differencing graphical user interfaces | |
CN109952557A (zh) | 分层内容选择 | |
Derezińska et al. | Enhancements of detecting gang-of-four design patterns in C# programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |