Mémoire de maîtrise (2025)
|
Libre accès au plein texte de ce document Conditions d'utilisation: Tous droits réservés Télécharger (851kB) |
Résumé
La refactorisation du code est une pratique essentielle en génie logiciel qui consiste à restructurer du code existant pour améliorer sa structure interne, sa lisibilité et sa maintenabilité, sans altérer son comportement ou ses fonctionnalités externes. L’objectif principal est d’améliorer la qualité du code, de réduire sa complexité et de faciliter les modifications futures, rendant ainsi le code plus efficace et évolutif au fil du temps. Toutefois, malgré son rôle crucial dans l’assurance de la qualité et de la maintenabilité à long terme du code, le processus de refactorisation est souvent négligé par les développeurs. Ce phénomène est principalement causé par la nature chronophage de cette pratique, ainsi que par ses importantes exigences en termes d’efforts et de ressources, ce qui en fait souvent une tâche difficile et de faible priorité dans des contextes de cycles de développement rapides. Même si de nombreux outils automatisés, comme des plugins dans les environnements de développement intégrés (IDE, de l’anglais Integrated Development Environments), ont émergé au cours des dernières années pour alléger une partie de la charge de travail, ces outils sont souvent limités dans leur capacité à traiter une large gamme de types de refactorisation. En effet, ils se concentrent généralement uniquement sur des refactorisations simples et couramment utilisées. L’émergence des grands modèles de langage (LLMs, de l’anglais Large Language Models) ces dernières années a suscité un intérêt considérable dans le domaine du génie logiciel, notamment en raison de leurs capacités avancées à résoudre des problèmes. Ces modèles ont déjà été utilisés pour évaluer la qualité du code, ainsi que pour effectuer des réparations automatisées du code. Dans ce mémoire, nous étendons l’application des LLMs au domaine de la refactorisation du code, en étudiant leur capacité à effectuer des tâches de refactorisation. Pour atteindre cet objectif, ce mémoire est divisé en deux sous-objectifs. Dans le premier objectif, nous étudions l’efficacité des LLMs dans l’application d’une large gamme de types de refactorisation. Dans le deuxième objectif, nous examinons comment différents niveaux de contexte influencent la capacité des LLMs à effectuer des tâches de refactorisation. Nous commençons par extraire des informations clés provenant du catalogue de refactorisation de Martin Fowler, telles que les noms des types de refactorisation, ainsi que les instructions détaillées pour les appliquer, afin de concevoir et d’évaluer la performance de cinq types de requêtes différentes (Basées sur aucun exemple, Basées sur deux exemples, Contextuelles, Basées sur des instructions et Basées sur une règle) pour effectuer 61 types de refactorisation vi en utilisant GPT-4o-mini, ainsi que DeepSeek-V3. Pour garantir une évaluation complète, nous utilisons deux ensembles de données : les exemples contenus dans le catalogue de Martin Fowler et des projets GitHub, qui couvrent une large variété de types de refactorisation et des extraits de code réels. Nous évaluons la performance des LLMs dans ces tâches de refactorisation à travers l’évaluation de la préservation sémantique, ainsi que de divers indicateurs de qualité du code, afin d’évaluer l’efficacité de ces différents types de requêtes. Nos résultats suggèrent que, bien que les instructions détaillées soient généralement plus intuitives pour les humains dans le cadre de tâches de génie logiciel telles que la refactorisation, les requêtes formulées selon des règles surpassent les autres types de requêtes, y compris celles basées sur les instructions, lorsqu’elles sont utilisées avec le modèle GPT-4o-mini. De plus, DeepSeek a montré une performance supérieure en présence d’une quantité réduite d’informations contextuelles, alors que les requêtes basées sur le contexte et celles ne comportant aucun exemple ont montré de meilleurs résultats comparativement aux autres types de requêtes.
Abstract
Code refactoring is a fundamental practice in software engineering that involves restructuring existing code to improve its internal structure, readability, and maintainability, without altering its external behavior or functionality. The primary goal is to enhance code quality, reduce complexity, and facilitate future modifications, making software more efficient and adaptable over time. However, despite its critical role in ensuring long-term code quality and maintainability, the refactoring process is often neglected by developers. This is primarily due to the substantial time, effort, and resources it demands, often making it a challenging and low-priority task in fast-paced development cycles. While numerous automated tools, including plugins in Integrated Development Environments (IDEs), have emerged in recent years to alleviate some of the workload, they are often limited in their ability to address a wide range of refactoring types, typically focusing only on more basic and commonly used refactorings. The emergence of Large Language Models (LLMs) in recent years has sparked significant interest in the field of software engineering, particularly due to their advanced problemsolving capabilities. These models have already been utilized to assess code quality and perform automated code repairs. In this thesis, we extend the application of LLMs to the domain of code refactoring, investigating their effectiveness in handling a broad range of refactoring tasks. To accomplish this objective, the thesis is structured around two subobjectives. In the first objective, we investigate the effectiveness of LLMs in applying a wide range of refactoring types. In the second objective, we examine how varying levels of context influence the ability of LLMs to perform refactoring tasks. We start by extracting key insights from Martin Fowler’s catalog of refactorings, such as refactoring names and associated step-by-step instructions, to design and evaluate the performance of five distinct prompt types (Zero-shot, Two-shot, Context-based, Instruction-based, and Rule-based) in performing 61 refactoring types using GPT-4o-mini and DeepSeek-V3. To ensure a comprehensive evaluation, we utilize two datasets—Martin Fowler’s catalog and GitHub projects—that encompass a wide variety of refactoring types and real-world code snippets. We assess the performance of LLMs in refactoring tasks by evaluating semantic preservation post-refactoring, along with various code quality metrics, to gauge the effectiveness of different prompts. viii Our findings suggest that, while step-by-step instructions tend to be more intuitive for humans in software engineering tasks like refactoring, Rule-based prompts outperform other prompt types, including Instruction-based prompts, when used with GPT-4o-mini. Furthermore, DeepSeek demonstrated superior performance with less contextual information, as the Context-based and Zero-shot prompts yielded greater success.
| Département: | Département de génie informatique et génie logiciel |
|---|---|
| Programme: | GÉNIE INFORMATIQUE |
| Directeurs ou directrices: |
Foutse Khomh |
| URL de PolyPublie: | https://publications.polymtl.ca/65545/ |
| Université/École: | Polytechnique Montréal |
| Date du dépôt: | 20 nov. 2025 12:10 |
| Dernière modification: | 20 nov. 2025 13:37 |
| Citer en APA 7: | Chen Kuang Piao, Y. (2025). Refactoring with LLMs: Insights from Martin Fowler's Catalog [Mémoire de maîtrise, Polytechnique Montréal]. PolyPublie. https://publications.polymtl.ca/65545/ |
|---|---|
Statistiques
Total des téléchargements à partir de PolyPublie
Téléchargements par année
Provenance des téléchargements
