随着产品需求的不断更迭,为了实现其不断变更的功能,原设计好的代码框架需要不断调整,程序会逐渐偏离原设计的框架,从而难以进行扩展和维护.Fowler[1]定义了22种代码异味,以说明软件系统的质量设计问题.多种代码异味检测方法被提出,Kessentini等人[2]将现有的代码异味检测方法分为7类,即手动方法[3]、基于度量的方法[4]、基于症状的检测方法[5]、基于概率的方法[6]、基于可视化的检测方法[7]、基于搜索的方法[8]和基于协作的方法[2,9].Rasool等人[10]对现有的代码异味检测技术进行了比较和评价,结果出现了同一软件系统检测到的代码异味数量不一致的情况.研究表明3个原因导致其差异性:1)开发人员可以主观地解释现有方法检测到的代码异味[11];2)检测器之间的一致性很低[12];3)大多数检测器都需要指定阈值,以使其能够区分代码异味,并且阈值的选择会极大地影响检测器的性能[13].
为了克服这些限制,机器学习(machine learning, ML)技术被应用于代码异味检测.Fontana等人[14]进行了一项大规模研究,采用32种不同的ML算法及其组合检测4种代码异味即数据类、大类、长方法(long method, LM)和特征依恋,以评估ML技术在代码异味检测中的性能,结果表明大多数分类器的准确性和F-Measure都超过了95%,其中J48和random forest获得了最佳性能.
Fontana等人的方法只考虑了受单个类型气味影响的实例情况,但软件中类或方法通常包含不同类型的代码异味,因此Di Nucci等人[15]合并数据集以模拟更现实的场景,构建了4个包含多种气味实例的数据集,该数据集包含更多无异味的实例,例如,若长方法数据集有异味实例,且同一实例也在特征依恋数据集中,则长方法中的该实例作为无异味实例合并至特征依恋数据集,作者部署了与Fontana等人相同的ML方法,所有模型仅获得了76%的平均准确度,该方法无法检测到有多种类型代码异味的实例.
为了解决此问题,Guggulothu等人[16]将上述长方法和特征依恋数据集合并成多标签数据集,使用5种基于树的单标签分类器实现2种多标签分类方法:多标签分类器链(multi-label classifier chains, MLCC)和标签组合(label combination, LC),检测同一实例的多种代码异味,MLCC在5种分类器上的效果均优于LC,并且随机森林效果最好,平均精度达91%,但该方法没有考虑同一代码元素代码异味检测顺序的影响.
为此,本文结合集成分类器链(ensemble of classifier chains, ECC)[17],提出了一种基于排序损失的ECC多标签代码异味检测方法,该方法适应受多种异味影响的代码元素,将共现的多个代码异味置于同一标签组,其中MLCC可以很好地考虑其相关性[16],而本文考虑代码异味检测顺序也可以在一定程度上模拟代码异味的生存机理,进一步提升检测效果.
本文的主要贡献有3方面:
1) 选取随机森林(random forest, RF)作为基础分类器,实现ECC多标签分类方法.
2) 以排序损失(ranking loss)最小化为目标,采取多次迭代ECC的方法,确定一个较优的标签序列集,优化同一代码元素中代码异味的检测顺序问题.
3) 将9个多标签方法的评价指标应用于实验结果评估,验证所提方法的有效性.
代码异味是一种由糟糕的代码或设计问题而引起的一种软件特征.由表1中代码异味的支持度和置信度可知,长方法-长参数列表和复杂类-消息链频繁共现[18],而消息链-过大类是文献[19]所挖掘的共现代码异味对,所以本文重点考虑这5种代码异味.
1) 长方法(LM).一种代码行数较多的方法,其使用了大量的变量和参数.
2) 长参数列表(long parameter list, LPL).类中至少1个方法的参数数量多于该类所有方法的平均参数数量.
3) 复杂类(complex class, CC).类中至少1个方法有较高的圈复杂度.
4) 消息链(message chain, MC).在不同类对象之间执行一长串的方法调用以实现类功能.
5) 过大类(blob, BL).实现了系统中的多种职责,体积大且复杂,类间的耦合度高.
Table 1 Co-occurrence Between Code Smell: Association Rule
表1 代码异味共现:关联规则
项集1项集2支持度置信度CCMC0.941.0LMLPL0.940.99MCBL
开源系统Argouml 0.26版本[20]是由Java编写的UML建模工具,如图1所示,方法UMLAdd-Dialog的代码行数约为105,参数列表较长,含6个参数,所以该方法同时存在长方法和长参数列表2种异味.
Fig. 1 Code segment of long method and long parameter list
图1 长方法和长参数列表代码段
Fig.2 Code segment of complex class and message chain
图2 复杂类和消息链代码段
本文即是对图1和图2所示的一段代码元素中至少存在2种代码异味的情况进行检测.
源代码度量项可用于衡量软件系统中源代码的设计质量,是代码异味检测中常用的判断依据,其涵盖了代码结构特征的多种质量维度,比如代码规模、复杂性、内聚和耦合等.研究人员可以根据代码异味的特征和定义选择不同的源代码度量项,并通过预设阈值的方式将其组合以确定代码异味的检测方案,如表2所示:
Table 2 Code Smell Detection Rules
表2 代码异味检测规则
代码异味度量项质量维度度量项定义检测方案LMNoI大小指令数量NOI>17[21]LPLPAR复杂性方法中参数数量PAR>5[22]CCCLC复杂性类的复杂度 CLC>28[21]MCNOTI耦合不同对象调用的方法数NOTI>3[23]NoM大小方法数量BLNoA大小属性数量NOM>14且NOA>8.5且LOC>25[21]LoC内聚方法缺乏凝聚力
传统的监督学习是由特征空间x∈Rm×d得到标签空间y∈{0,1}m×1的映射f:x→y,即根据实例x得到对应的预测标签y,其基本假设是每个实例仅属于1个类别标签.而多标签分类是一个实例与多个标签相关联的监督学习问题[24],假定x∈Rm×d是包含m个实例的d维特征空间,y∈{0,1}m×l=(y1,y2,…,yl)是包含m个实例的l维标签空间,其任务是由多标签数据集D得到映射f:x→y,其中,xi是d维的特征向量(xi1,xi2,…,xid),且yi是与xi关联的一组标签(yi1,yi2,…,yil),即第i个实例被分类到l个类别标签.
本文使用文献[25]的数据集,选择其中5种代码异味,构造3个多标签数据集(multi-label dataset, MLD),即长方法和长参数列表(LM-LPL)、复杂类和消息链(CC-MC)以及消息链和过大类(MC-BL),多标签数据集对应的基本架构如图3所示,将开源系统的类名作为每个实例的唯一标识,每个MLD均包含61个源代码度量项,即特征向量xi=R61,对应的特征依次为(LOC,NOP,…,WMC),3个MLD的标签分别为(LM,LPL),(CC,MC),(MC,BL).
Fig. 3 Schema of the multi-label dataset
图3 多标签数据集架构
MLCC是常见的多标签分类方法,对于标签空间y=(y1,y2,…,yl),算法分配l个分类器h1,h2,…,hl,并且每个分类器的特征向量用之前分类器的0
1标签进行扩展,即对于分类器hj:
训练阶段的特征向量为
xi=(xi,yi1,yi2,…,yi(j-1));
(1)
预测阶段的特征向量为
![]()
(2)
其中,
是MLCC分类器hj对第i个实例的预测值.
ECC是MLCC的集成,其训练n个MLCC,对于l个标签,每个MLCC随机生成标签顺序,最终,ECC生成1个置信输出向量Wi=(wi1,wi2,…,wil),其中wij是第i个实例的第j个标签的置信输出值,即每个标签在多个MLCC上的平均预测值,公式为
(3)
其中,
表示第k个分类器对第i个实例的第j个标签的预测值.
最终预测标签值为
y′=ft=0.5(W),
(4)
其中,ft=0.5(·)是阈值函数;W=(W1,W2,…,Wm)T;最终预测值为
且i∈{1,2,…,m},j∈{1,2,…,l},当wij≥0.5时
否则![]()
本文针对同一代码元素同时存在多种代码异味的情况,提出了一种基于排序损失的ECC多标签代码异味检测方法,如图4所示.
1) 数据集预处理.最小-最大归一化,将x中的数据以特征列的方式映射到0~1范围,以消除度量项数值不在同一数量级别对结果的影响,其公式为
![]()
(5)
2) 多标签代码异味检测方法.选取RF作为分类器,以排序损失最小化为目标,通过10折交叉验证,实现基于排序损失的ECC多标签代码异味检测方法.
3) 实验评估.采用基于实例和基于标签的9个评价指标对本文提出的方法进行有效性评估.
Fig. 4 Overview of ECC multi-label code smell detection based on ranking loss
图4 基于排序损失的ECC多标签代码异味检测方法概图
多标签分类中,由于每个分类器的特征向量需要用之前分类器的0
1标签进行扩展,所以标签的检测顺序极其重要,即同一代码元素中多种代码异味的检测顺序,而文献[16]采用的MLCC并未考虑此问题,ECC虽然能在一定程度上减少标签顺序对多标签分类的影响,但ECC中每个MLCC的标签顺序是随机生成的,预测结果会随着标签顺序不同而存在偶然性.对此,本文采用排序损失来评估多标签分类中预测值与真实值的不一致程度,并以其最小化为目标获得较优的标签序列集,Zhang等人[24]将排序损失定义为:
给定标签空间y∈{0,1}m×l,置信输出c∈Rm×l,其计算公式为
rloss(y,c)=![]()
(6)
其中,m是实例数,l是标签数,|·|是集合中元素个数,
是向量中非零元素个数.
本文结合ECC的步骤与排序损失给出了多标签代码异味检测方法,如图5所示.首先,由10折交叉验证获得训练集和测试集.然后,在训练阶段采用RF实现MLCC算法,由训练的多个MLCC计算得到均值,即ECC的排序损失,多次迭代ECC,获取ECC最小排序损失对应的较优标签序列集以及分类器.最后,在预测阶段利用训练好的分类器按照标签序列集中的标签顺序进行预测,得到置信输出W,将其与阈值函数ft=0.5(W)比较得到0
1预测值.
Fig. 5 ECC multi-label code smell detection flow based on ranking loss
图5 基于排序损失的ECC多标签代码异味检测流程
本文基于ECC算法,在训练阶段增加了排序损失,优化同一代码元素多种代码异味检测顺序问题,具体的代码异味检测方法如算法1所示:
算法1. RF实现基于排序损失的ECC多标签代码异味检测算法.
输入:数据集D={(x,y)}、ECC迭代次数NECC、ECC训练的MLCC数量NMLCC;
输出:预测标签值y′.
训练阶段:获取最优标签序列集以及分类器.
① xtrain,xtest,ytrain,ytest←D;
*10折交叉验证*
② 初始化空列表R,Lclf,Lorder;
③ for each i do
*0≤i≤NECC*
④ 初始化空列表RMLCC,Lchain;
⑤ for each j do
*0≤j≤NMLCC*
⑥ 随机生成标签序列L;
⑦ RF实现MLCC算法,根据生成的L,获得对应分类器hj和预测值ypred;
⑧ RMLCC←getRankingLoss(ytrain,ypred);
*计算MLCC排序损失*
⑨ Lchain←hj;
⑩ end for
Lclf←Lchain,Lorder←L;
*将训练好的MLCC以及标签序列分别放入列表Lclf和Lorder*
RECC=RMLCC.mean();
*计算每次迭代时ECC排序损失*
R←RECC;
*多次迭代时ECC排序损失*
end for
I=min(R).index();
*获取ECC最小排序损失的索引*
根据最小排序损失索引I,分别从Lclf和Lorder获取最优标签序列集Lbestorder及对应分类器Lbestclf.
预测阶段:根据最优标签序列集及训练好的分类器进行预测.
① 置信输出W;
② for each Lorder do
③ 获取标签序列Lorder对应训练好的MLCC分类器h;
④ 根据依次获取的分类器h和标签序列Lorder得到MLCC预测值![]()
⑤ W
根据式(3)由MLCC预测值得到ECC置信输出值*
⑥ end for
⑦ y′←ft=0.5(W).
*由置信输出得到最终预测值y′*
为了验证基于排序损失的ECC多标签代码异味检测方法的有效性,本文寻求6个问题的解答.
1) Q1. 多标签数据集LM-LPL和CC-MC在设定不同的代码异味检测顺序时,即标签分别为(LM,LPL),(LPL,LM),(CC,MC),(MC,CC),(MC,BL),(BL,MC)时,代码异味检测效果如何变化?
2) Q2. 本文所提方法通过多次迭代ECC的方法优化标签顺序,其代码异味检测效果与ECC迭代次数有何关系?
3) Q3. 与其他多标签代码异味检测方法相比,本文提出的基于排序损失的ECC多标签代码异味检测方法是否更具有效性?
4) Q4. 利用其他分类器替代RF,能否进一步提升代码异味检测效果?
5) Q5. 相较于单独类型的代码异味检测,采用多标签代码异味检测方法时代码异味检测效果如何?
6) Q6. 对于多标签集中代码异味较多的情况本文提出的方法是否同样适用?
本文基于PyCharm软件环境,采用10次10折交叉验证的方法,设计了6个实验.
实验1. 采用RF实现文献[16]的多标签分类方法,比较其在代码异味不同检测顺序下的子集准确率、宏F1和微F1,验证本文考虑标签顺序的合理性.
实验2. 比较本文所提方法在ECC不同迭代次数的子集准确率、宏F1和微F1,分析指标值与ECC迭代次数的变化关系.
实验3. 将基于排序损失的ECC多标签代码异味检测方法与文献[16]的多标签分类方法对比,验证本文所提方法的有效性.
实验4. 在本文提出的多标签方法架构下,选择代码异味检测效果较好的2种基于树的分类器,比较其在同一数据集上的代码异味检测效果,验证本文所选分类器的有效性.
实验5. 在本文提出的多标签方法架构下,采用RF,CART,C4.5这3种分类器实现多标签方法,计算每种代码异味的查准率、查全率和F1,并与同样的分类器直接对单个代码异味的检测进行比较,验证多标签方法下代码异味检测效果的有效性.
实验6. 对代码异味的共现研究中,一段代码元素大多同时受2种或3种代码异味影响[19],所以本文通过构造多标签数据集复杂类-消息链-过大类(CC-MC-BL),对单个多标签集中存在3种代码异味的情况进行检测,验证本文方法在多标签数据集中代码异味较多的情况下的有效性.
实验将在LM-LPL,CC-MC,MC-BL这3个多标签数据集上对本文提出的方法进行评估,数据集涉及4个开源系统,分别为Argouml,Eclipse,Mylyn,Rhino,其中,类的数量(NOC)和代码行数(LOC)等信息如表3所示:
Table 3 Projects for Experiment
表3 实验所涉项目
项目名称项目所属领域项目版本NOCLOCArgoUML数据可视化V0.261841316971Eclipse集成开发环境V3.3.1171673756164Mylyn工具V3.1.12762276401Rhino解释器V1.627079406
表4分别为多标签数据集LM-LPL,CC-MC,MC-BL同时受2种代码异味影响的实例数分布情况,其中无异味(No)和异味(Yes)的具体实例数分布具体如下:
Table 4 Code Smell Distribution of Multi-label Dataset
表4 多标签数据集代码异味分布
LMLPL实例数实例数占总实例数的比例∕%NoNo454357.59NoYes4585.80YesNo187323.74YesYes101512.87
Continued (Table 4)
CCMC实例数实例数占总实例数的比例∕%NoNo622678.92NoYes85710.86YesNo4155.26YesYes3914.96MCBL实例数实例数占总实例数的比例∕%NoNo598575.86NoYes6568.32YesNo97112.31YesYes2773.51
本文选取9个多标签方法评价指标[24]对实验进行评估,其中,基于实例的评价指标共3个,基于标签的评价指标共6个.
3.3.1 基于实例的评价指标
基于实例的评价指标是对每个实例的预测结果进行评估,相关指标如下.
1) 汉明损失.分类错误的标签个数比率.
(7)
其中,m是实例数,
是第i个实例的预测标签值,yi是第i个实例的真实标签值,Δ表示异或关系.
2) 准确率.预测标签与真实标签Jaccard相似系数均值.
(8)
3) 子集准确率.预测标签和真实标签一致的比率.
(9)
其中,≡表示预测标签与真实标签完全匹配;[[*]]表示*成立时为1,否则为0.
3.3.2 基于标签的评价指标
基于标签的评价指标是对单个标签在所有实例上表现的评价,其中宏指标是分别计算每个标签的查准率和查全率后的均值,公式如下.
1) 宏查准率:
(10)
2) 宏查全率:
(11)
3) 宏F1. 假定每个标签的权重相等,反映所有标签的平均分类效果[26].
![]()
(12)
微指标首先计算所有标签的TP(真正例)、FP(假正例)、TN(真反例)、FN(假反例)的均值,由此得出各个指标的公式如下.
1) 微查准率:

(13)
2) 微查全率:
(14)
3) 微F1. 假定每个实例的权重相等,强调所有标签中某一类别密度的重要性[26].
![]()
(15)
根据实验结果,可逐一回答问题Q1~Q6.
1) Q1. 图6分别为多标签数据集LM-LPL,CC-MC,MC-BL在设定不同的标签顺序时代码异味的检测情况.图6表明,数据集的标签顺序不同时,代码异味检测结果不一致,其中,数据集标签顺序分别为(LPL,LM),(MC,CC),(MC,BL)时,效果较优,说明本文考虑代码异味检测顺序的合理性.
2) Q2. 本文采取多次迭代ECC的方法优化代码异味检测顺序问题,如图7所示.可以看出,代码异味检测效果开始呈上升趋势,当ECC迭代次数为1时,代码异味检测效果与文献[16]方法基本一致,6次迭代后,子集准确率、宏F1和微F1趋于平缓,本文综合考虑检测效果以及时间复杂度,接下来实验的结果均建立于ECC迭代次数为8的基础上.
Fig. 6 Code smell detection results with different label order
图6 代码异味不同检测顺序的结果
3) Q3. 从表5可以看出,所提方法在优化了标签顺序对代码异味检测的影响后,9个多标签评价指标均有提升,其中,F1值最高提升了32.99%,因此基于排序损失的ECC多标签代码异味检测方法更有效.另外,同一方法下多标签数据集LM-LPL的F1值最高,而MC-BL的F1值最低.
4) Q4. 由表6可以看出,在本文提出的多标签方法框架下,RF在LM-LPL,CC-MC,MC-BL的代码异味检测效果均高于CART和C4.5算法,宏F1和微F1值分别高出了0.41%~1.84%和1.21%~2.43%,因此采用RF实现多标签代码异味检测方法效果更好.3个多标签数据集中,MC-BL的F1值最低,另外, C4.5相比于CART有略微的优势,F1值最高提升了1.43%.
5) Q5. 由表7可以看出,单标签分类时,5种代码异味中,LPL在采用C4.5检测时F1值最高,且效果优于RF和CART,BL的F1值最低.在本文提出的多标签方法框架下,相同分类器下每种代码异味的F1值均高于单独类型的代码异味检测结果,所以本文提出的方法在考虑代码异味间的相关性及检测顺序后,单个代码异味的检测效果有很大提升.
6) Q6. 表8为单个多标签数据集中存在3种代码异味情况的检测结果,由表8可以看出,在本文提出的多标签方法框架下,RF的F1值均高于CART和C4.5算法,虽然相较于表6对于单个标签集中存在2种代码异味的情况,检测效果略低,但F1值与MC-BL接近,因此本文提出的多标签代码异味检测方法适用于单个多标签集中代码异味较多的情况.
Fig. 7 Code smell detection results with different iterations
图7 不同迭代次数的代码异味检测结果
Table 5 Comparison of Code Smell Detection Results
表5 代码异味检测结果比较
评价指标LM-LPLCC-MCMC-BL文献[16]本文方法文献[16]本文方法文献[16]本文方法Hloss0.08470.01530.05980.01070.08640.0169Accuracy0.87150.97710.89740.98200.84700.9703SubsetAccuracy0.85120.97400.88590.97950.83390.9687MacroPrecision0.88800.97840.82740.97360.82040.9743MacroRecall0.81150.96450.71990.94800.47540.8919MacroF0.84460.97060.76440.96020.59450.9244MicroPrecision0.86330.97460.82510.97280.82070.9740MicroRecall0.82690.96870.68730.94360.49130.8949MicroF0.84460.97160.74970.95760.61390.9277
Table 6 Code Smell Detection Results with Different Classifiers
表6 不同分类器的代码异味检测结果
评价指标LM-LPLCC-MCMC-BLRFCARTC4.5RFCARTC4.5RFCARTC4.5Hloss0.01530.02860.02190.01070.01610.01410.01690.02450.0235Accuracy0.97710.95600.96440.98200.97280.97550.97030.95730.9604SubsetAccuracy0.97400.95040.96010.97950.96990.97280.96870.95510.9582MacroPrecision0.97840.95410.96650.97360.94090.94580.97430.90340.9132MacroRecall0.96450.95050.96680.94800.94670.95570.89190.91220.9118MacroF0.97060.95220.96650.96020.94350.95060.92440.90730.9123MicroPrecision0.97460.94830.95860.97280.93590.94120.97400.90510.9160MicroRecall0.96870.94640.96170.94360.94310.95010.89490.91430.9125MicroF0.97160.94730.96010.95760.93930.94550.92770.90920.9142
Table 7 Single Code Smell Detection Results
表7 单个代码异味检测结果
分类方法代码异味RFCARTC4.5PrecisionRecallF1PrecisionRecallF1PrecisionRecallF1LM0.81790.85130.83400.77140.77680.77380.78760.79550.7912LPL0.94440.73370.82520.93400.91960.92660.96010.96520.9625单标签分类CC0.86860.85760.86200.82780.81530.82050.83300.82580.8288MC0.80960.58510.67850.61630.64890.63130.63320.64580.6384BL0.80730.39940.53190.43890.47200.45300.43840.47900.4545LM0.96350.97650.96970.93480.93510.93490.94930.94960.9494LPL0.99320.95140.97160.97340.96580.96960.98360.98400.9838多标签分类CC0.97190.98120.97650.96560.96620.96580.96760.97730.9724MC0.97530.91480.94410.91610.92710.92160.92400.93410.9290BL0.97540.87100.90980.89300.89450.89340.89520.90870.9017
Table 8 Detection Results of Multi-label Dataset CC-MC-BL
表8 多标签数据集CC-MC-BL的检测结果
评价指标RFCARTC4.5Hloss0.01910.02850.0259Accuracy0.95600.93570.9390SubsetAccuracy0.95010.92640.9316MacroPrecision0.95600.88810.8991MacroRecall0.89330.90010.9059MacroF0.91870.89370.9022MicroPrecision0.95460.88330.8968MicroRecall0.88900.89770.9033MicroF 0.91860.89030.8999
多标签代码异味检测方法适应受多种异味影响的代码元素,可以识别出遭遇更多与代码异味相关设计问题的关键代码元素,将高共现的多个代码异味视为1个标签组,更好地考虑其相关性.本文提出的基于排序损失的ECC多标签代码异味检测方法,选取随机森林作为分类器,以排序损失最小化为目标,采取多次迭代ECC的方法,确定一个最优的标签序列集,优化代码异味检测顺序问题,模拟代码异味生成机理,检测多种代码异味是否同时存在一段代码元素中.但是本文提出的方法时间代价大,并且主要考虑一段代码元素同时存在2种代码异味的情况,在未来研究中可以扩大多标签数据集以检测更多方法级或类级的代码异味,进一步分析深度学习和多标签方法结合下的代码异味检测效果[27].
[1]Fowler M. Refactoring Improving the Design of Existing Code[M]. Translated by Xiong Jie. 1st ed. Beijing: Posts & Telecom Press, 2010 (in Chinese)(Fowler M. 重构改善既有代码的设计[M]. 熊节, 译. 1版. 北京: 人民邮电出版社, 2010)
[2]Kessentini W, Kessentini M, Sahraoui H, et al. A cooperative parallel search-based software engineering approach for code-smells detection[J]. IEEE Transactions on Software Engineering, 2014, 40(9): 841-861
[3]Travassos G, Shull F, Fredericks M, et al. Detecting defects in object-oriented designs: Using reading techniques to increase software quality[J]. ACM SIGPLAN Notices, 1999, 34(10): 47-56
[4]Rani A, Kaur H. Detection of bad smells in source code according to their object oriented metrics[J]. International Journal for Technological Research in Engineering, 2014, 1(10): 1211-1214
[5]Moha N, Gueheneuc Y G, Duchien L, et al. Decor: A method for the specification and detection of code and design smells[J]. IEEE Transactions on Software Engineering, 2009, 36(1): 20-36
[6]Khomh F, Vaucher S, Guéhéneuc Y G, et al. A Bayesian approach for the detection of code and design smells[C] 
Proc of the 9th Int Conf on Quality Software. Los Alamitos, CA: IEEE Computer Society, 2009: 305-314
[7]Murphy-Hill E, Black A P. An interactive ambient visualization for code smells[C] 
Proc of the 5th Int Symp on Software Visualization. New York: ACM, 2010: 5-14
[8]Palomba F, Bavota G, Di Penta M, et al. Mining version histories for detecting code smells[J]. IEEE Transactions on Software Engineering, 2014, 41(5): 462-489
[9]Arcuri A, Yao Xin. A novel co-evolutionary approach to automatic software bug fixing[C] 
Proc of IEEE Congress on Evolutionary Computation. Piscataway, NJ: IEEE, 2008: 162-168
[10]Rasool G, Arshad Z. A review of code smell mining techniques[J]. Journal of Software: Evolution and Process, 2015, 27(11): 867-895
[11]Fontana F A, Dietrich J, Walter B, et al. Antipattern and code smell false positives: Preliminary conceptualization and classification[C] 
Proc of the 23rd IEEE Int Conf on Software Analysis, Evolution, and Reengineering. Los Alamitos, CA: IEEE Computer Society, 2016: 609-613
[12]Fontana F A, Braione P, Zanoni M. Automatic detection of bad smells in code: An experimental assessment[J]. Journal of Object Technology, 2012, 11(2): 1-38
[13]Fernandes E, Oliveira J, Vale G, et al. A review-based comparative study of bad smell detection tools[C] 
Proc of the 20th Int Conf on Evaluation and Assessment in Software Engineering. New York: ACM, 2016: 1-12
[14]Fontana F A, Mäntylä M V, Zanoni M, et al. Comparing and experimenting machine learning techniques for code smell detection[J]. Empirical Software Engineering, 2016, 21(3): 1143-1191
[15]Di Nucci D, Palomba F, Tamburri D A, et al. Detecting code smells using machine learning techniques: Are we there yet[C] 
Proc of the 25th IEEE Int Conf on Software Analysis, Evolution and Reengineering. Los Alamitos, CA: IEEE Computer Society, 2018: 612-621
[16]Guggulothu T, Moiz S A. Code smell detection using multilabel classification approach[J]. arXiv preprint, arXiv:1902.03222, 2019
[17]Read J, Pfahringer B, Holmes G, et al. Classifier chains for multi-label classification[J]. Machine Learning, 2011, 85(3): 333-359
[18]Palomba F, Oliveto R, De Lucia A. Investigating code smell co-occurrences using association rule learning: A replicated study[C] 
Proc of the 25th IEEE Workshop on Machine Learning Techniques for Software Quality Evaluation. Los Alamitos, CA: IEEE Computer Society, 2017: 8-13
[19]Palomba F, Bavota G, Penta M D, et al. A large-scale empirical study on the lifecycle of code smell co-occurrences[J]. Information & Software Technology, 2018, 99: 1-10
[20]Tigris. Argouml, Version 0.26: Open source system[EB
OL]. 2008 [2019-11-08]. http:
argouml-downloads.tigris.org
argouml-0.26
[21]Rubin J, Henniche A N, Moha N, et al. Sniffing Android code smells: An association rules mining-based approach[C] 
Proc of the 6th IEEE
ACM Int Conf on Mobile Software Engineering and Systems. Piscataway, NJ: IEEE, 2019: 123-127
[22]Danphitsanuphan P, Suwantada T. Code smell detecting tool and code smell-structure bug relationship[C] 
Proc of the Spring Congress on Engineering and Technology. Piscataway, NJ: IEEE, 2012: 1-5
[23]Bowes D, Randall D, Hall T. The inconsistent measurement of message chains[C] 
Proc of the 4th Int Workshop on Emerging Trends in Software Metrics. Los Alamitos, CA: IEEE Computer Society, 2013: 62-68
[24]Zhang Minling, Zhou Zhihua. A review on multi-label learning algorithms[J]. IEEE Transactions on Knowledge and Data Engineering, 2014, 26(8): 1819-1837
[25]Amorim L, Costa E, Antunes N, et al. Experience report: Evaluating the effectiveness of decision trees for detecting code smells[C] 
Proc of the 26th IEEE Int Symp on Software Reliability Engineering. Los Alamitos, CA: IEEE Computer Society, 2015: 261-269
[26]Gibaja E, Ventura S. A tutorial on multilabel learning[J]. ACM Computing Surveys, 2015, 47(3): 497-534
[27]Song Pan, Jing Liping. Exploiting label relationships in multi-label classification with neural networks[J]. Journal of Computer Research and Development, 2018, 55(8): 1751-1759 (in Chinese)(宋攀, 景丽萍. 基于神经网络探究标签依赖关系的多标签分类[J]. 计算机研究与发展, 2018, 55(8): 1751-1759)
Wang Jina, born in 1994. Master candidate. Her main research insterests include code smell, software refactoring and machine learning.
王继娜,1994年生.硕士研究生.主要研究方向为代码异味、软件重构和机器学习.
Chen Junhua, born in 1968. Master, associate professor. His main research interests include database theory and application, distributed database and big data.(chenjh@shnu.edu.cn)
陈军华,1968年生.硕士,副教授.主要研究方向为数据库理论与应用、分布式数据库和大数据.
Gao Jianhua, born in 1963. PhD, professor. Senior member of CCF. His main research interests include software refactoring, software testing, trustworthy software and reliability model design.
高建华,1963年生.博士,教授,CCF高级会员.主要研究方向为软件重构、软件测试、可信软件和可靠性模型设计.