I. Introduction
For object-oriented software development, especially large-scale system, the quality of software design has a great impact on software quality [1]. The software that follows the software design principles tends to have higher scalability, readability, and maintainability [1]. However, in practice, the quality of software design often decreases gradually with the evolution of software [2]. As software evolves, developers often need to make changes to software for fixing bugs and adding new features, which lead to architectural drift and erosion, hence increasing the deviation from the initial design and growing difficulty for system maintenance [3]. To this end, developers often turn to refactor software. Software refactoring aims to improve the internal structure of software, without changing software functions and external behavior, so as to optimize the software design and improve the maintainability of code. Since manual refactoring is time-consuming and error-prone [4], many approaches have been proposed to help developers refactor more efficiently and effectively.