结对编程 --- 软件工程

学号:202205010327 姓名:李一豪

学号:202205010350 姓名:苗毅诚

学号:202205010319 姓名:江峰

一、结对编程简介

结对编程是一种灵活高效的软件开发方法。在结对编程中,两人协作完成同一个任务------一人负责编写代码(驾驶员),另一人负责实时审查和提出改进建议(导航员)。两人可以轮流担任驾驶员和导航员,通过密切协作解决问题、分享知识,从而提高代码质量和开发效率。结对编程的优势在于它通过及时的反馈和讨论,帮助团队成员从不同视角解决问题,尤其适合新手或希望提升编程技能的开发者。

本次实验采用了结对编程的方式,我和我的两位编程伙伴采用了通义灵码这一 AI 代码生成工具,一同实现了一个简易的 Java 通讯录系统。接下来我们将分享项目流程、代码实现及结对编程过程中的经验。

二、项目概述:Java 通讯录系统

项目的核心需求是实现一个通讯录系统,包括以下基本功能:

  1. 添加联系人:通过姓名和电话号码添加联系人。
  2. 删除联系人:根据姓名删除联系人。
  3. 查看所有联系人:展示通讯录中所有的联系人信息。
  4. 查找联系人:根据姓名查找特定联系人。
三、结对编程与 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 工具的帮助下,代码生成效率显著提升,同时结对编程帮助我们不断优化代码逻辑,提升了代码质量和解决问题的效率。

​ 结对编程不仅提升了代码的完整性和严谨性,更让我们从彼此的思维中获得了宝贵的知识。对我以后得编程和学习之路有着巨大的帮助。

相关推荐
大黄瓜de冬天15 分钟前
list集合常见去重方式以及效率对比
java·spring boot·list
毕业设计制作和分享39 分钟前
ssm好例文共享平台的设计与实现+jsp
java·开发语言·vue.js·spring boot·毕业设计·mybatis
TANGLONG2221 小时前
【初阶数据与算法】线性表之顺序表的定义与实现
java·c语言·数据结构·c++·python·算法·面试
morning_judger1 小时前
【设计模式系列】桥接模式(十三)
java·设计模式·桥接模式
大数据编程之光1 小时前
【蚂蚁SQL面试题】蚂蚁数据研发一面面试题
java·sql·面试
API_technology1 小时前
java 串口 驱动
java·大数据·开发语言·数据库
蒋桐城1 小时前
Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
java·tomcat
GSDjisidi1 小时前
日语学习的难易程度
java·大数据·c语言·c++·python·学习
西瓜本瓜@1 小时前
在Android开发中如何使用OCR获取当前屏幕中的文本?
android·java·开发语言·智能手机·ocr
前端李易安1 小时前
ES6中WeakSet数据结构的常用方法和使用场景
java·javascript·es6