Note
Bei den in diesem Artikel veranschaulichten Antworten handelt es sich um Beispiele. Da die Copilot Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise andere Antworten als die hier dargestellten.
Legacycode ist alter, veralteter oder nicht mehr von den ursprünglichen Entwickelnden unterstützter Code. Eine Verwaltung oder Erweiterung kann sich als schwierig erweisen, da er möglicherweise keine modernen Best Practices wie die Verwendung konsistenter Namenskonventionen oder das Verfassen einer klaren Dokumentation befolgt.
Die Modernisierung von Legacycode kann Folgendes unterstützen:
- Verbessern der Leistung und Skalierbarkeit
- Einfacheres Verwalten und Erweitern von Code
- Verringern des Risikos für die Einzuführung von Fehlern bei Änderungen
- Einfacheres Testen von Code
Copilot kann dich durch Folgendes bei der Modernisierung von Legacycode unterstützen:
- Bereitstellen von Vorschlägen zum Umgestalten des Codes, um moderne Best Practices zu befolgen
- Generieren der Dokumentation zum Nachvollziehen der Funktionsweise des Codes
- Generieren von Tests zum Sicherstellen, dass durch Änderungen keine Fehler eingeführt wurden
Beispielszenario
In diesem Beispiel wird ein Kontoverwaltungssystem veranschaulicht, das in COBOL geschrieben wurde und in Node.js modernisiert wird. Der COBOL-Code befindet sich im Repository modernize-legacy-cobol-app
.
Das Kontoverwaltungssystem besteht aus drei wichtigen Dateien:
main.cob
: Das Hauptprogramm, das Benutzereingaben liest und das entsprechende Unterprogramm aufruftoperations.cob
: Ein Unterprogramm, das Vorgänge für die Kontodaten ausführt, z. B. das Anzeigen von Kredit, Debit und Saldodata.cob
: Ein Unterprogramm, das den Speicher des Kontosaldos verwaltet
Schritt 1: Abrufen einer lokalen Kopie des Repositorys
Bevor du das Programm kompilierst und ausführst, musst du lokal über den Code verfügen. Wenn du das Repository noch nicht geklont hast, navigiere zu dem Verzeichnis, in dem du das Projekt speichern möchtest, und führe den folgenden Befehl aus:
git clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git
git clone https://github.com/continuous-copilot/modernize-legacy-cobol-app.git
Schritt 2: Kompilieren und Ausführen des Programms
Du kannst den COBOL-Compiler in deiner bevorzugten Entwicklungsumgebung installieren (z. B. den Open-Source-GnuCOBOL-Compiler) oder Copilot Chat in GitHub Codespaces verwenden.
Auf MacOS kannst du GnuCOBOL mithilfe von Homebrew installieren:
brew install gnu-cobol
brew install gnu-cobol
Wenn du Codespaces oder ein Ubuntu Linux-System verwendest, kannst du GnuCOBOL mithilfe von apt
installieren:
sudo apt-get update && \ sudo apt-get install gnucobol
sudo apt-get update && \
sudo apt-get install gnucobol
Um den Code zu kompilieren, die Dateien zu verknüpfen und eine ausführbare Datei zu erstellen, führe den folgenden Befehl aus dem Stammverzeichnis des Repositorys aus:
cobc -x main.cob operations.cob data.cob -o accountsystem
cobc -x main.cob operations.cob data.cob -o accountsystem
Verwende zum Ausführen des Programms den folgenden Befehl:
./accountsystem
./accountsystem
Schritt 3: Erläutern von Dateien und Code
Der erste Schritt bei der Modernisierung des Codes besteht darin, seine Funktionsweise nachzuvollziehen. Du kannst Copilot Chat darum bitten, den Code in den einzelnen Dateien zu erläutern.
Öffne das Repository in deiner IDE, und gib anschließend im Copilot Chat-Panel den folgenden Prompt ein.
Beispielprompt 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.
Beispielantwort 1
Dieser Auszug stammt aus der Antwort auf den obigen Prompt:
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. ...
Schritt 4: Erstellen eines Diagramms für den Datenfluss zwischen den Dateien
Der nächste Schritt besteht darin, die Verknüpfung der Dateien nachzuvollziehen. Du kannst @workspace
verwenden, um ein Datenflussdiagramm für die Anwendung zu erstellen.
Note
Der @workspace
-Chatteilnehmer in VS Code und Visual Studio stellt Copilot Kontext für den gesamten Code in deinem Arbeitsbereich bereit. Du kannst @workspace
verwenden, wenn Copilot die Struktur deines Projekts und die Art berücksichtigen soll, wie verschiedene Teile deines Codes interagieren. Wenn du eine JetBrains-IDE nutzt, solltest du @project
anstelle von @workspace
verwenden.
Beispielprompt 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 gibt das Mermaid-Markup für ein vollständiges Sequenzdiagramm aus, die Funktionsweise der Anwendung darstellt. Du kannst dieses Markup kopieren und in eine Mermaid-Anwendung einfügen, um das Diagramm zu generieren.
Schritt 5: Generieren eines Testplans
Erstelle einen Testplan, um eine erwartungsgemäße Funktionsweise der Anwendung nach dem Vornehmen von Änderungen sicherzustellen. Du kannst @workspace
verwenden, um einen Testplan für alle Dateien im Projekt zu generieren.
Beispielprompt 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 gibt einen Testplan im Markdown-Format aus, das du zur Überprüfung der Anwendung verwenden kannst. Um diesen Plan später im Prozess zu verwenden, erstelle eine Datei namens TESTPLAN.md
, und füge den vorgeschlagenen Plan in der Datei ein. Auf diese Weise kannst du in den nächsten Schritten beim Generieren von Testfällen auf den Testplan verweisen.
Schritt 6: Konvertieren der Dateien von COBOL in Node.js
Der nächste Schritt besteht darin, die COBOL-Dateien in Node.js zu konvertieren. Dabei sollte die folgende Vorgehensweise für Prompts berücksichtigt werden:
- Bereitstellen von Kontext
- Erteilen klarer Anweisungen
- Angeben einer Definition des gewünschten Ergebnisses
Erstelle in deinem Projekt zunächst ein temporäres Verzeichnis, in dem die zu erstellenden JavaScript-Dateien gespeichert werden.
mkdir temp-JS-project-directory
mkdir temp-JS-project-directory
Konvertiere anschließend die COBOL-Dateien iterativ in Node.js.
Beispielprompt 4
Can you convert code in #file:main.cob to node.js?
Beispielantwort 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.
Du solltest den vorgeschlagenen Code sorgfältig überprüfen, bevor du ihn verwenden. Wenn du mit dem generierten Code zufrieden bist, führe die folgenden Schritte aus, um ihn lokal zu speichern und die Konvertierung abzuschließen:
- Erstelle im zuvor erstellten temporären Verzeichnis eine neue Datei namens
main.js
. - Kopiere den generierten Code aus dem Copilot Chat-Panel, und füge ihn in die Datei
main.js
ein. - Speichern Sie die Datei.
- Verwende ähnliche Prompts, um
operations.cob
unddata.cob
in Node.js zu konvertieren. - Erstelle im selben temporären Verzeichnis die entsprechenden JavaScript-Dateien
operations.js
unddata.js
. - Kopiere den generierten Code, und füge ihn in jede Datei ein. Speichere die Dateien anschließend.
Schritt 7: Verknüpfen der Dateien und Einrichten eines funktionierenden Node.js Projekts
Nachdem du alle Dateien in Node.js konvertiert hast, musst du sie miteinander verknüpfen und ein funktionierendes Node.js-Projekt einrichten.
-
Navigiere im Terminal zum temporären Verzeichnis.
-
Führe den folgenden Befehl aus, um eine
package.json
-Datei zu erstellen:Shell npm init -y
npm init -y
-
Wenn deine Anwendung externe Pakete benötigt, installiere diese, indem du den folgenden Befehl ausführst:
Shell npm install
npm install
-
Führen Sie den folgenden Befehl aus, um die App zu starten:
Shell npm start
npm start
Zu diesem Zeitpunkt kann die Node.js-Anwendung die Funktionalität des ursprünglichen COBOL-Programms nicht vollständig replizieren. Beispielsweise wird das Saldo möglicherweise nicht ordnungsgemäß aktualisiert, oder die Berechnungen stimmen möglicherweise nicht mit der COBOL-Logik überein.
Zum Optimieren der Anwendung sind folgende Schritte erforderlich:
-
Identifizieren falschen Verhaltens durch das Ausführen des Programms und einen Vergleich mit der COBOL-Version
-
Iteratives Arbeiten mit Copilot zum Anpassen der Logik, bis sich das Node.js-Programm erwartungsgemäß verhält
-
Verwenden gezielter Prompts zum Debuggen und Verbessern bestimmter Teile des Codes, z. B.:
@workspace - analyze main.js and ensure account balance updates correctly when crediting an account.
Der Prozess zum Umgestalten von Legacycode besteht häufig aus mehr als einem Schritt: Copilot kann dich beim Debuggen und Verbessern der Funktionalität unterstützen, während du deine neue Node.js-Implementierung optimierst.
Schritt 8: Generieren von Komponenten- und Integrationstests
Der nächste Schritt besteht darin, Komponenten- und Integrationstests zu generieren, um eine erwartungsgemäße Funktionsweise der Anwendung sicherzustellen. Du kannst @workspace
verwenden, um einen Testplan für alle Dateien im Projekt zu generieren.
Beispielprompt 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.
Beispielantwort 5
Copilot generiert im JavaScript-Testframework Jest eine Reihe von Tests mit einer vollumfänglichen Anleitung zum Implementieren und Ausführen dieser Tests.
Dieser Auszug stammt aus der Antwort auf den obigen Prompt:
“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.”
Schritt 9: Ausführen von Tests und Optimieren des Codes
Nachdem du den Testplan generiert und die Tests geschrieben hast, musst du sie ausführen und alle Fehler beheben, die beim Ausführen der Tests auftreten. Das Testen ist ein iterativer Prozess. Möglicherweise musst du den Code ändern, um Probleme zu beheben, und die Tests anschließend erneut ausführen, bis alle Tests bestanden werden.
Wenn ein Test fehlschlägt, verwende Copilot zum Debuggen und Optimieren der Implementierung.
Beispielprompt 6
@workspace - analyze test failures in operations.test.js and suggest fixes to match the expected behavior.
Selbst wenn alle Tests bestanden werden, kann das Programm weiterhin Probleme aufweisen. Automatisierte Tests erfassen nicht immer fehlende Funktionalität oder Logikfehler, wodurch manuelle Tests erforderlich sind, um eine erwartungsgemäße Funktionsweise der Anwendung sicherzustellen.
Schritt 10: Verschieben des JavaScript-Projekts an einen neuen Speicherort
Sobald die Anwendung erwartungsgemäß funktioniert, verschiebe das neue JavaScript-Projekt aus dem COBOL-Verzeichnis, um es vom COBOL-Projekt zu trennen.
-
Navigiere zum übergeordneten Verzeichnis des COBOL-Projekts.
-
Verschiebe das JavaScript-Projekt an einen neuen Speicherort:
Shell mv modernize-legacy-cobol-app new-js-project
mv modernize-legacy-cobol-app new-js-project
-
Navigiere zum neuen Projektverzeichnis, und überprüfe, ob alles ordnungsgemäß ausgeführt wird:
Shell cd new-js-project npm start
cd new-js-project npm start
Die umgestaltete Node.js-Anwendung befindet sich nun in einem eigenen eigenständigen Projektordner und ist von den ursprünglichen COBOL-Dateien getrennt.
Zusammenfassung
In diesem Beispiel wurde ein Kontoverwaltungssystem veranschaulicht, das in COBOL geschrieben und in Node.js modernisiert wurde. Copilot Chat wurde verwendet, um den Code zu erläutern, ein Diagramm für den Datenfluss zu erstellen, einen Testplan zu generieren und den Code in Node.js zu konvertieren. Durch das Ausführen dieser Schritte kannst du Legacycode modernisieren, damit dieser einfacher verwaltet und erweitert werden kann. Hier findest du einige zusätzliche Tipps zum Modernisieren von Legacycode:
- Best Practices für Prompts sind wichtige: Die Qualität deiner Prompts bestimmt die Qualität der Vorschläge von Copilot. Stelle klare Kontext bereit, unterteile komplexe Aufgaben in kleinere Schritte, stelle Beispiele bereit, und gib Copilot spezifische Ziele vor. Das führt zu einem optimierten Workflow und zu präziseren Ergebnissen.
- Überprüfe den Code vor der Verwendung: Stelle sicher, dass du den Code verstehst, den Copilot bereitstellt, bevor du ihn in deiner Anwendung verwendest. Dadurch kannst du potenzielle Probleme abfangen und sicherstellen, dass der Code deine Anforderungen erfüllt.
- Überprüfe deine Änderungen: Nachdem du Änderungen am Code vorgenommen hast, ist es wichtig zu überprüfen, ob die Anwendung weiterhin erwartungsgemäß funktioniert. Du kannst den von Copilot generierten Testplan verwenden, um Komponenten- und Integrationstests für die Anwendung zu erstellen.