龙空技术网

Mendel:基于遗传隐喻的源代码推荐

慕测科技 151

前言:

而今大家对“c语言遗传算法源代码”可能比较注意,各位老铁们都想要知道一些“c语言遗传算法源代码”的相关文章。那么小编同时在网上收集了一些对于“c语言遗传算法源代码””的相关内容,希望同学们能喜欢,同学们快快来学习一下吧!

1 引用

Angela Lozano and Andy Kellens and Kim Mens. Mendel: Source Code Recommendation based on a Genetic Metaphor. In Proceedings of the 26th IEEE/ACM International Conference on Automated Software Engineering, 2011, 384-387.

2 摘要

在开发软件系统时,开发人员会花费大量时间来了解现有源代码。为了成功实现新的行为或改变现有行为,开发人员需要回答以下问题:“我可以使用哪种类型和方法来解决此任务?”或“我的实现应遵循哪些特定的命名或结构约定?”。在本文中,我们介绍了 Mendel,这是一个源代码推荐工具,可帮助开发人员回答此类问题。该工具根据开发人员当前浏览的实体,采用遗传学启发隐喻的方法来分析与当前工作环境相关的源代码实体,并向其用户提供许多当前正在处理的源代码相关的建议的属性(如命名约定,使用类型,调用消息等等)。在初步的验证中我们的方法 Mendel 有一定的潜力。

3 技术介绍

诸如命名约定、编程习惯用语、代码模板和设计模式这类的源代码规则在提高程序的可理解性中起着重要的作用。开发人员通常会使用这类规则让自己的代码逻辑清晰、设计易于理解。例如,当实现代表各种用户界面操作的类层次结构时,在该层次结构中所有类的名称添加后缀“Action”是很常见的实现方式。

在本文中,我们提出了针对面向对象系统的名为 Mendel 的一种代码助手算法。算法把开发人员当前正在处理的源代码实体作为输入,输出是有关该实体可能缺少哪些特征的建议。该算法假定以某种方式相关的源代码实体(例如,按类层次结构)通常由相同的规则控制。如果特定源代码实体中缺少其大多数亲戚共有的特定特征,则我们认为该特征是一个候选推荐。Mendel 旨在通过分析源代码实体与附近的源代码实体之间的区别来检测源代码实体中的缺失特征。我们的方法包括了如下所示的 5 个步骤。

3.1 检索被分析实体的家族

作为算法的第一步,我们首先检索与当前正在处理的实体 e 相关的源代码实体集,得到家族成员集合 family(e)。我们假设可以基于紧密相关的源代码实体提供有用的建议。由于我们分析了面向对象的系统,因此我们规定一个类的族包括同一层次结构中的所有类。可以通过获取所选类的直接超类并返回所有该超类的直接子类以及这些直接子类的子类来表示这组家庭成员。此外,在确定类的家族时,要区分所分析的类是具体有限的还是抽象的。如果开发人员正在研究抽象类,那么通过分析相关抽象类获得的建议将比具体类的建议更具相关性。因此,我们将抽象类的族限制为也是抽象的类,而具体类的族将仅包含具体类。当所分析的类不属于任何类层次结构时(直接从 Object 继承),那么其族为空。

方法族定义为该方法的实现类的族中所有具有相同签名方法的集合。例如,图 1 显示了类 RemoveAction 的 performPerformance 方法族。在该图中,所选实体的族成员以黑色显示, performAction 方法的所有实现均被视为实体的家族成员。

图 1. performAction 的家族成员

3.2 查找所分析的源代码实体及其家族成员的性状

我们算法的第二步包括确定所分析的源代码实体 e 及其实体的家族成员的性状 trait(e)。对于一个类,我们考虑以下属性:1)组成类名称的关键字。对于 ApplicationAction 类,则包含“Application”和“Action”;2)类的所有祖先;3)该类实现的所有方法的签名;4)类引用的所有类型。对于方法,我们考虑以下属性:1)方法的广义分析树,提供了方法结构的抽象表示;2)该方法使用的所有类型;3)从方法内部调用的所有方法的签名;4)方法协议的分类表示;4)方法内部的所有父类调用。

如下图 2 所示,展示了 RemoveAction.performAction 的家族成员 perfromAction 的性状 trait(e)。

图 2. performAction 的家族成员的性状

3.3 查找家族中的显性性状

图 3. performAction 的家族成员的显性性状

3.4 查找家族中的隐性性状

对于一个类,如果至少有三分之二的家庭成员都认为该性状是隐性的,则认为该性状是隐性的。由于某个方法的家族成员的数量往往比一个类的家族成员少得多,因此,我们认为一种方法特性一旦被其中两个方法的家族成员所共有,便是隐性的。如图 4 所示为该实体 performActtion 方法的隐形性状,其中 ActionStack 类型标识和调用方法 updateParent 和 add 符合隐形性状的条件。

图 3. performAction 的家族成员的隐形性状

3.5 为所分析的源代码实体提供建议性状

建议性状是指对所分析的源代码实体提出的更改或添加的建议。如前所述,我们区分了两种性状:被分析实体应该表现出的性状和实体可能想要表现出的性状。

4 本文主要贡献

本文作者提出了一种面向对象系统的名为 Mendel 的新颖代码助手算法。作者察觉到用户在编程过程中会遵守命名规范,设计规范,使用代码模板的现象。基于此,作者开发了一个工具,它根据开发人员当前浏览的实体,采用遗传学启发隐喻的方法来分析与当前工作环境相关的源代码实体,并向其用户提供许多当前正在处理的源代码相关的建议的属性(命名约定,使用类型,调用消息等等)。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件学院 2018 级硕士生门铎翻译转述。

标签: #c语言遗传算法源代码