结对编程——带UI的小初高数学学习软件
这次项目是在上次个人编程的基础上增加了些许功能以及要加上UI界面。非常不幸地是,我和我的搭档在编写个人项目时都非常默契地没有先见之明地用C++写的代码,准备下载阿里云短信验证码的sdk时,发现居然没有相应的版本。被现实抛弃了之后,我们终于被迫用Java从头再来。(大哭)
下面就来讲一讲我和我搭档的血泪史。。。
新增加的需求
1、用户注册功能。用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册;
2、用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功。密码6-10位,必须含大小写字母和数字;
3、密码设置成功后,跳转到选择界面,界面显示小学、初中和高中三个选项,用户点击其中之一后,提示用户输入需要生成的题目数量;
4、用户输入题目数量后,生成一张试卷(同一张卷子不能有相同题目),界面显示第一题的题干和四个选项,用户选择四个选项中的一个后提交,界面显示第二题,...,直至最后一题;
5、最后一题提交后,界面显示分数,分数根据答对的百分比计算;
6、用户在分数界面可选择退出或继续做题;
项目工作的分配
我的搭档:出题及界面模块,计算正确答案及界面模块,计算分数及界面模块,整体大致框架的设定。
我:手机号注册及界面模块,登录及界面模块,题目查重模块,最后的整合。
关于我们的代码(就不班门弄斧地贴代码了)
mian是主函数入口。
下面介绍各部分代码:
Register:实现输入手机号,向该手机号发送验证码,输入验证码点注册后,跳转至设置密码界面(Login)
Login:实现设置密码功能,设置成功后跳转至登录界面(Login2)
Login2:输入一开始的手机号及密码,若匹配成功则跳转至选择难度及题数界面(SelectSurface)
SelectSurface:选择难度及题数界面,确认后跳转至刷题界面(TestSurface)
TestSurface:若达到出题数,则跳转至分数界面(LastSurface)
LastSurface:显示分数,若点击continue,则回到选择界面,若点击leave,则结束程序。
PaperGenerate:生成试卷的类,其中,哈希查重模块也在此函数里。
Calculate:计算答案模块
sms:发送短信验证码模块
----------------------------------------------- 我是分界线 -------------------------------------------------
我亲爱的搭档对于她负责部分的思考:
对于生成试卷这部分, 难点在括号处, 把可能的括号位置列了出来, 随机数来决定插入几个括号, 将运算式分解成string数组, 将运算符和操作数分开, 将括号插入到操作数中, 类似的初高中的三角函数和开方平方也是这样实现的。
对于计算答案这部分, 是将string数组变成后缀表达式, 这样是由于后缀表达式(指的是不包含括号, 运算符放在两个运算对象的后面, 所有的计算按运算符出现的顺序, 严格从左向右进行不再考虑运算符的优先规则)通过栈的压栈弹栈, 将括号去除, 变成后缀表达式后, 先将arraylist中的三角函数平方开方计算出来, 形成新的arraylist, 再进行后缀运算式的计算。
对于界面的生成, 对按钮进行监听, 然后将此界面dispose, 再new一个新的界面出来并初始化这个界面, 大致的功能就实现了。
在进行测试的界面中, 由于用户可能先选择A后又修改成B, 所以选项的监听中不能出现正确题数增加的语句, 而是应该通过修改标志值然后在next的监听中进行判断, 实现正确题数的增加。
(我的搭档真的考虑得灰常全面!)
我对于我负责部分的思考:
短信验证码模块:天呐~阿里云的后台人员实在是太铁面无私了。。。整整两天,不间断申请短信签名就是不通过,最后撒娇卖萌也无济于事(大哭)。。。终于,得高中同学微信公众号后台截图相救,把短信签名拿下。接下来便是如何把下载下来的sdk加到自己的项目中,从网站上下载的sdk有很多代码是没有用的,这时,需要我们仔细阅读代码上的注释,搞懂真正要往项目里加的是哪一部分。历时一下午,终于,短信验证码成功实现。
注册和登陆模块:这些功能的实现,我采取的我的搭档的方法,监听按键后,new一个新的窗体,销毁之前的窗体,这样就实现了跳转。登录的实现,我采用将注册时用的手机号和密码存入文档中,登录输入时,与文档进行比对。
下面让我来谈一谈最糟心的整合所有代码部分!!!!:
其实我和我的搭档在十一放假之前就已经把大致的各个功能模块都运行得差不多了。于是,天真的我非常愉悦地想:各个代码模块都运行得挺成功的,整合还不容易?!就心大地把代码抛之脑后,无忧无虑地出去浪了三天半。然鹅,回来打开电脑开始整合的那一瞬间,整个人都不好了。。。
首先,我要把我的查重功能与搭档编写的生成试卷的代码整合到一起。
“哎?亲爱的?你这个函数里的这个参数是什么???”
“在吗?你这个函数的这个部分是怎么回事儿???”
在假期过去一半儿之后,我可怜的搭档开始频频接受来自无知少女的骚扰,终于查重模块加进去之后,随着我的不断测试,新的bug出现了!!!!!!
那就是,在计算答案部分,遇到两个以上括号时,会计算不出来。由于这部分代码不是我写,而搭档远在外地,身边电脑并没有修改代码的环境,一切看起来如此的艰难。这里我不得不向大家推荐一款远程遥控电脑的好软件——Teamviewer,最重要的是,这个平台的远程操控没有卡顿!!!!通过这个平台,在我紧急呼唤搭档之后,搭档便可在异地操控我的电脑进行代码的修改。后来发现此bug是因为判断括号位置时忘循环所致,而当初搭档测试时,由于其程序的随机性,并未出现此错误。
一个bug解决了,后面还有千千万万个bug在等着你。。。
--------------------------------------- 崩溃分界线 --------------------------------------
真正的程序媛敢于直面惨淡的代码和无穷无尽的bug!!!!
这一次新出现的bug着实让我和搭档头痛无比。这个bug便是——程序运行得好好的,突然不一定啥时候,就莫名抽风,界面消失。打开任务管理器,显示窗口是在运行中的,可是我们的代码中有用到setvisible(true)呀!于是我们开始呼叫度娘。然鹅,度娘有的时候并不好用。终于我和搭档在翻了不知道多少网页之后,看到了一条对我们有用的信息。
敲黑板!!!!!划重点!!!!!
java中的setvisible(true)目的是使控件可以显示出来,如果该控件已经被显示出来,那么该方法是控件显示在窗口的最前方。但其使用的位置需要注意。setVisible的对象一般是该对象的使用者调用的。如果setVisible在某个控件的内部,那么在setVisible函数后面添加的控件就显示不出来了。原因就在于,setVisible(true)并不是告诉JVM让该控件可见,而是在内部调用repaint方法把各个控件画出来进行显示。如果在控件还没完全添加完其他控件就setVisible(true)那么在方法后面添加的控件都不能显示。那为什么我搭档在计算部分测试的时候没有出现bug呢?因为在代码不多的情况下,不放在最后出现BUG的概率不大,当代码量大的时候会导致内容不能显示。
通过上面这句话得到启示,修改完代码后,通过5次左右的测试,嗯,没有再出现这个问题,我和我搭档悬着的心落下了~然鹅!第二天,当我再次打开电脑开始运行的的时候,这个bug又出现了。(欲哭无泪)
我反反复复地变着法儿地去搜索原因,但都没有找到对口的。最后迫于无奈,我只好自己从头捋代码。突然想到,setVisible(true)的位置会导致运行出错,那是不是还有函数的位置也是有讲究的呢?如果是界面出现错误的话,会不会跟dispose()的位置有一定关系呢?经过种种实验,确实与其有关。
我们在跳转窗口时是需要new一个新窗口,销毁当前窗口,这时,dispose()一定要放在new语句的后面,否则界面有时会抽风不显示(我也不知道这么改对不对,有没有什么道理,但是实践告诉我,这么改应该是对的~~~~)
终于我们的代码大致完成了!(撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。)
运行结果 (部分截图)
显示题目及正确答案
结对编程的收获
通过这次结对编程,对JAVA有了更深一步的了解,在查阅各种资料的时候,也有许多额外的拓展供我们了解。
同时,也清楚地意识到了队友之间沟通的重要性,以及代码规范性带来的高效率。
我和搭档也体会到了测试代码的绝望。由于程序的随机性,有的bug一开始不会出现,需要不断地大量的测试,才会出现。这也说明了为什么一个项目最后要有稳定性测试。
此外,我们认为非常有必要进一步学习多线程编程,这样可以防止程序卡死的情况。
总之,实践是最好的老师,以前大部分时间都只局限于书本上的理论知识,所以编程能力奇差无比,通过这两次的实践,掌握的知识要比看书本多得多。这次的结对编程也为接下来的团体项目打了一定的基础。要说让我总结这次学到的最重要的是什么,那一定是学会沟通!
最后,为我和搭档愉快的合作干杯[]~( ̄▽ ̄)~*