一句话:提出 UTango,用上下文感知的图神经网络学习代码变更嵌入,并监督聚类以自动拆分混合关注点的提交。
软件演化中,开发者提交的 commit 常混合多个关注点,导致程序理解困难并降低关注点分离度。已有确定性自动拆分方法难以指定有效的变更聚类准则。本文提出 UTango,一种基于机器学习的提交拆分方法:它学习代码变更的嵌入表示,并将凝聚聚类改造成可监督的聚类学习模型,通过可训练参数和比较预测簇与正确簇的损失函数进行训练。为支持该聚类模型,作者设计了上下文感知、基于图的代码变更表示学习模型,利用 Label-GCN 生成上下文化嵌入,融合程序依赖与变更周围上下文,并显式表示上下文和克隆代码。在 C# 与 Java 数据集上的实验分别使用 1,612 和 14k 个纠缠提交,结果表明 UTango 相对当前最优提交拆分方法的准确率分别提升 28.6%–462.5% 和 13.3%–100.0%。
During software evolution, developers make several changes and commit them into the repositories. Unfortunately, many of them tangle different purposes, both hampering program comprehension and reducing separation of concerns. Automated approaches with deterministic solutions have been proposed to untangle commits. However, specifying an effective clustering criteria on the changes in a commit for untangling is challenging for those approaches. In this work, we present UTango, a machine learning (ML)-based approach that learns to untangle the changes in a commit. We develop a novel code change clustering learning model that learns to cluster the code changes, represented by the embeddings, into different groups with different concerns. We adapt the agglomerative clustering algorithm into a supervised-learning clustering model operating on the learned code change embeddings via trainable parameters and a loss function in comparing the predicted clusters and the correct ones during training. To facilitate our clustering learning model, we develop a context-aware, graph-based, code change representation learning model, leveraging Label, Graph-based Convolution Network to produce the contextualized embeddings for code changes, that integrates program dependencies and the surrounding contexts of the changes. The contexts and cloned code are also explicitly represented, helping UTango distinguish the concerns. Our empirical evaluation on C# and Java datasets with 1,612 and 14k tangled commits show that it achieves the accuracy of 28.6%– 462.5% and 13.3%–100.0% relatively higher than the state-of-the-art commit-untangling approaches for C# and Java, respectively.