Skip to main content

Модернизация устаревшего кода с помощью GitHub Copilot

Copilot Chat помогает модернизировать устаревший код, предлагая рефакторинг и создавая тесты для перехвата потенциальных проблем.

Примечание.

Ответы, показанные в этой статье, являются примерами. Ответы Copilot Chat являются недетерминированными, поэтому вы можете получить различные ответы, показанные здесь.

Устаревший код — это код, устаревший или устаревший, который больше не поддерживается исходными разработчиками. Это может быть трудно поддерживать и расширять, так как оно может не соответствовать современным рекомендациям, таким как использование согласованных соглашений об именовании или написание четкой документации.

Модернизация устаревшего кода поможет вам:

  • Повышение производительности и масштабируемости.
  • Упростить обслуживание и расширение кода.
  • Уменьшите риск возникновения ошибок при внесении изменений.
  • Упрощение тестирования кода.

Copilot поможет модернизировать устаревший код:

  •         **Предоставление предложений** по рефакторингу кода для выполнения современных рекомендаций.
    
  •         **Создание документации** , помогающей понять, как работает код.
    
  •         **Создание тестов** для проверки того, что изменения не появились.
    

Пример сценария

В этом примере мы рассмотрим систему управления учетными записями, написанную в COBOL, и модернизируем ее в Node.js. Код COBOL можно найти в репозитории modernize-legacy-cobol-app.

Система управления учетными записями состоит из трех ключевых файлов:

  •         `main.cob`: основная программа, которая считывает входные данные от пользователя и вызывает соответствующую подпрограмму.
    
  •         `operations.cob`: подпрограмма, которая выполняет операции с данными учетной записи, такими как кредит, дебетовый и просмотр баланса.
    
  •         `data.cob`: Подпрограмма, управляющая storage баланса счета.
    

Шаг 1. Получение локальной копии репозитория

Перед компиляцией и запуском программы необходимо локально получить код. Если вы ещё не клонировали репозиторий, перейдите в папку, где хотите сохранить project, и выполните следующую команду:

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

Шаг 2. Компиляция и запуск программы

Вы можете либо установить компилятор COBOL в предпочитаемой среде разработки (например, компилятор GnuCOBOL open source), либо использовать Copilot Chat в GitHub Codespaces.

При использовании MacOS можно установить GnuCOBOL с помощью Homebrew:

Shell
brew install gnu-cobol

Если вы используете Codespaces или систему Ubuntu Linux, вы можете установить GnuCOBOL с помощью apt:

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

Чтобы скомпилировать код, связать файлы и создать исполняемый файл, выполните следующую команду из корневого каталога репозитория:

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

Чтобы запустить программу, используйте следующую команду:

Shell
./accountsystem

Шаг 3. Объяснение файлов и кода

Первый шаг в модернизации кода заключается в том, чтобы понять, как он работает. Вы можете попросить Copilot Chat объяснить код в каждом файле.

Откройте репозиторий в интегрированной среде разработки, а затем на панели Copilot Chat введите следующую строку.

Пример запроса 1

Copilot prompt
/explain #file:main.cob #file:operations.cob #file:data.cob. Create a high level overview of the app. Explain each file in detail and how they are linked.

Пример ответа 1

Это фрагмент ответа на приведенный выше запрос:

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. ...

Шаг 4: Составьте график dataflow между файлами

Следующий шаг заключается в том, чтобы понять, как файлы связаны друг с другом. Вы можете использовать @workspace для создания data flow диаграммы для приложения.

Примечание.

Участник @workspace чата в VS Code и Visual Studio предоставляет Copilot контекстом обо всем коде в рабочей области. Вы можете использовать @workspace, когда хотите Copilot, чтобы учесть структуру вашего project и взаимодействие различных частей кода. Если вы используете IDE JetBrains, используйте @project вместо @workspace.

Пример запроса 2

Copilot prompt
@workspace Create a sequence diagram of the app showing the data flow of the app. Create this in mermaid format so that I can render this in a markdown file.

Copilot выводит разметку Mermaid для полной схемы последовательности, которая показывает, как работает приложение. Чтобы создать схему, можно скопировать и вставить эту разметку в приложение Mermaid.

Шаг 5. Создание тестового плана

Создайте тестовый план, чтобы убедиться, что приложение работает должным образом после внесения изменений. Можно использовать @workspace для создания тестового плана, который охватывает все файлы project.

Пример запроса 3

Copilot prompt
@workspace The current COBOL app has no tests. 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

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 выводит тестовый план в формате Markdown, который можно использовать для проверки приложения. Чтобы использовать этот план позже в процессе, создайте файл с именем TESTPLAN.md и скопируйте предлагаемый план в него. Это позволит ссылаться на план тестирования при создании тестовых случаев в следующих шагах.

Шаг 6. Преобразование файлов из COBOL в Node.js

Следующим шагом является преобразование файлов COBOL в Node.js. Важно учитывать следующие методики запроса:

  • Предоставление контекста
  • Предоставление четких направлений
  • Будьте конкретными в отношении результата, которого вы хотите достичь

Начните с создания временной папки внутри вашего Project, чтобы сохранить файлы JavaScript, которые собираетесь создать.

Shell
mkdir temp-JS-project-directory

Затем итеративно преобразуйте файлы COBOL в Node.js.

Пример запроса 4

Copilot prompt
Convert the code in #file:main.cob to node.js

Пример ответа 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.

Перед его использованием необходимо тщательно просмотреть предлагаемый код. После удовлетворения созданного кода выполните следующие действия, чтобы сохранить его локально и завершить преобразование:

  1. В созданном ранее временном каталоге создайте новый файл main.js.
  2. Скопируйте созданный код из панели Copilot Chat и вставьте его в main.js.
  3. Сохраните файл.
  4. Используйте аналогичные запросы для преобразования operations.cob и data.cob Node.js.
  5. Создайте соответствующие файлы operations.js JavaScript и data.jsв том же временном каталоге.
  6. Скопируйте и вставьте созданный код в каждый файл, а затем сохраните их.

После того как вы конвертируете все файлы в Node.js, нужно связать их и настроить рабочий Node.js project.

  1. Перейдите к временному каталогу в терминале.

  2. Выполните следующую команду, чтобы создать package.json файл:

    Shell
    npm init -y
    
  3. Если для приложения требуются внешние пакеты, установите их, выполнив следующие действия:

    Shell
    npm install
    
  4. Запустите приложение, выполнив следующую команду:

    Shell
    npm start
    

На этом этапе приложение Node.js может не полностью реплицировать функциональные возможности исходной программы COBOL. Например, балансы могут не обновляться правильно или вычисления могут не соответствовать логике COBOL.

Чтобы уточнить приложение, вам потребуется:

  •         **Определите неправильное поведение** , выполнив программу и сравнивая ее с версией COBOL.
    
  •         **Работайте итеративно с Copilot** для настройки логики до тех пор, пока программа Node.js не будет работать должным образом.
    
  •         **Используйте целевые запросы** для отладки и улучшения конкретных частей кода, таких как:
    
    Copilot prompt
    @workspace - analyze main.js and ensure the account balance updates correctly when crediting an account.
    

Рефакторинг устаревшего кода не всегда является одношаговым процессом: Copilot может помочь в отладке и улучшении функциональных возможностей при уточнении новой реализации Node.js.

Шаг 8. Создание модульных и интеграции тестов

Следующим шагом является создание модульных и интеграционных тестов, чтобы убедиться, что приложение работает должным образом. Можно использовать @workspace для создания тестового плана, который охватывает все файлы project.

Пример запроса 5

Copilot prompt
@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 the 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.

Пример ответа 5

Copilot создает ряд тестов в Jest, платформе тестирования JavaScript с полным пошаговые инструкции по реализации и запуску.

Это фрагмент ответа на приведенный выше запрос:

“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.”

Шаг 9. Выполнение тестов и уточнение кода

Создав план тестирования и написав тесты, их необходимо запустить и исправить все неудачные тесты. Тестирование является итеративным процессом, может потребоваться изменить код для устранения проблем, а затем повторно запустить тесты до тех пор, пока все не пройдет.

Если тест завершается ошибкой, используйте Copilot для отладки и уточнения реализации.

Пример запроса 6

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

Даже если все тесты проходят, программа может по-прежнему иметь проблемы. Автоматические тесты не всегда перехватывать отсутствующие функции или ошибки логики, поэтому для обеспечения правильного поведения приложения требуется ручное тестирование.

Шаг 10: Переместить JavaScript-project в новое место

Когда приложение заработает как следует, переместите новый JavaScript-project из каталога COBOL, чтобы сохранить его отдельно.

  1. Перейдите в родительский каталог COBOL project.

  2. Переместите JavaScript-project на новое место:

    Shell
    mv modernize-legacy-cobol-app new-js-project
    
  3. Перейдите в каталог нового project и убедитесь, что всё работает корректно:

    Shell
    cd new-js-project
    npm start
    

Теперь рефакторированное Node.js приложение находится в отдельной папке project, отдельной от исходных файлов COBOL.

Заключение

В этом примере мы рассмотрели систему управления учетными записями, написанную в COBOL, и модернизировали ее в Node.js. Мы использовали Copilot Chat для объяснения кода, составления графика data flow, создания тестового плана и конвертации кода в Node.js. Выполнив следующие действия, вы можете модернизировать устаревший код и упростить обслуживание и расширение. Ниже приведены некоторые дополнительные советы по модернизации устаревшего кода:

  •         **Рекомендации по запросу являются ключевыми**: качество запросов определяет качество Copilot. Предоставьте четкий контекст, разбийте сложные задачи на небольшие шаги, укажите примеры и предоставьте Copilot конкретным целям для работы. Это упрощает рабочий процесс и более точные результаты
    
  •         **Просмотрите код перед его использованием**: убедитесь, что вы понимаете код, который Copilot предоставляется перед его использованием в приложении. Это поможет вам поймать все потенциальные проблемы и убедиться, что код соответствует вашим требованиям.
    
  •         **Проверьте изменения. После внесения изменений** в код важно убедиться, что приложение по-прежнему работает должным образом. Вы можете использовать план тестирования, созданный Copilot для создания модульных и интеграции тестов для приложения.
    

Отработка практических навыков

Попробуйте упражнение Модернизация вашего устаревшего кода с помощью GitHub Copilot Skills для практического опыта обновления устаревшей кодовой базы с помощью GitHub Copilot.

Дополнительные материалы

  •         [AUTOTITLE](/copilot/copilot-chat-cookbook/documenting-code/documenting-legacy-code)
    
  •         [Модернизация устаревшего кода с помощью GitHub Copilot: Советы и примеры](https://github.blog/ai-and-ml/github-copilot/modernizing-legacy-code-with-github-copilot-tips-and-examples/) на блоге GitHub