Skip to main content

Modernisation du code hérité avec GitHub Copilot

Copilot Chat aide à moderniser le code hérité en suggérant des refactorisations et en créant des tests pour détecter les problÚmes potentiels.

Remarque

Les réponses décrites dans cet article sont des exemples. Les réponses Copilot Chat ne sont pas déterministes, vous pouvez donc obtenir des réponses différentes de celles affichées ici.

Le code hĂ©ritĂ© est un code ancien, obsolĂšte ou qui n’est plus pris en charge par les dĂ©veloppeurs d’origine. Il peut ĂȘtre difficile Ă  maintenir et Ă  Ă©tendre, car il peut ne pas suivre les meilleures pratiques modernes, telles que l’utilisation de conventions de nommage cohĂ©rentes ou la rĂ©daction d’une documentation claire.

La modernisation du code hĂ©ritĂ© peut vous aider Ă  :

  • AmĂ©liorer l’analyse des performances et la scalabilitĂ©.
  • Faciliter la maintenance et l’extension du code.
  • RĂ©duire le risque d’introduire des bogues lors des modifications.
  • Faciliter les tests du code.

Copilot peut vous aider Ă  moderniser votre code hĂ©ritĂ© en :

  • Fournissant des suggestions pour refactoriser le code afin de suivre les meilleures pratiques modernes.
  • **GĂ©nĂ©rant de la documentation ** pour vous aider Ă  comprendre comment le code fonctionne.
  • **GĂ©nĂ©rant des tests ** pour vous aider Ă  vĂ©rifier que vos modifications n’ont pas introduit de bogues.

Exemple de scénario

Dans cet exemple, nous allons examiner un systÚme de gestion de comptes écrit en COBOL et le moderniser en Node.js. Vous trouverez le code COBOL dans le référentiel modernize-legacy-cobol-app.

Le systĂšme de gestion des comptes comprend trois fichiers clĂ©s :

  • main.cob : le programme principal qui lit les entrĂ©es de l’utilisateur et appelle le sous-programme appropriĂ©.
  • operations.cob : un sous-programme qui effectue des opĂ©rations sur les donnĂ©es du compte, telles que le crĂ©dit, le dĂ©bit et la consultation du solde.
  • data.cob : un sous-programme qui gĂšre le stockage du solde du compte.

Étape 1 : obtenir une copie locale du rĂ©fĂ©rentiel

Avant de compiler et d’exĂ©cuter le programme, vous devez disposer du code localement. Si vous n’avez pas encore clonĂ© le rĂ©fĂ©rentiel, naviguez jusqu’au rĂ©pertoire dans lequel vous souhaitez stocker le projet et exĂ©cutez la commande suivante :

Shell
git clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git

Étape 2 : compiler et exĂ©cuter le programme

Vous pouvez soit installer un compilateur COBOL dans votre environnement de développement préféré (par exemple, le compilateur open source GnuCOBOL), soit utiliser Copilot Chat dans GitHub Codespaces.

Si vous utilisez MacOS, vous pouvez installer GnuCOBOL Ă  l’aide de Homebrew :

Shell
brew install gnu-cobol

Si vous utilisez Codespaces ou un systĂšme Ubuntu Linux, vous pouvez installer GnuCOBOL Ă  l’aide de apt :

Shell
sudo apt-get update && \
sudo apt-get install gnucobol

Pour compiler le code, liez les fichiers et crĂ©ez un exĂ©cutable, exĂ©cutez la commande suivante Ă  partir de la racine du rĂ©fĂ©rentiel :

Shell
cobc -x main.cob operations.cob data.cob -o accountsystem

Pour exĂ©cuter le programme, utilisez la commande suivante :

Shell
./accountsystem

Étape 3 : expliquer les fichiers et le code

La premiÚre étape de la modernisation du code consiste à comprendre son fonctionnement. Vous pouvez demander à Copilot Chat d'expliquer le code dans chaque fichier.

Ouvrez le référentiel dans votre IDE, puis, dans le panneau Copilot Chat, entrez l'invite suivante.

Exemples d’invite 1

/explain #file:main.cob #file:operations.cob #file:data.cob Can you please create a high level overview of the app. It will be great if you can explain each file in detail and how they are linked.

Exemples de réponse 1

Voici un extrait de la rĂ©ponse au prompt ci-dessus :

Sure! Here's a high-level overview of the COBOL application, along with detailed explanations of each file and how they are linked together.

High-Level Overview

This COBOL application simulates an account management system. It allows users to view the current balance, credit the account, debit the account, and exit the application. The application is divided into three main COBOL source files: main.cob, operations.cob, and data.cob. ...

Étape 4 : tracer le flux de donnĂ©es entre les fichiers

L’étape suivante consiste Ă  comprendre comment les fichiers sont liĂ©s. Vous pouvez utiliser @workspace pour crĂ©er un diagramme de flux de donnĂ©es pour l’application.

Remarque

Le participant au chat @workspace dans VS Code et Visual Studio fournit à Copilot le contexte de tout le code de votre espace de travail. Vous pouvez utiliser @workspace lorsque vous souhaitez que Copilot prenne en compte la structure de votre projet et la maniÚre dont les différentes parties de votre code interagissent. Si vous utilisez un IDE JetBrains, utilisez @project plutÎt que @workspace.

Exemple d'invite 2

@workspace can you create a sequence diagram of the app showing the data flow of the app. Please create this in mermaid format so that I can render this in a markdown file.

Copilot gĂ©nĂšre le balisage Mermaid pour un diagramme de sĂ©quence complet qui montre comment l’application fonctionne. Vous pouvez copier et coller ce balisage dans une application Mermaid pour gĂ©nĂ©rer le diagramme.

Étape 5 : gĂ©nĂ©rer un plan de test

CrĂ©ez un plan de test pour vous assurer que l’application fonctionne comme prĂ©vu aprĂšs avoir apportĂ© des modifications. Vous pouvez utiliser @workspace pour gĂ©nĂ©rer un plan de test qui couvre tous les fichiers du projet.

Exemple de prompt 3

@workspace The current Cobol app has no tests. Can you please create a test plan of current business logic that I can use to validate with business stakeholders about the current implementation.

Later I would like to use this test plan to create unit and integration tests in a node.js app. I am in the middle of transforming the current Cobol app to a node.js app.

The test plan should include the following:

1. Test Case ID
2. Test Case Description
3. Pre-conditions
4. Test Steps
5. Expected Result
6. Actual Result
7. Status (Pass/Fail)
8. Comments

Please create the test plan in a markdown table format. The test plan should cover all the business logic in the current Cobol app.

Convert this to markdown syntax to insert as a new file

Copilot gĂ©nĂšre un plan de test au format Markdown que vous pouvez utiliser pour valider l’application. Pour utiliser ce plan plus tard dans le processus, crĂ©ez un fichier appelĂ© TESTPLAN.md et copiez-y le plan suggĂ©rĂ©. Vous pourrez ainsi rĂ©fĂ©rencer le plan de test lors de la gĂ©nĂ©ration des cas de test dans les Ă©tapes suivantes.

Étape 6 : convertir les fichiers de COBOL en Node.js

L’étape suivante consiste Ă  convertir les fichiers COBOL en Node.js. Il est important de garder Ă  l’esprit les pratiques suivantes concernant les prompts :

  • Fournir un contexte
  • Donner des instructions claires
  • Être prĂ©cis sur le rĂ©sultat que vous souhaitez obtenir

Commencez par créer un répertoire temporaire au sein de votre projet, dans lequel vous enregistrerez les fichiers JavaScript que vous allez créer.

Shell
mkdir temp-JS-project-directory

Ensuite, convertissez de maniÚre itérative les fichiers COBOL en Node.js.

Exemple de prompt 4

Can you convert code in #file:main.cob to node.js?

Exemples de rĂ©ponse 4

Sure! Here is the equivalent Node.js code for the main.cob file. This code will simulate the same account management system functionality.

### COBOL Code:

main.cob

```COBOL
IDENTIFICATION DIVISION.
       PROGRAM-ID. MainProgram.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  CONTINUE-FLAG      PIC X VALUE 'Y'.
       01  USER-CHOICE        PIC 9.
       01  FINAL-BALANCE      PIC 9(6)V99 VALUE 1000.00.

       PROCEDURE DIVISION.
           PERFORM UNTIL CONTINUE-FLAG = 'N'
               DISPLAY "1. View Balance"
               DISPLAY "2. Credit Account"
               DISPLAY "3. Debit Account"
               DISPLAY "4. Exit"
               ACCEPT USER-CHOICE

               EVALUATE USER-CHOICE
                   WHEN 1
                       CALL 'Operations' USING 'TOTAL'
                   WHEN 2
                       CALL 'Operations' USING 'CREDIT'
                   WHEN 3
                       CALL 'Operations' USING 'DEBIT'
                   WHEN 4
                       MOVE 'N' TO CONTINUE-FLAG
                       DISPLAY "Exiting the program. Goodbye!"
                   WHEN OTHER
                       DISPLAY "Invalid choice. Please try again."
               END-EVALUATE
           END-PERFORM
           STOP RUN.

### Node.js Code: `main.js`
```javascript
const readline = require('readline');

let continueFlag = 'Y';
let finalBalance = 1000.00;

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

function displayMenu() {
    console.log("1. View Balance");
    console.log("2. Credit Account");
    console.log("3. Debit Account");
    console.log("4. Exit");
}

function handleUserChoice(choice) {
    switch (choice) {
        case '1':
            viewBalance();
            break;
        case '2':
            creditAccount();
            break;
        case '3':
            debitAccount();
            break;
        case '4':
            continueFlag = 'N';
            console.log("Exiting the program. Goodbye!");
            rl.close();
            break;
        default:
            console.log("Invalid choice. Please try again.");
            promptUser();
            break;
    }
}

function viewBalance() {
    console.log(`Current balance: ${finalBalance.toFixed(2)}`);
    promptUser();
}

function creditAccount() {
    rl.question("Enter credit amount: ", (amount) => {
        amount = parseFloat(amount);
        if (!isNaN(amount) && amount > 0) {
            finalBalance += amount;
            console.log(`Amount credited. New balance: ${finalBalance.toFixed(2)}`);
        } else {
            console.log("Invalid amount. Please try again.");
        }
        promptUser();
    });
}

function debitAccount() {
    rl.question("Enter debit amount: ", (amount) => {
        amount = parseFloat(amount);
        if (!isNaN(amount) && amount > 0) {
            if (finalBalance >= amount) {
                finalBalance -= amount;
                console.log(`Amount debited. New balance: ${finalBalance.toFixed(2)}`);
            } else {
                console.log("Insufficient funds for this debit.");
            }
        } else {
            console.log("Invalid amount. Please try again.");
        }
        promptUser();
    });
}

function promptUser() {
    if (continueFlag === 'Y') {
        displayMenu();
        rl.question("Select an option: ", handleUserChoice);
    }
}

promptUser();

This Node.js code replicates the functionality of the COBOL main.cob file, providing a simple command-line interface for viewing the balance, crediting the account, debiting the account, and exiting the application.

Vous devez examiner attentivement le code suggĂ©rĂ© avant de l’utiliser. Une fois que vous ĂȘtes satisfait du code gĂ©nĂ©rĂ©, suivez ces Ă©tapes pour l’enregistrer localement et terminer la conversion :

  1. Dans le répertoire temporaire que vous avez créé précédemment, créez un fichier appelé main.js.
  2. Copiez le code généré dans le panneau Copilot Chat et collez-le dans main.js.
  3. Enregistrez le fichier.
  4. Utilisez des prompts similaires pour convertir operations.cob et data.cob en Node.js.
  5. CrĂ©ez des fichiers JavaScript correspondants, operations.js et data.js, dans le mĂȘme rĂ©pertoire temporaire.
  6. Copiez et collez le code généré dans chaque fichier, puis enregistrez-les.

Une fois que vous avez converti tous les fichiers en Node.js, vous devez les relier et configurer un projet Node.js fonctionnel.

  1. Accédez au répertoire temporaire dans votre terminal.

  2. ExĂ©cutez la commande suivante pour crĂ©er un fichier package.json :

    Shell
    npm init -y
    
  3. Si votre application nĂ©cessite des packages externes, installez-les en exĂ©cutant :

    Shell
    npm install
    
  4. DĂ©marrez l’application en exĂ©cutant :

    Shell
    npm start
    

À ce stade, l’application Node.js peut ne pas rĂ©pliquer entiĂšrement les fonctionnalitĂ©s du programme COBOL d’origine. Par exemple, les soldes peuvent ne pas se mettre Ă  jour correctement ou les calculs peuvent ne pas correspondre Ă  la logique COBOL.

Pour perfectionner l’application, vous devrez :

  • Identifier les comportements incorrects en exĂ©cutant le programme et en le comparant Ă  la version COBOL.

  • Travailler de maniĂšre itĂ©rative avec Copilot pour ajuster la logique jusqu’à ce que le programme Node.js se comporte comme prĂ©vu.

  • Utiliser des prompts ciblĂ©s pour dĂ©boguer et amĂ©liorer des parties spĂ©cifiques du code, telles que :

    @workspace - analyze main.js and ensure account balance updates correctly when crediting an account.

La refactorisation du code hĂ©ritĂ© n’est pas toujours un processus en une seule Ă©tape. Copilot peut vous aider Ă  dĂ©boguer et Ă  amĂ©liorer les fonctionnalitĂ©s Ă  mesure que vous perfectionnez votre nouvelle implĂ©mentation Node.js.

Étape 8 : gĂ©nĂ©rer des tests unitaires et d’intĂ©gration

L’étape suivante consiste Ă  gĂ©nĂ©rer des tests unitaires et d’intĂ©gration pour s’assurer que l’application fonctionne comme prĂ©vu. Vous pouvez utiliser @workspace pour gĂ©nĂ©rer un plan de test qui couvre tous les fichiers du projet.

Exemple de prompt 5

@workspace I would like to create unit and integration tests cases from the test plan mentioned in #file:TESTPLAN.md file The node.js code is in node-accounting-app folder and I am looking to generate tests for #file:operations.js file. Use a popular testing framework and also provide all the dependencies required to run the tests.

Exemples de rĂ©ponse 5

Copilot génÚre un certain nombre de tests dans Jest, une infrastructure de test JavaScript, avec un guide complet, étape par étape, sur la façon de les implémenter et de les exécuter.

Voici un extrait de la rĂ©ponse au prompt ci-dessus :

“This test plan covers the main functionalities of the COBOL application, including viewing the balance, crediting the account, debiting the account, and exiting the application. The test cases are implemented using Jest, a popular testing framework for Node.js. Validate this test plan with the business stakeholders to ensure it meets the business requirements. Once validated, you can use this plan to create corresponding unit tests and integration tests for the Node.js application.”

Étape 9 : exĂ©cuter des tests et perfectionner le code

AprĂšs avoir gĂ©nĂ©rĂ© le plan de test et rĂ©digĂ© les tests, vous devrez les exĂ©cuter et corriger les tests Ă©chouĂ©s. Les tests sont un processus itĂ©ratif, vous devrez peut-ĂȘtre modifier le code pour rĂ©soudre les problĂšmes, puis relancer les tests jusqu’à ce que tout soit validĂ©.

Si un test Ă©choue, utilisez Copilot pour faciliter le dĂ©bogage et perfectionner l’implĂ©mentation.

Exemple de prompt 6

@workspace - analyze test failures in operations.test.js and suggest fixes to match the expected behavior.

MĂȘme si tous les tests sont rĂ©ussis, le programme peut toujours prĂ©senter des problĂšmes. Les tests automatisĂ©s ne dĂ©tectent pas toujours les fonctionnalitĂ©s manquantes ou les erreurs logiques. Des tests manuels sont donc nĂ©cessaires pour s’assurer que l’application fonctionne comme prĂ©vu.

Étape 10 : dĂ©placer le projet JavaScript vers un nouvel emplacement

Une fois que l’application fonctionne comme prĂ©vu, dĂ©placez le nouveau projet JavaScript hors du rĂ©pertoire COBOL pour le garder sĂ©parĂ©.

  1. Accédez au répertoire parent du projet COBOL.

  2. DĂ©placez le projet JavaScript vers un nouvel emplacement :

    Shell
    mv modernize-legacy-cobol-app new-js-project
    
  3. AccĂ©dez au nouveau rĂ©pertoire du projet et vĂ©rifiez que tout s’exĂ©cute correctement :

    Shell
    cd new-js-project
    npm start
    

DĂ©sormais, l’application Node.js restructurĂ©e se trouve dans son propre dossier de projet autonome, sĂ©parĂ© des fichiers COBOL d’origine.

Conclusion

Dans cet exemple, nous avons examinĂ© un systĂšme de gestion de comptes Ă©crit en COBOL et l’avons modernisĂ© en Node.js. Nous avons utilisĂ© Copilot Chat pour expliquer le code, schĂ©matiser le flux de donnĂ©es, gĂ©nĂ©rer un plan de test et convertir le code en Node.js. En suivant ces Ă©tapes, vous pouvez moderniser votre code existant et faciliter sa maintenance et son extension. Voici quelques astuces supplĂ©mentaires pour moderniser le code hĂ©ritĂ© :

  • Les meilleures pratiques en matiĂšre de prompts sont essentielles : la qualitĂ© de vos prompts dĂ©termine la qualitĂ© des suggestions de Copilot. Fournissez un contexte clair, dĂ©composez les tĂąches complexes en Ă©tapes plus petites, donnez des exemples et fixez des objectifs spĂ©cifiques Ă  atteindre pour Copilot. Cela rend votre flux de travail plus fluide et vos rĂ©sultats plus prĂ©cis
  • Passez en revue le code avant de l’utiliser : assurez-vous de bien comprendre le code fourni par Copilot avant de l’utiliser dans votre application. Cela vous aidera Ă  dĂ©tecter les Ă©ventuels problĂšmes et Ă  vous assurer que le code rĂ©pond Ă  vos besoins.
  • Validez vos modifications : aprĂšs avoir apportĂ© des modifications au code, il est important de vĂ©rifier que l’application fonctionne toujours comme prĂ©vu. Vous pouvez utiliser le plan de test gĂ©nĂ©rĂ© par Copilot pour crĂ©er des tests unitaires et d’intĂ©gration pour l’application.

Travaux pratiques

Essayez l'exercice Moderniser votre code existant avec GitHub Copilot Exercice de compétences pour une expérience pratique de la mise à jour d'un code existant avec GitHub Copilot.

Pour aller plus loin