当前位置: 首页 > article >正文

结对编程 --- 软件工程

学号:202205010327 姓名:李一豪

学号:202205010350 姓名:苗毅诚

学号:202205010319 姓名:江峰

一、结对编程简介

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

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

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

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

  1. 添加联系人:通过姓名和电话号码添加联系人。
  2. 删除联系人:根据姓名删除联系人。
  3. 查看所有联系人:展示通讯录中所有的联系人信息。
  4. 查找联系人:根据姓名查找特定联系人。
三、结对编程与 AI 代码生成工具的协作过程

在本次实验的过程中,我们利用通义灵码完成了以下几个步骤。由我担任驾驶员,负责执行代码生成工具和整合代码;苗毅诚和江峰共同担任导航员,负责审查生成的代码并提出修改建议。在这一过程中,我们不仅能快速迭代功能,还能互相补充、优化代码。以下是具体步骤:

1. 创建通讯录类框架

​ 我们首先使用通义灵码生成了 AddressBook 类的框架。输入指令“创建包含通讯录增删查功能的 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 方法,将姓名和电话号码存储在通讯录中”后,通义灵码生成了以下代码:

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 方法,通过姓名删除联系人”获得了以下代码:

javaCopy codepublic void removeContact(String name) {
    if (contacts.containsKey(name)) {
        contacts.remove(name);
        System.out.println("联系人 " + name + " 已删除。");
    } else {
        System.out.println("未找到联系人 " + name + "!");
    }
}

​ 我们共同探讨后觉得,删除联系人之前的检查操作确保了不会出现无效删除。

(3)查看所有联系人功能
我们通过通义灵码生成 viewContacts 方法代码,确保能够查看通讯录中的所有联系人。

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 方法,通过姓名查找联系人并打印信息”获得以下代码:

javaCopy codepublic void findContact(String name) {
    if (contacts.containsKey(name)) {
        System.out.println("姓名:" + name + ",电话号码:" + contacts.get(name));
    } else {
        System.out.println("未找到联系人 " + name + "。");
    }
}
3. 用户交互逻辑实现

​ 为了增加实用性,我们通过以下代码加入了用户选择操作的交互逻辑。导航员建议使用 Scanner 读取用户输入的方式,并根据输入执行不同功能。

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 通讯录系统的完整代码,实现了增删查找联系人、用户交互等功能:

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 工具的帮助下,代码生成效率显著提升,同时结对编程帮助我们不断优化代码逻辑,提升了代码质量和解决问题的效率。

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


http://www.kler.cn/a/382600.html

相关文章:

  • Transformer究竟是什么?预训练又指什么?BERT
  • 边缘计算网关如何打造智慧变电站
  • kill-start系统进程的研究
  • 研究大语言模型在心理保健智能顾问的有效性和挑战
  • 太速科技-634-基于3U PXIe的VU3P FMC+数据接口板
  • OpenCV基本操作(python开发)——(8)实现芯片瑕疵检测
  • Java学习路线:Maven(二)scope、optional和exclusions
  • Late Chunking×Milvus:如何提高RAG准确率
  • C++ 新手指南:如何使用 set 和 unordered_set
  • 2024年10月个人工作生活总结
  • 【网络】传输层协议TCP(下)
  • Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具
  • javaweb基于springboot社区养老服务管理系统
  • 【Linux】——操作系统-进程详解
  • 使用 Flutter 绘制一个棋盘
  • 通讯录(C 语言)
  • Java基础概览和常用知识(二十)
  • rclone 挂载是否会占用服务器的存储
  • 【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
  • 《高等学校化学学报》
  • python 语法
  • 《质谱学报》
  • C++类和对象上
  • wps的Excel中使用条件格式
  • BM25:最佳匹配 ,文本相关性评分算法
  • 机器学习—代码中的推理