需求分析与设计思路:
这次结对编程目的是完成一个带UI的小初高数学学习软件,
相对于个人项目,增加的功能大致包括:
- 采用图形用户界面形式
- 实现注册功能,对注册手机号发送验证码完成注册并保存用户数据
- 登录状态下用户可修改密码
- 用户在做题过程中,题目以选择题形式出现
- 系统需根据用户做题正确数量给出以百分比形式计算出的评分
其中主要难点就在于新增UI界面、根据生成题目计算出正确答案这两个模块,和队友对项目进行需求分析如下(初始设想与大致流程图,实现时有完善过程):
(字比较丑(-_-)忽略这个)


队友负责实现图形用户界面中的各个逻辑以及验证码部分即4、5模块,
我负责实现各个具体函数为图形用户界面服务即后端内容,即1、2、3模块。
对难点的设计构想:
我负责的模块中主要难点就是题目的生成与计算。
首先出题逻辑是可以复用的,只需要算出每道题的答案并保存即可。
在得到题目后,我觉得首先的任务是去除表达式的‘√’等复杂运算符,转换为纯浮点数的四则运算。
其次浮点数四则运算可以由中缀式转换为后缀式即逆波兰式进行计算:
将一个普通的中序表达式转换为逆波兰表达式的大致算法可参考:https://blog.csdn.net/qq_37969433/article/details/81200872
最后就是生成选项部分,我是采用随机数的方法将正确选项随机分配给A/B/C/D,然后随机生成其他三个互不重复的答案,存放在一个字符串中,将此字符串添加到一个文档里,便于队友读取答案选项及正确答案。
总结与感想:
·复用个人项目实现结对编程项目:
我负责的三个模块中,其实大致逻辑与个人项目类似,只不过由于新增了UI界面的需求,所以采用了java编程语言去实现,主要就是要将C代码转化为java代码,其中许多方法不同,所以需要修改,但是大致思想未变,而且因为队友本来就用的java实现,所以我文件操作的部分模块是直接复用了队友的个人编程项目中关于文件操作的实现,除了因为需要计算答案并且要配合队友前端的实现所以在个人项目的基础上稍微修改了部分内容,基本上都可以复用。
关于计算答案,我是直接套用了之前生成试卷的逻辑,然后在生成试卷时多加了一个字符串去存储计算式(相较于试题,此式子是经过tan/sin/cos/^2/√等复杂符号运算之后得到的简单计算式,因为我是一个操作数匹配一个复杂操作符这样去生成的试题,所以这个计算很简单,直接用java中的Math库自带函数计算即可),这样这部分的代码几乎不需要修改,只用再编写一个根据这个字符串—中缀表达式转换为逆波兰表达式并计算的模块即可。
关于查重,我本来想直接使用我个人项目中实现的查重模块,但是从C++到java还是有很多改变的,C++中使用的函数在java中没有,所以结对项目中的查重模块中我虽然还是采用了将不含题号的试卷题目放入一个查重文档中然后每生成一道题目就与文档逐行对比检查是否重复的思想,但是具体实现上有了一些改变,先将文档内容逐行读取存放在一个ArrayList中,然后对其中存储的字符串进行处理即对比。
有了查重模块后,我对于登录模块中判断密码是否匹配时需要用到的根据电话号获取其对应密码以及修改密码模块中根据用户电话号修改其对应密码这两个部分我都采用了与查重模块类似的方法,只不过在这两个模块中还需要用到字符串分割去分别获取电话号和密码。
·结对编程的经验:
对于结对编程项目,我觉得选择了一个好队友就已经成功了一半!吴同学真的是中国好队友,这样的神仙队友我可以再来一打(^-^) 虽然是第一次组只有两个人的队伍,但是我们从 分配任务->合并代码->测试代码->不断修正->项目完成 都很顺利,合作非常愉快(也有可能是我单方面被大佬带飞所以很顺利)!
我觉得主要是要多沟通,先把框架搭好,然后分工去具体完善框架内容,完善过程可能会改变最初的构想,这时候就要及时与队友沟通,告诉对方自己做出了哪些改变,以便对方做出相应调整。
而且由于所给功能描述并不全面,我们可能需要按照自己的理解去完善整个框架,比如一个账号已经注册但又注册了一次并且密码不同时应该怎么去处理(我们就采用了将其密码直接修改为最新一次注册时输入的密码这种逻辑),这个时候一定需要两个人事先沟通商量,达成一致意见后再在自己的模块后按照沟通后的想法去实现,不然最后的实现可能会很乱。
·结对编程的教训:
教训就是完成自己的模块之后千万不要偷懒,一定要进行#全方位#的测试,多多益善,不然直接发给队友后会让队友来告诉自己哪些地方出现了问题需要修正(*_*)
/* PS:尽量避免体验这样一个提醒自己到底有多菜的过程。*/
浙公网安备 33010602011771号