论文笔记-Deep Learning Based Code Smell Detection (1)
Deep Learning Based Code Smell Detection
基于深度学习的代码异味检测
Hui Liu, Jiahao Jin, Zhifeng Xu, Yanzhen Zou, Yifan Bu and Lu Zhang
摘要
现有的检测代码坏味来进行软件重构的方法大多数都是基于手动选择的源代码指标映射到预测中,本文提出基于深度学习的方法来检测代码异味,提出一种自动方法来生成带有标记的训练数据,应用于四种代码异味:特征嫉妒、长方法、过大类、错位类。
1、介绍
软件重构的关键步骤之一是确定重构的位置,代码气味就是为了确定重构位置而提出的概念。现有的识别代码坏味的方法大多都是自动或半自动方法来检测不同类型的代码坏味,依赖于手动设计的方法将手动定义的 代码度量映射到识别中,以判断异味或无异味(二分类问题)。为了避免手动设计的启发式算法,传统的统计机器学习方法(SVM、朴素贝叶斯、LDA)被用于构建代码度量指标用于预测代码是否有异味,但存在一定的局限性。本文提出一种基于深度学习的方法来检测代码异味,自动从源码中选择有用的特征进行代码异味检测,在这些特征和标签(0或1,有无异味)之间建立复杂的映射。
提出一种自动生成标记训练数据的方法。直接从高质量开源应用程序中提取类生成负样本(无异味的软件实体),设计某种方式对代码进行重构来生成正样本(有异味实体)。针对不同的代码坏味要设计不同的方法来构建相应的正样本。
例如:针对特征嫉妒这一代码坏味,通过随机移动某个类的方法到可以通过移动方法重构来移动的其他类来创建特征嫉妒气味。
创建代码异味的重构被称为异味引入重构,保留了软件的外部行为,可以有IDE自动执行。
提出的方法在四种常见的代码坏味上进行评估:特征嫉妒、长方法、大类、错位类。
特征嫉妒:A类对B类比自己所在类更感兴趣。应将A类的功能写进B类,删除A
长方法:应将冗长的方法分解为多个较短的方法。长方法并不等于高LOC,行数多但代码结构清晰且高内聚的方法不需分解
过大类:冗长且低内聚的类,应分解为多个类
错位类:分布不正确的类,应移动到它所属的包中。
评估分为两部分:1、在10个具有自动注入代码气味的知名开源应用程序上评估所提到的方法
2、在五个开源应用程序上评估所提出的方法,三个独立开发人员手动验证检测到的示实例将它们分类为真假阳性
主要贡献:
1、扩展了《Deep Learning Based Feature Envy Detection》文中的特征嫉妒的检测方法,应用于多种代码坏味
2、聚合神经网络的分类算法,从给定的数据集中同时生成多个引导样本,并训练多个二元分类器,这些二元分类器一次投票确定最终分类。结果表明提高了分类性能。
2、相关工作
特征嫉妒的检测
特征嫉妒:一个类对另一个类比它实际所在的类更感兴趣,应该通过移动方法进行重构,将放错位置的方法移动到真正感兴趣的类中。
目前的大多数方法和工具都是推荐重构而不是检测需要重构的位置。
长方法的检测
主要使用代码度量,例如圈复杂度、最大嵌套级别、访问变量数
过大类的检测
过大类是指做的太多且包含太多代码的类,类中方法的数量和属性的数量经常用于识别过大类
错位类的检测
错位类是指某个类在不属于它的包中。
3、方法
3.1 方法概述
提出一种基于深度学习的方法来识别代码异味
方法概述:基于大量的软件程序来生成大量带标签的训练样本
3.2 训练数据生成
创建正样本
第一步:在程序中找到重构的机会(Lopp)。比如为了创建特征嫉妒的气味,要找到可以通过move方法重构移动的方法;为了创建长方法气味,通过内联方法重构;为了创建过大类气味,找到可以合并的类;为了创建错位类气味,通过移动类来重构。
第二步:在Lopp中选择一个记为Sopp,并应用相应的重构。比如一个良好的软件,对于不需要进行move()的类做一个move方法,就会创建一个特征嫉妒的代码气味。
第三步:撤销重构操作,从Lopp中移除选定的重构机会Sopp,然后转到第二步,当不再需要正样本或者无法生成正样本的时候,也就是Lopp为空的时候,正样本数据的创建停止。
创建负样本
第一步:在程序中找到软件实体(方法或类,记为Lse),特征嫉妒和长方法的粒度为方法,过大类和错位类的粒度为类
第二步:在Lse中随机选择一个实体,记为e,即为负样本
第三步:在Lse中删除e,转到第二步,当不需要负样本或Lse为空时,不再创建负样本数据
降低数据噪声
1、只选择高质量的主题应用程序进行数据生成
2、即使训练数据包含一些错误标记的项目,高级神经网络也能较好工作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)