GitHub:https://github.com/zsl1996/UI/commits/master
一、 实验内容
这是交付给最终用户的软件,有一定的界面和必要的辅助功能。完成Windows和Linux电脑图形界面的程序,需实现以下功能:
l 对上述各属性参数(生成题目的数量,操作数的数量,题目及答案中的数值的范围……)进行设置
l 调用Core模块得到题目和运算结果,显示题目,接受输入,并能判断答案是否正确
l 增加“倒计时”功能,每个题目必须在20秒内完成,否则,得0分并进入下一题
l 增加“错题记录”功能,对于答错的题,将其保存下来,当下次进行“复习”时,增大错题在练习题中的概率
l 增加”历史纪录“功能,把用户做题的成绩纪录下来并可以展现历史纪录
l 增加“成绩分享”功能,生成成绩单,想一想成绩单里要展现什么,仅仅是最后的得分吗?错题的类型及数量?帮用户分析其薄弱的环节,提出合理的学习建议?
二、 设计方案
技术选型:
- C# 是微软收购不成JAVA搞得一套IDE开发框架,高效但封闭,只能在WIN下运行,对跨平台支持不太好,C# WPF不开源,遇到坑只能绕开。
- QT是一套为了开发C++ 图文界面而作的一套IDE开发框架,、是一款既可以开发UI界面也可以开发非UI界面的工具程序,也可用来开发服务器。QT作为跨平台开发工具,现今支持的系统有:WINDOWS、IOS、OSX、ANDROID、Linux、UNIX 等等;
考虑到需要跨平台,本次选择Qt&C++做开发。
三、 界面细节以及BUG修复
- 界面首页,设有答题、设定、答题记录、成绩分享及分析四个菜单栏
在一个centerwiget放置4个wiget,利用点击事件与wiget的show(),close()函数实现四个功能界面的无缝切换.
例如点击设定界面,就激发其他三个界面的close(),仅仅让设定界面展示出来:
开发过程的bug:在图形界面开发(拖拽),四个界面很容易相互包括,最终在代码中设定正确的父类解决。
- 开始答题后界面,在方框中输入答案,确认键和enter均可提交。
使用时候应先点击开始答题计时器启动,减到0自动进入下一题。
增加复习模式,此模式是在代码中增加一个vector保留所有错题,在选择复习模式后,会循环所有错题,直到所有题目都答对。
题目显示框设为不可编辑,避免复制到计算器作弊。
增加平均分功能,注意此为此阶段(即core中的一次产生题目数目)的平均分,成绩分享中的平均分为此次打开软件所有的题目(有可能利用core产生多次题目)的平均分。
计时器是绑定一个1s触发一次的定时器,计时结束会自动跳到下一题。
因为20s事件有时候来不及点击鼠标,加入了了enter快捷键,代表确认。
开发过程的bug:
这个界面是最麻烦的,因为涉及事件最多,最开始每个槽函数我们都单独写处理,后来发现,其实就两件事,一个是正确的保存数据,再一个就是合理的刷新界面,这样分割出void MainWindow::pushvector(),int MainWindow::RefreshUI()后,整个代码的可读性与逻辑都变得清晰了许多。
再就是解决三个按键的点击顺序,最开始乱点会出现bug,后来利用flag进行限制,得到解决。
- 一组题目回答完毕后显示答题结束
交互中多处利用提示框对下一步操作进行提示或者对不当的操作进行警告
开发过程的bug:
显示中文时候,有些时候会变成乱码,没有解决,部分不得不改为英文。
- 题目设置菜单,可进行题目个数,运算符种类,最大操作数,是否支持整数、分数、小数、乘方运算设置;确认后保存设置即可,或恢复默认设置。
可以进行题目要求的所有设定,可以恢复默认选项,设定成功会出现提示框。
- 查看近期答题记录
在此可以查看回答过的所有题目,包括复习模式中回答的题目,对用时,得分都有显示,实现是用的Qtablewiget实现,自动关联滚动条,非常友好。
开发过程的bug:
:因为储存方式不对,最开始的时候用时以及题目数目都不对,多次样本单步运行debug,多次更改了答题界面逻辑才解决。
- 勾选方框,进入复习模式,循环做错的题目,遍历结束提示复习完毕。
使用的是一个vector装错题,答对了就去除掉,只有所有问题都答对才会结束此模式。
开发过程的bug:
最开始一开始就选择复习模式,并直接答题,得分会变成100,加了判别vector是否为空。
- 成绩分享菜单内,对近期成绩做出分析,提供分享。
平均分50以上建议加大难度,50以下建议建议使用复习模式。
Bug解决:依旧是文本框settext()设置中文会乱码,不得不使用中文。
四、 结对开发流程
- 各自分析题目,做技术选型,交流讨论,确定方案。
- 确立代码风格规范及开发规范。
- 学习“三明治”提建议方法。
- 采取一小时轮换制。
- 驾驶员:选取模块进行开发,做单元测试。
- 领航员:监督驾驶员对开发流程的执行,考虑单元测试的覆盖率。
五、 BUG分析
详见三、界面细节部分各功能详情。
六、 经验总结
- 结对编程的意义
首先不得不承认,每个在各自独立设计,实现软件的过程中不免要犯各种错误。在结对编程中,因为有随时的复审和交流,每个人都有强项,恰恰与木桶效应相反,最后的结果是各方面两个人的最高水平!这样,错误少了,程序的初始质量就高很多。自然省下很多修改时间。尤其是对于(==写成=)这种低级无脑难以发现的问题。
结对编程的过程也是一个相互督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。这种督促的压力,让双方都变得更有执行力。
磨练了两个人的友谊,如何怼的别人心服口服,还能继续做朋友。
2.工作后是否选择结对编程
如果可以的话,我选择和女生结对编程。
工作中他一方面可以提高效率:结对编程的主要目的是控制品质和风险,同时建设团队。会给人看的代码和不会给人看的代码品质上有天壤之别。经过讨论的实现也往往比自己独自决定的考虑的更加全面。技术细节掌握在一个人手里对于团队是危险的。而结对既可以让避免这种情况,还能让工程师更快的进步,让团队更多交流,更加融洽。要说效率,两个高度自律的高手结对编程可能在效率上要付出代价。但是即使如此,也是完全值得的。另一方面,好的品质,会让测试更顺利,对应需求变化更快速。也可以说是增加了效率。
结对编程绝对可以大幅度提高工作效率,但同时,他让工程师一分钟都不能走神,每天高强度工作n个小时。结对编程虽然很好,但绝对是大体力劳动,太累人,不是一般人干得来的,实践当中很少有团队能够坚持下来。
3.学到的经验
规划时间,增加执行力,通过别人监督使自己工作时更专注避免犯错,学会给对方积极的反馈,三明治方法几乎可以适用于左右的情况。团队和睦共进才是生存之道。
4.关于对接,起初每次对接一个组,我都要修改事件函数,后来想到我自己定义一个接口为myapi.hpp,定义我自己的设定函数,然后对接每个组的core的时候,只需要在myapi中调用他们的设定函数,但是传出我需要的参数,实现view与control的分割(MVC框架思想),大大加快了对接速度。
七、 PSP表格
附、 课程建议
希望能有学习的过程,而不是通过留作业的方式倒逼学习。作业繁重,远远超出两个学分的任务。