学号:202205010327 姓名:李一豪
学号:202205010350 姓名:苗毅诚
学号:202205010319 姓名:江峰
一、结对编程简介
结对编程是一种灵活高效的软件开发方法。在结对编程中,两人协作完成同一个任务------一人负责编写代码(驾驶员),另一人负责实时审查和提出改进建议(导航员)。两人可以轮流担任驾驶员和导航员,通过密切协作解决问题、分享知识,从而提高代码质量和开发效率。结对编程的优势在于它通过及时的反馈和讨论,帮助团队成员从不同视角解决问题,尤其适合新手或希望提升编程技能的开发者。
本次实验采用了结对编程的方式,我和我的两位编程伙伴采用了通义灵码这一 AI 代码生成工具,一同实现了一个简易的 Java 通讯录系统。接下来我们将分享项目流程、代码实现及结对编程过程中的经验。
二、项目概述:Java 通讯录系统
项目的核心需求是实现一个通讯录系统,包括以下基本功能:
- 添加联系人:通过姓名和电话号码添加联系人。
- 删除联系人:根据姓名删除联系人。
- 查看所有联系人:展示通讯录中所有的联系人信息。
- 查找联系人:根据姓名查找特定联系人。
三、结对编程与 AI 代码生成工具的协作过程
在本次实验的过程中,我们利用通义灵码完成了以下几个步骤。由我担任驾驶员,负责执行代码生成工具和整合代码;苗毅诚和江峰共同担任导航员,负责审查生成的代码并提出修改建议。在这一过程中,我们不仅能快速迭代功能,还能互相补充、优化代码。以下是具体步骤:
1. 创建通讯录类框架
我们首先使用通义灵码生成了 AddressBook
类的框架。输入指令"创建包含通讯录增删查功能的 Java 类框架"后,通义灵码给出了基本的类结构:
java
javaCopy codeimport java.util.HashMap;
import java.util.Map;
public class AddressBook {
private Map<String, String> contacts = new HashMap<>();
public void addContact(String name, String phone) {
// 添加联系人方法
}
public void removeContact(String name) {
// 删除联系人方法
}
public void viewContacts() {
// 查看所有联系人方法
}
public void findContact(String name) {
// 查找联系人方法
}
}
导航员在这里提出,contacts
字段采用 HashMap
存储联系人信息非常合理,方便以姓名为键进行快速查找。我们确认了此框架设计后,继续实现具体功能。
2. 实现各模块功能
(1)添加联系人功能
接下来,我使用通义灵码生成 addContact
方法。输入指令"实现 addContact 方法,将姓名和电话号码存储在通讯录中"后,通义灵码生成了以下代码:
java
javaCopy codepublic void addContact(String name, String phone) {
if (contacts.containsKey(name)) {
System.out.println("联系人 " + name + " 已存在!");
} else {
contacts.put(name, phone);
System.out.println("联系人 " + name + " 添加成功,电话号码为 " + phone + "。");
}
}
导航员认为该代码逻辑合理,检查了工具生成的代码并确认此功能已实现无误。
(2)删除联系人功能
随后我们共同生成 removeContact
方法。通过输入"实现 removeContact 方法,通过姓名删除联系人"获得了以下代码:
java
javaCopy codepublic void removeContact(String name) {
if (contacts.containsKey(name)) {
contacts.remove(name);
System.out.println("联系人 " + name + " 已删除。");
} else {
System.out.println("未找到联系人 " + name + "!");
}
}
我们共同探讨后觉得,删除联系人之前的检查操作确保了不会出现无效删除。
(3)查看所有联系人功能
我们通过通义灵码生成 viewContacts
方法代码,确保能够查看通讯录中的所有联系人。
java
javaCopy codepublic void viewContacts() {
if (contacts.isEmpty()) {
System.out.println("通讯录为空。");
} else {
System.out.println("通讯录中的联系人:");
for (Map.Entry<String, String> entry : contacts.entrySet()) {
System.out.println("姓名:" + entry.getKey() + ",电话号码:" + entry.getValue());
}
}
}
导航员在这一步提议通过 isEmpty
方法先检查通讯录是否为空,从而避免遍历空 Map 的不必要操作。
(4)查找联系人功能
最后,通过"实现 findContact 方法,通过姓名查找联系人并打印信息"获得以下代码:
java
javaCopy codepublic void findContact(String name) {
if (contacts.containsKey(name)) {
System.out.println("姓名:" + name + ",电话号码:" + contacts.get(name));
} else {
System.out.println("未找到联系人 " + name + "。");
}
}
3. 用户交互逻辑实现
为了增加实用性,我们通过以下代码加入了用户选择操作的交互逻辑。导航员建议使用 Scanner
读取用户输入的方式,并根据输入执行不同功能。
java
javaCopy codeimport java.util.Scanner;
public class Main {
public static void main(String[] args) {
AddressBook addressBook = new AddressBook();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n通讯录系统");
System.out.println("1. 添加联系人");
System.out.println("2. 删除联系人");
System.out.println("3. 查看所有联系人");
System.out.println("4. 查找联系人");
System.out.println("5. 退出系统");
System.out.print("请选择操作(1-5):");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.print("输入联系人姓名:");
String name = scanner.nextLine();
System.out.print("输入联系人电话号码:");
String phone = scanner.nextLine();
addressBook.addContact(name, phone);
break;
case 2:
System.out.print("输入要删除的联系人姓名:");
name = scanner.nextLine();
addressBook.removeContact(name);
break;
case 3:
addressBook.viewContacts();
break;
case 4:
System.out.print("输入要查找的联系人姓名:");
name = scanner.nextLine();
addressBook.findContact(name);
break;
case 5:
System.out.println("退出通讯录系统。");
scanner.close();
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
}
四、完整代码
以下是 Java 通讯录系统的完整代码,实现了增删查找联系人、用户交互等功能:
java
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class AddressBook {
private Map<String, String> contacts = new HashMap<>();
public void addContact(String name, String phone) {
if (contacts.containsKey(name)) {
System.out.println("联系人 " + name + " 已存在!");
} else {
contacts.put(name, phone);
System.out.println("联系人 " + name + " 添加成功,电话号码为 " + phone + "。");
}
}
public void removeContact(String name) {
if (contacts.containsKey(name)) {
contacts.remove(name);
System.out.println("联系人 " + name + " 已删除。");
} else {
System.out.println("未找到联系人 " + name + "!");
}
}
public void viewContacts() {
if (contacts.isEmpty()) {
System.out.println("通讯录为空。");
} else {
System.out.println("通讯录中的联系人:");
for (Map.Entry<String, String> entry : contacts.entrySet()) {
System.out.println("姓名:" + entry.getKey() + ",电话号码:" + entry.getValue());
}
}
}
public void findContact(String name) {
if (contacts.containsKey(name)) {
System.out.println("姓名:" + name + ",电话号码:" + contacts.get(name));
} else {
System.out.println("未找到联系人 " + name + "。");
}
}
}
public class Main {
public static void main(String[] args) {
AddressBook addressBook = new AddressBook();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\n通讯录系统");
System.out.println("1. 添加联系人");
System.out.println("2. 删除联系人");
System.out.println("3. 查看所有联系人");
System.out.println("4. 查找联系人");
System.out.println("5. 退出系统");
System.out.print("请选择操作(1-5):");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.print("输入联系人姓名:");
String name = scanner.nextLine();
System.out.print("输入联系人电话号码:");
String phone = scanner.nextLine();
addressBook.addContact(name, phone);
break;
case 2:
System.out.print("输入要删除的联系人姓名:");
name = scanner.nextLine();
addressBook.removeContact(name);
break;
case 3:
addressBook.viewContacts();
break;
case 4:
System.out.print("输入要查找的联系人姓名:");
name = scanner.nextLine();
addressBook.findContact(name);
break;
case 5:
System.out.println("退出通讯录系统。");
scanner.close();
return;
default:
System.out.println("无效的选择,请重新输入。");
}
}
}
}
五、总结
通过此次结对编程项目,让我深刻体会到了合作编程的优势。在我担任驾驶员时,两位伙伴的意见帮助我避免了许多常见错误;当伙伴担任驾驶员时,我也从旁补充了一些改进建议。我们使用通义灵码生成代码模板,再根据需求细化代码结构。在 AI 工具的帮助下,代码生成效率显著提升,同时结对编程帮助我们不断优化代码逻辑,提升了代码质量和解决问题的效率。
结对编程不仅提升了代码的完整性和严谨性,更让我们从彼此的思维中获得了宝贵的知识。对我以后得编程和学习之路有着巨大的帮助。