Note
この記事に示されている応答は例です。 Copilot Chat の応答は非決定的であるため、ここに示されているものとは異なる応答が返される可能性があります。
レガシ コードとは、古い、時代遅れ、または元の開発者によってサポートされなくなったコードです。 一貫性のある名前付け規則の使用やわかりやすいドキュメントの作成など、最新のベスト プラクティスに従っていない可能性があるため、保守や拡張が難しい場合があります。
レガシ コードを最新化すると、次のような利点があります。
- パフォーマンスとスケーラビリティを向上させる。
- コードの保守と拡張が容易になる。
- 変更を加えるときにバグが発生するリスクを軽減する。
- コードがテストしやすくなる。
Copilot は、次の方法でレガシ コードの最新化を支援できます。
- 最新のベスト プラクティスに従ってコードをリファクターするための提案を提供する。
- コードのしくみを理解するのに役立つドキュメントを生成する。
- 変更によってバグが発生していないかどうかを検証するテストを生成する。
シナリオ例
この例では、COBOL で書かれたアカウント管理システムを調べ、Node.js に最新化します。 COBOL コードは modernize-legacy-cobol-app
リポジトリにあります。
アカウント管理システムは、次の 3 つのキー ファイルで構成されます。
main.cob
: ユーザーからの入力を読み取り、適切なサブプログラムを呼び出すメイン プログラム。operations.cob
: クレジット、デビット、残高照会などのアカウント データに対する操作を実行するサブプログラム。data.cob
: アカウント残高のストレージを管理するサブプログラム。
手順 1: リポジトリのローカル コピーを取得する
プログラムをコンパイルして実行する前に、コードをローカルに用意する必要があります。 リポジトリのクローンをまだ作成していない場合は、プロジェクトを格納するディレクトリに移動し、次のコマンドを実行します。
git clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git
git clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git
手順 2: プログラムをコンパイルして実行する
COBOL コンパイラを任意の開発環境 (オープンソースの GnuCOBOL コンパイラなど) にインストールするか、Copilot Chat の GitHub Codespaces を使用できます。
macOS を使っている場合は、Homebrew を使って GnuCOBOL をインストールできます。
brew install gnu-cobol
brew install gnu-cobol
Codespaces または Ubuntu Linux システムを使っている場合は、apt
を使って GnuCOBOL をインストールできます。
sudo apt-get update && \ sudo apt-get install gnucobol
sudo apt-get update && \
sudo apt-get install gnucobol
コードをコンパイルし、ファイルをリンクし、実行可能ファイルを作成するには、リポジトリのルートから次のコマンドを実行します。
cobc -x main.cob operations.cob data.cob -o accountsystem
cobc -x main.cob operations.cob data.cob -o accountsystem
プログラムを実行するには、次のコマンドを使います。
./accountsystem
./accountsystem
手順 3: ファイルとコードについて説明する
コードを最新化する最初の手順は、そのしくみを理解することです。 各ファイルのコードを説明するように Copilot Chat に依頼できます。
IDE でリポジトリを開き、Copilot Chat パネルに次のプロンプトを入力します。
プロンプトの例 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.
応答の例 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: ファイル間のデータ フローを図示する
次の手順は、ファイル間がどのようにリンクされているかを理解することです。 @workspace
を使って、アプリケーションのデータ フロー ダイアグラムを作成できます。
Note
VS Code と Visual Studio の @workspace
チャット参加者は、ワークスペース内のすべてのコードに関するコンテキストを Copilot に提供します。 Copilot にプロジェクトの構造とコードのさまざまな部分がどのように相互作用するかを考慮させたい場合は、@workspace
を使用できます。 JetBrains IDE を使っている場合は、@workspace
ではなく @project
を使ってください。
プロンプトの例 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 により、アプリケーションがどのように機能するかを示す完全なシーケンス ダイアグラムの Mermaid マークアップが出力されます。 このマークアップをコピーして Mermaid アプリケーションに貼り付けると、ダイアグラムが生成されます。
手順 5: テスト計画を生成する
テスト計画を作成して、変更を加えた後にアプリケーションが期待どおりに機能することを確認します。 @workspace
を使うと、プロジェクト内のすべてのファイルを対象とするテスト計画を生成できます。
プロンプトの例 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 により、アプリケーションの検証に使用できるテスト計画が Markdown 形式で出力されます。 この計画を後でプロセスに使うには、TESTPLAN.md
というファイルを作成し、提案された計画をそこにコピーします。 こうすることで、次の手順でテスト ケースを生成するときにテスト計画を参照できるようになります。
手順 6: ファイルを COBOL から Node.js に変換する
次の手順は、COBOL ファイルを Node.js に変換することです。 次のプロンプト プラクティスに留意することが重要です。
- コンテキストを提供する
- 明確な指示を与える
- 達成したい結果を具体的に示す
まず、プロジェクト内に一時ディレクトリを作成します。作成する JavaScript ファイルはここに保存します。
mkdir temp-JS-project-directory
mkdir temp-JS-project-directory
次に、COBOL ファイルを Node.js に繰り返し変換します。
プロンプトの例 4
Can you convert 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.
提案されたコードは、十分に確認してから使ってください。 生成されたコードに問題がなければ、次の手順に従ってコードをローカルに保存し、変換を完了します。
- 先ほど作成した一時ディレクトリに、
main.js
という新しいファイルを作成します。 - 生成されたコードを Copilot Chat パネルからコピーし、
main.js
に貼り付けます。 - ファイルを保存します。
- 同様のプロンプトを使って、
operations.cob
とdata.cob
を Node.js に変換します。 - 対応する JavaScript ファイル
operations.js
とdata.js
を同じ一時ディレクトリに作成します。 - 生成されたコードをコピーして各ファイルに貼り付け、保存します。
手順 7: ファイル間をリンクし、機能する Node.js プロジェクトを設定する
すべてのファイルを Node.js に変換したら、相互にリンクして、機能する Node.js プロジェクトを設定する必要があります。
-
ターミナルで一時ディレクトリに移動します。
-
次のコマンドを実行して、
package.json
ファイルを作成します。Shell npm init -y
npm init -y
-
アプリケーションに外部パッケージが必要な場合は、以下を実行してインストールします。
Shell npm install
npm install
-
次を実行してアプリを起動します。
Shell npm start
npm start
この時点で、Node.js アプリケーションは元の COBOL プログラムの機能を完全にレプリケートしていない可能性があります。 たとえば、残高が正しく更新されない場合や、計算が COBOL ロジックと一致しない場合があります。
アプリケーションを改良するには、以下の作業が必要です。
-
プログラムを実行して COBOL バージョンと比較することで、正しくない動作を特定します。
-
Node.js プログラムが期待どおりに機能するまで、Copilot を繰り返し操作してロジックを調整します。
-
次のようにターゲットを絞ったプロンプトを使用して、コードの特定の部分をデバッグし、改善します。
@workspace - analyze main.js and ensure account balance updates correctly when crediting an account.
レガシ コードのリファクターは、必ずしも 1 ステップのプロセスではありません。新しい Node.js の実装を改良する際には、Copilot がデバッグと機能の改善に役立ちます。
手順 8: 単体テストと統合テストを生成する
次の手順では、単体テストと統合テストを生成し、アプリケーションが期待どおりに機能することを確認します。 @workspace
を使うと、プロジェクト内のすべてのファイルを対象とするテスト計画を生成できます。
プロンプトの例 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.
応答の例 5
Copilot により、JavaScript テスト フレームワークである Jest に多数のテストが生成され、それらの実装と実行方法に関する詳細なステップバイステップ ガイドが提供されます。
上記のプロンプトに対する回答の抜粋を次に示します。
“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: テストを実行してコードを改良する
テスト計画を生成してテストを作成した後、テストを実行して、失敗したテストを修正する必要があります。 テストは反復的なプロセスです。issue を解決するようにコードを変更し、テストを再実行して、すべてに合格するまで繰り返します。
テストに失敗した場合は、Copilot を使って、実装のデバッグと調整に役立ててください。
プロンプトの例 6
@workspace - analyze test failures in operations.test.js and suggest fixes to match the expected behavior.
すべてのテストに合格したとしても、プログラムに issue が残る可能性があります。 自動テストでは欠落している機能やロジック エラーが常に見つかるとは限らないため、アプリケーションが期待どおりに動作することを確認するには手動テストが必要です。
手順 10: JavaScript プロジェクトを新しい場所に移動する
アプリケーションが期待どおりに機能するようになったら、新しい JavaScript プロジェクトを COBOL ディレクトリから移動して、別々に管理します。
-
COBOL プロジェクトの親ディレクトリに移動します。
-
JavaScript プロジェクトを新しい場所に移動します。
Shell mv modernize-legacy-cobol-app new-js-project
mv modernize-legacy-cobol-app new-js-project
-
新しいプロジェクト ディレクトリに移動し、すべてが正しく動作することを確認します。
Shell cd new-js-project npm start
cd new-js-project npm start
現在、リファクターされた Node.js アプリケーションは、元の COBOL ファイルとは別に、独自のスタンドアロン プロジェクト フォルダー内に配置されています。
まとめ
この例では、COBOL で書かれたアカウント管理システムを調べ、Node.js に最新化しました。 Copilot Chat を使って、コードの説明、データ フローの図示化、テスト計画の生成、コードの Node.js への変換を行いました。 これらの手順に従うと、レガシ コードを最新化し、保守と拡張を容易にすることができます。 レガシ コードを最新化するための追加のヒントをいくつか紹介します。
- プロンプトのベスト プラクティスが重要: プロンプトの品質によって、Copilot の提案の品質が決まります。 明確なコンテキストを提供し、複雑なタスクを小さなステップに分割し、例を示し、Copilot に取り組むべき具体的な目標を示します。 こうすることで、ワークフローがよりスムーズになり、結果がより正確になります
- 使う前にコードをレビューする: アプリケーションで使う前に、必ず Copilot から提供されたコードを理解してください。 これは、潜在的な issue を検出し、コードが要件を満たしていることを確認するのに役立ちます。
- 変更を検証する: コードに変更を加えた後、アプリケーションが引き続き期待どおりに機能することを検証することが重要です。 Copilot によって生成されたテスト計画を使って、アプリケーションの単体テストと統合テストを作成できます。
参考資料
- レガシ コードの文書化
- GitHub Copilot を使ってレガシ コードを最新化する: ヒントと例については、GitHub ブログを参照してください