结对编程项目-最长英语单词链

1.课程班级及项目地址

2.预估&实际耗时

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1015
· Estimate· 估计这个任务需要多少时间9001000
Development开发630560
· Analysis· 需求分析 (包括学习新技术)80140
· Design Spec· 生成设计文档4050
· Design Review· 设计复审 (和同事审核设计文档)2025
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1520
· Design· 具体设计5040
· Coding· 具体编码300350
· Code Review· 代码复审4055
· Test· 测试(自我测试,修改代码,提交修改)180220
Reporting报告180150
· Test Report· 测试报告9080
· Size Measurement· 计算工作量2030
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划1015
Total总计25652750

3.看教科书和其它资料中关于 Information Hiding,Interface Design,Loose Coupling 的章节,说明在结对编程中是如何利用这些方法对接口进行设计的。

Information Hiding:在编写代码时,我们并没有建立其他的类,唯一需要引用的我们自己写的外部文件是core.dll,在函数的接口方面,和课程组提供的接口是大致相同的,除了我们利用的是vector作为容器,这方面安全性应和课程组的接口安全性一致。

Interface Design:在接口设计方面,我们对于函数传入和传出的参数都进行了规范,除了一些必要的参数(关乎我们使用的容器,比如vector),我们都和课程组提供的接口参数保持了高度一致。比如对于输出部分的函数output,我们定义为int output(char* result[], int paraN, int paraM, int paraW, int paraC)result[]是保存结果的数组,其他四个int型参数以0或1来标记是否存在。

Loose Coupling:在设计上,为减少模块间的依赖,整个程序被我们大致分为了输入,计算,输出三个部分,每个模块再由对应的一个或几个函数组成,以减少模块间的相互依赖(不过貌似必须层层递进,上一步做完这一步才能做,这也算一种依赖?)。

4.计算模块接口的设计与实现过程

计算模块的接口设计是按照课程组要求来进行设计的。

为了方便计算,我们在实现函数时对vector数组和char*数组进行了互相转换。将传入的char*数组转换为vector数组,由vector数组来进行核心计算。计算完成后再转换为char*数组保存结果。

具体算法实现为,将传入的单词利用二分法去重转换成全小写字母加入到vector数组中,再对不同首字母单词分类保存,这样知道该尾字母就可以立马找到下一个所需单词了,也就相当于构造了一个有向图,以便后续计算单词链。计算中最需时间的部分就是计算单词链了,该部分我们则是对上面图每个结点作为起点进行了一次遍历,将每个单词开头所能找到的走到尽头的单词链全部找到(无环和有环计算过程一致,但会因为传入的参数是否有-r来判断是否进行错误检查)。最后则是根据需求对链进行分割或者是判断最长,均是对上述找到的最长单词链进行一次遍历。

5.UML

计算模块的UML图如下:
UML图

6.性能改进

性能优化1
在输出所有单词链情况下,在性能占用方面,检查去重的开销尤为巨大(如上图所示)。我们对此尝试了优化处理。经发现,output数组中存在着由上一步走到尽头的单词链回退一步后的单词链,这对性能造成了一部分损失,我们对此进行了优化。在相同输入情况下,优化前后对比如下:
性能优化2
性能优化3
可以发现,用时及CPU占用相对都减少了。

7.Design by Contract,Code Contract

契约式设计在双方合作时能够使得双方的代码更好地契合起来,便于双方相互理解,能大幅提高代码阅读效率,便于之后的代码复审,出错时也能更有效地排查。缺点则是需要花费一定时间来制定双方都能满意的规范,且对双方都有一定的适应性要求,需要一段时间来适应,会一定程度上影响效率。

在此次代码编写时,我们对各种错误(我们认为的)都进行了分析,并在出错时对程序执行结束,用以避免出现其他情况以致误判。

8.单元测试

本部分主要是对core部分的4个函数进行测试及参数覆盖。
在构造测试样例时,我们主要是对参数进行组合来进行测试部分,对所有合法组合进行测试,以达到最后的结果。
以下只展示一部分:

-c及-r测试
样例1

-c及-h测试:
样例2
最后的代码覆盖率:
代码覆盖率

9.异常说明

这里借用项目中的表格来进行展示:
错误类型
因为以上输出均是在标准输出中,所以这里利用命令行程序来表示错误的实现(这里对保存单词链的数组最大开到了20010,实现这个比较困难,因为会数组越界,导致vs报错,但是最后还是得到了结果):
错误1
在这里插入图片描述
错误3
错误4
错误5
错误6
错误7
错误8
错误9
错误10
错误11
错误12
错误13
单词链数量过大利用了以下的测试文本:
测试文本
出错输出如下:
错误14

10&11 界面部分

本组并未进行UI设计,故这两部分缺失

12 结对部分

合作截图如下:
合作截图如下
结对是由另一位同学找到我,经多方面评估认为实力相当进行了结对。

13.结对编程优缺点

优点:可以弥补两个人之间互有的不足之处,发挥长板效应,依据能力分配各自任务。
缺点:需要一定契合度,两者思考进度无法保证一致,会导致代码完成时的一定时间上的延迟。

优缺点结对伙伴
优点沟通回应及时;代码完成较好;可以提出一些比较好的建议vs使用能力强;对代码理解及编写较快;做事迅速
缺点写代码较慢,需要查阅些资料才能更好下手消息回复延迟较高
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ChatGPT结对编程是一种将两个程序员合作编写代码的技术。这种技术可以提高编写代码的效率和质量,同时也可以提高两位程序员的技能水平。以下是ChatGPT结对编程的步骤: 1. 首先,找到一个合适的编程伙伴。最好是一个有一定编程经验的人,但如果你是新手,也可以与另一个新手合作。 2. 确定你们编写的代码项目。你们可以选择一个共同感兴趣的项目或者一个有挑战性的项目。确保你们都对项目有一定的理解。 3. 确定你们的角色。一个人可以担任主要代码编写者,另一个人可以担任代码审核者。这样可以确保代码的质量。 4. 确定编程环境。你们可以使用一个共同的编程环境,如Visual Studio Code或者Atom。也可以使用在线编程环境,如CodePen或JSFiddle。 5. 开始编写代码。一个人负责编写代码,另一个人负责审核代码。在编写代码的过程中,你们可以随时通过聊天工具进行交流和讨论。 6. 定期进行代码审核。定期进行代码审核可以确保代码的质量。你们可以定期的分享代码,并相互审核对方的代码。 7. 完成项目并进行总结。完成项目后,你们可以总结你们的经验和教训,并提出改进建议。这将有助于你们以后更好的编写代码。 总之,ChatGPT结对编程是一种非常有用的技术,可以提高编写代码的效率和质量。通过合作编写代码,你们可以相互学习,相互支持,以及增强你们的编程技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值