Page 29 - 《软件学报》2021年第11期
P. 29

陶传奇  等:编程现场上下文深度感知的代码行推荐                                                        3355


                    通过将源代码文件解析成抽象语法树(AST),我们可以检测一个 java 方法块是否具有对其他自定义方法的
                 调用,即方法块功能原子性指标验证.通过不同维度的数据质量评估之后,我们构造了一个大规模的高质量 Java
                 方法块数据集.整个评估流程如图 2 所示.















                                    Fig.2    Flow chart of data quality evaluation for a method block
                                              图 2   开源源码数据质量评估流程图
                 2.2   源数据处理模块

                    训练数据处理模块对收集到的原始训练数据集进行预处理.为了对已经收集到的项目的源代码进行统一
                 化的处理,本文使用 Eclipse 的 JDT 编译器将源码文件解析为抽象语法树(AST).此外,由于部分 jar 包中没有源
                 码,本文使用 jd-jui 反编译工具对 jar 包中 class 文件进行反编译来获得源码.对于 Java 中的 8 种基本数据类型,
                 即 byte、short、int、long、float、double、char 和 boolean,对其变量名和值都进行统一化处理.具体处理规则见
                 表 2.
                                     Table 2    Uniform processing rules for basic data types in Java
                                           表 2   Java 基本数据类型的统一化处理规则
                         数据类型      变量名(统一化)       变量值(统一化)       示例(处理前)          示例(处理后)
                           byte       byte_type       0           byte  b=‘a’;   byte  byte_type=0;
                           short     short_type       −1         short s=100;   short short_type=−1;
                            int       int_type        1            int i=0;       int int_type=1;
                           long       long_type       10         long l=1000;    long long_type=10;
                           float     float_type      −0.1        float f=1000;   float float_type=−0.1;
                          double     double_type      0.1       double d=0.01;  double double_type=0.01;
                           char      char_type        ‘a’         char  c=‘c’;   char  char_type=‘a’;
                          boolean   boolean_type      true      boolean  b=false;  boolean  boolean_type=true;

                    对于非基本数据类型,如同一个类的不同对象,用对应类的类型替换所有的对象类型,直接用类名的小写形
                 式替换不同的对象名.比如 List resultList=new ArrayList(⋅),统一化处理之后为 List list=new ArrayList(⋅).因为 List
                 为非基本数据类型,所以按照规则用类名 List 的小写形式 list 替换原本的用户自定义对象名 resultList.
                    忽略那些不会影响语法结构、开发人员可知的符号,这些符号在代码行被推荐后很容易被补全,不会影响
                 实际的使用,比如代码行结尾的分号和某些大小括号等.该判断是基于部分有丰富 java 经验以及经过实用性验
                 证得到的.在处理完所有数据之后,构建代码段数据集 D 具有规范的统一格式.图 3 表示处理之后的方法块实例.
                 根据程序设计的模块化特点,为了得到关系更加紧密的代码上下文,我们从方法层面构建训练数据集.同时,为
                 了能从功能比较完整的方法块中抽取数据.为了清除无意义的行,忽略只有大括号或者只有注释的行.
   24   25   26   27   28   29   30   31   32   33   34