{"meta":{"title":"Модернизация устаревшего кода с помощью GitHub Copilot","intro":"Copilot Chat Помогает модернизировать устаревший код, предлагая рефакторы и создавая тесты для выявления потенциальных проблем.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/tutorials","title":"Учебники"},{"href":"/ru/copilot/tutorials/modernize-legacy-code","title":"Модернизация устаревшего кода"}],"documentType":"article"},"body":"# Модернизация устаревшего кода с помощью GitHub Copilot\n\nCopilot Chat Помогает модернизировать устаревший код, предлагая рефакторы и создавая тесты для выявления потенциальных проблем.\n\n> \\[!NOTE] Ответы, показанные в этой статье, являются примерами.\n> Copilot Chat Ответы не детерминированы, поэтому вы можете получить другие ответы, чем показаны здесь.\n\nУстаревший код — это код, устаревший или устаревший, который больше не поддерживается исходными разработчиками. Это может быть трудно поддерживать и расширять, так как оно может не соответствовать современным рекомендациям, таким как использование согласованных соглашений об именовании или написание четкой документации.\n\nМодернизация устаревшего кода поможет вам:\n\n* Повышение производительности и масштабируемости.\n* Упростить обслуживание и расширение кода.\n* Уменьшите риск возникновения ошибок при внесении изменений.\n* Упрощение тестирования кода.\n\nCopilot может помочь вам модернизировать ваш устаревший код, следующим путём:\n\n* **Предоставление предложений** по рефакторингу кода для выполнения современных рекомендаций.\n* **Создание документации** , помогающей понять, как работает код.\n* **Создание тестов** для проверки того, что изменения не появились.\n\n## Пример сценария\n\nВ этом примере мы рассмотрим систему управления учетными записями, написанную в COBOL, и модернизируем ее в Node.js. Код COBOL можно найти в репозитории [`modernize-legacy-cobol-app`](https://github.com/continuous-copilot/modernize-legacy-cobol-app).\n\nСистема управления учетными записями состоит из трех ключевых файлов:\n\n* `main.cob`: основная программа, которая считывает входные данные от пользователя и вызывает соответствующую подпрограмму.\n* `operations.cob`: подпрограмма, которая выполняет операции с данными учетной записи, такими как кредит, дебетовый и просмотр баланса.\n* `data.cob`: Подпрограмма, управляющая storage баланса счета.\n\n## Шаг 1. Получение локальной копии репозитория\n\nПеред компиляцией и запуском программы необходимо локально получить код. Если вы ещё не клонировали репозиторий, перейдите в папку, где хотите сохранить project, и выполните следующую команду:\n\n```shell copy\ngit clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git\n```\n\n## Шаг 2. Компиляция и запуск программы\n\nВы можете либо установить компилятор COBOL в предпочитаемой среде разработки (например, компилятор GnuCOBOL открытый код), либо использовать Copilot Chat в GitHub Codespaces.\n\nПри использовании MacOS можно установить GnuCOBOL с помощью [Homebrew](https://brew.sh/):\n\n```shell copy\nbrew install gnu-cobol\n```\n\nЕсли вы используете Codespaces систему Ubuntu Linux, вы можете установить GnuCOBOL с помощью `apt`следующих систем:\n\n```shell copy\nsudo apt-get update && \\\nsudo apt-get install gnucobol\n```\n\nЧтобы скомпилировать код, связать файлы и создать исполняемый файл, выполните следующую команду из корневого каталога репозитория:\n\n```shell copy\ncobc -x main.cob operations.cob data.cob -o accountsystem\n```\n\nЧтобы запустить программу, используйте следующую команду:\n\n```shell copy\n./accountsystem\n```\n\n## Шаг 3. Объяснение файлов и кода\n\nПервый шаг в модернизации кода заключается в том, чтобы понять, как он работает. Вы можете попросить Copilot Chat объяснить код в каждом файле.\n\nОткройте Copilot Chat репозиторий в вашем IDE, затем в панели введите следующий запрос.\n\n### Пример запроса 1\n\n```copilot copy\n/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.\n```\n\n### Пример ответа 1\n\nЭто фрагмент ответа на приведенный выше запрос:\n\n`Sure! Here's a high-level overview of the COBOL application, along with detailed explanations of each file and how they are linked together.`\n\n`High-Level Overview`\n\n`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. ...`\n\n## Шаг 4: Составьте график dataflow между файлами\n\nСледующий шаг заключается в том, чтобы понять, как файлы связаны друг с другом. Вы можете использовать `@workspace` для создания data flow диаграммы для приложения.\n\n> \\[!NOTE]\n> `@workspace` Участник VS Code чата предоставляет Visual StudioCopilot контекст обо всём коде в вашем рабочем пространстве. Вы можете использовать `@workspace` , когда хотите Copilot рассмотреть структуру вашего проекта и то, как разные части вашего кода взаимодействуют. Если вы используете IDE JetBrains, используйте `@project` вместо `@workspace`.\n\n### Пример запроса 2\n\n```copilot copy\n@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.\n```\n\nCopilot выводит разметку Mermaid для полной диаграммы последовательности, показывающей, как работает приложение. Чтобы создать схему, можно скопировать и вставить эту разметку в приложение Mermaid.\n\n## Шаг 5. Создание тестового плана\n\nСоздайте тестовый план, чтобы убедиться, что приложение работает должным образом после внесения изменений. Можно использовать `@workspace` для создания тестового плана, который охватывает все файлы project.\n\n### Пример запроса 3\n\n```copilot copy\n@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.\n\nLater 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.\n\nThe test plan should include the following:\n\n1. Test Case ID\n2. Test Case Description\n3. Pre-conditions\n4. Test Steps\n5. Expected Result\n6. Actual Result\n7. Status (Pass/Fail)\n8. Comments\n\nCreate the test plan in a markdown table format. The test plan should cover all the business logic in the current COBOL app.\n\nConvert this to markdown syntax to insert as a new file\n```\n\nCopilot выводит тестовый план в формате Markdown, который можно использовать для проверки приложения. Чтобы использовать этот план позже в процессе, создайте файл с именем `TESTPLAN.md` и скопируйте предлагаемый план в него. Это позволит ссылаться на план тестирования при создании тестовых случаев в следующих шагах.\n\n## Шаг 6. Преобразование файлов из COBOL в Node.js\n\nСледующим шагом является преобразование файлов COBOL в Node.js. Важно учитывать следующие методики запроса:\n\n* Предоставление контекста\n* Предоставление четких направлений\n* Будьте конкретными в отношении результата, которого вы хотите достичь\n\nНачните с создания временной папки внутри вашего Project, чтобы сохранить файлы JavaScript, которые собираетесь создать.\n\n```shell copy\nmkdir temp-JS-project-directory\n```\n\nЗатем итеративно преобразуйте файлы COBOL в Node.js.\n\n### Пример запроса 4\n\n```copilot copy\nConvert the code in #file:main.cob to node.js\n```\n\n### Пример ответа 4\n\n````shell\nSure! Here is the equivalent Node.js code for the main.cob file. This code will simulate the same account management system functionality.\n\n### COBOL Code:\n\nmain.cob\n\n```COBOL\nIDENTIFICATION DIVISION.\n       PROGRAM-ID. MainProgram.\n\n       DATA DIVISION.\n       WORKING-STORAGE SECTION.\n       01  CONTINUE-FLAG      PIC X VALUE 'Y'.\n       01  USER-CHOICE        PIC 9.\n       01  FINAL-BALANCE      PIC 9(6)V99 VALUE 1000.00.\n\n       PROCEDURE DIVISION.\nPERFORM UNTIL CONTINUE-FLAG = 'N'\nDISPLAY \"1. View Balance\"\nDISPLAY \"2. Credit Account\"\nDISPLAY \"3. Debit Account\"\nDISPLAY \"4. Exit\"\nACCEPT USER-CHOICE\n\nEVALUATE USER-CHOICE\nWHEN 1\nCALL 'Operations' USING 'TOTAL'\nWHEN 2\nCALL 'Operations' USING 'CREDIT'\nWHEN 3\nCALL 'Operations' USING 'DEBIT'\nWHEN 4\nMOVE 'N' TO CONTINUE-FLAG\nDISPLAY \"Exiting the program. Goodbye!\"\nWHEN OTHER\nDISPLAY \"Invalid choice. Please try again.\"\nEND-EVALUATE\nEND-PERFORM\nSTOP RUN.\n\n### Node.js Code: `main.js`\n```javascript\nconst readline = require('readline');\n\nlet continueFlag = 'Y';\nlet finalBalance = 1000.00;\n\nconst rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout\n});\n\nfunction displayMenu() {\n    console.log(\"1. View Balance\");\n    console.log(\"2. Credit Account\");\n    console.log(\"3. Debit Account\");\n    console.log(\"4. Exit\");\n}\n\nfunction handleUserChoice(choice) {\n    switch (choice) {\n        case '1':\n            viewBalance();\n            break;\n        case '2':\n            creditAccount();\n            break;\n        case '3':\n            debitAccount();\n            break;\n        case '4':\n            continueFlag = 'N';\n            console.log(\"Exiting the program. Goodbye!\");\n            rl.close();\n            break;\n        default:\n            console.log(\"Invalid choice. Please try again.\");\n            promptUser();\n            break;\n    }\n}\n\nfunction viewBalance() {\n    console.log(`Current balance: ${finalBalance.toFixed(2)}`);\n    promptUser();\n}\n\nfunction creditAccount() {\n    rl.question(\"Enter credit amount: \", (amount) =&gt; {\n        amount = parseFloat(amount);\n        if (!isNaN(amount) &amp;&amp; amount &gt; 0) {\n            finalBalance += amount;\n            console.log(`Amount credited. New balance: ${finalBalance.toFixed(2)}`);\n        } else {\n            console.log(\"Invalid amount. Please try again.\");\n        }\n        promptUser();\n    });\n}\n\nfunction debitAccount() {\n    rl.question(\"Enter debit amount: \", (amount) =&gt; {\n        amount = parseFloat(amount);\n        if (!isNaN(amount) &amp;&amp; amount &gt; 0) {\n            if (finalBalance &gt;= amount) {\n                finalBalance -= amount;\n                console.log(`Amount debited. New balance: ${finalBalance.toFixed(2)}`);\n            } else {\n                console.log(\"Insufficient funds for this debit.\");\n            }\n        } else {\n            console.log(\"Invalid amount. Please try again.\");\n        }\n        promptUser();\n    });\n}\n\nfunction promptUser() {\n    if (continueFlag === 'Y') {\n        displayMenu();\n        rl.question(\"Select an option: \", handleUserChoice);\n    }\n}\n\npromptUser();\n\nThis 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.\n````\n\nПеред его использованием необходимо тщательно просмотреть предлагаемый код. После удовлетворения созданного кода выполните следующие действия, чтобы сохранить его локально и завершить преобразование:\n\n1. В созданном ранее временном каталоге создайте новый файл `main.js`.\n2. Скопируйте сгенерированный код из Copilot Chat панели и вставьте его в `main.js`.\n3. Сохраните файл.\n4. Используйте аналогичные запросы для преобразования `operations.cob` и `data.cob` Node.js.\n5. Создайте соответствующие файлы `operations.js` JavaScript и `data.js`в том же временном каталоге.\n6. Скопируйте и вставьте созданный код в каждый файл, а затем сохраните их.\n\n## Шаг 7: Свяжите файлы между собой и настройте рабочий Node.js project\n\nПосле того как вы конвертируете все файлы в Node.js, нужно связать их и настроить рабочий Node.js project.\n\n1. Перейдите к временному каталогу в терминале.\n\n2. Выполните следующую команду, чтобы создать `package.json` файл:\n\n   ```shell copy\n   npm init -y\n   ```\n\n3. Если для приложения требуются внешние пакеты, установите их, выполнив следующие действия:\n\n   ```shell copy\n   npm install\n   ```\n\n4. Запустите приложение, выполнив следующую команду:\n\n   ```shell copy\n   npm start\n   ```\n\nНа этом этапе приложение Node.js может не полностью реплицировать функциональные возможности исходной программы COBOL. Например, балансы могут не обновляться правильно или вычисления могут не соответствовать логике COBOL.\n\nЧтобы уточнить приложение, вам потребуется:\n\n* **Определите неправильное поведение** , выполнив программу и сравнивая ее с версией COBOL.\n* **Работа итеративно с Copilot** Корректировать логику до тех пор, пока программа Node.js не начнёт вести себя как ожидается.\n* **Используйте целевые запросы** для отладки и улучшения конкретных частей кода, таких как:\n\n  ```copilot copy\n  @workspace - analyze main.js and ensure the account balance updates correctly when crediting an account.\n  ```\n\nРефакторинг устаревшего кода — это не всегда одноэтапный процесс:Copilot он может помочь отладить и улучшить функциональность по мере доработки вашей новой реализации Node.js.\n\n## Шаг 8. Создание модульных и интеграции тестов\n\nСледующим шагом является создание модульных и интеграционных тестов, чтобы убедиться, что приложение работает должным образом. Можно использовать `@workspace` для создания тестового плана, который охватывает все файлы project.\n\n### Пример запроса 5\n\n```copilot copy\n@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.\n```\n\n### Пример ответа 5\n\nCopilot генерирует ряд тестов в Jest, JavaScript-фреймворке, с полным, пошаговым руководством по их реализации и запуску.\n\nЭто фрагмент ответа на приведенный выше запрос:\n\n`“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.”`\n\n## Шаг 9. Выполнение тестов и уточнение кода\n\nСоздав план тестирования и написав тесты, их необходимо запустить и исправить все неудачные тесты. Тестирование является итеративным процессом, может потребоваться изменить код для устранения проблем, а затем повторно запустить тесты до тех пор, пока все не пройдет.\n\nЕсли тест провалился, используйте Copilot его для отладки и доработки реализации.\n\n### Пример запроса 6\n\n```copilot copy\n@workspace - analyze test failures in operations.test.js and suggest fixes to match the expected behavior.\n```\n\nДаже если все тесты проходят, программа может по-прежнему иметь проблемы. Автоматические тесты не всегда перехватывать отсутствующие функции или ошибки логики, поэтому для обеспечения правильного поведения приложения требуется ручное тестирование.\n\n## Шаг 10: Переместить JavaScript-project в новое место\n\nКогда приложение заработает как следует, переместите новый JavaScript-project из каталога COBOL, чтобы сохранить его отдельно.\n\n1. Перейдите в родительский каталог COBOL project.\n\n2. Переместите JavaScript-project на новое место:\n\n   ```shell copy\n   mv modernize-legacy-cobol-app new-js-project\n   ```\n\n3. Перейдите в каталог нового project и убедитесь, что всё работает корректно:\n\n   ```shell copy\n   cd new-js-project\n   npm start\n   ```\n\nТеперь рефакторированное Node.js приложение находится в отдельной папке project, отдельной от исходных файлов COBOL.\n\n## Заключение\n\nВ этом примере мы рассмотрели систему управления учетными записями, написанную в COBOL, и модернизировали ее в Node.js. Раньше Copilot Chat мы объясняли код, составляли график потока данных, создавали тестовый план и конвертировали код в Node.js. Выполнив следующие действия, вы можете модернизировать устаревший код и упростить обслуживание и расширение. Ниже приведены некоторые дополнительные советы по модернизации устаревшего кода:\n\n* **Лучшие практики подсказок — ключевы**: качество ваших подсказок определяет их Copilotкачество. Дайте ясный контекст, разбивайте сложные задачи на более мелкие шаги, приводите примеры и указывайте Copilot конкретные цели для достижения. Это упрощает рабочий процесс и более точные результаты\n* **Проверьте код перед использованием**: убедитесь, что вы понимаете код, который Copilot он предоставляется, прежде чем использовать его в вашем приложении. Это поможет вам поймать все потенциальные проблемы и убедиться, что код соответствует вашим требованиям.\n* **Проверьте изменения. После внесения изменений** в код важно убедиться, что приложение по-прежнему работает должным образом. Вы можете использовать тестовый план, сгенерированный для Copilot создания модульных и интеграционных тестов для приложения.\n\n## Отработка практических навыков\n\nПрактикуйте модернизацию устаревшего кода с помощью упражнения [«Модернизировать ваш наследный код» с GitHub Copilot](https://github.com/skills/modernize-your-legacy-code-with-github-copilot) помощью упражнений «Навыки».\n\nВ этом упражнении вы узнаете, как:\n\n* Анализируйте устаревший код COBOL для GitHub Copilot Chat понимания бизнес-логики.\n* Создавайте документацию, например, диаграммы потоков данных Русалки и планы тестов.\n* Преобразуем кодовую базу COBOL в Node.js с Copilot.\n* Создайте модульные тесты на основе сгенерированного плана тестирования.\n\n## Дополнительные материалы\n\n* [Документирование устаревшего кода](/ru/copilot/tutorials/copilot-cookbook/document-code/document-legacy-code)\n* [Модернизация устаревшего кода с GitHub Copilot: Советы и примеры](https://github.blog/ai-and-ml/github-copilot/modernizing-legacy-code-with-github-copilot-tips-and-examples/) по GitHub Блог"}