项目简介前端
此次软件工程结对项目为制做一个给小学生用的四则运算出题软件,咱们分配到的是UI组,也就是负责人机交互,使用Core组封装好的模块。git
GitHub地址:https://github.com/Ignoramus0817/Calculation-GUIgithub
需求分析ajax
团队分工算法
结对编程做业大部分的时间都是采起共同编写代码的方式,即“一个作驾驶员,一个作领航员”,驾驶员负责敲键盘,领航员在一侧提供建议、检查错误或帮忙搜索相关的资料。编程
就此次团队项目而言,合做比较愉快。清明节的后两天两人一块儿学习了Qt。因为朱池苇对Qt比较熟悉,因此大部分程序都是朱池苇同窗做为驾驶员,而刘鼎乾同窗则做为领航员,与朱池苇同窗对问题进行讨论,查找资料,检查错误等。博客则由两人共同完成。json
PSP 表格前端工程师
任务内容 | 计划完成须要的时间(min) | 实际完成须要的时间(min) | |
---|---|---|---|
Estimate | 估算 | 15 | 15 |
Analysis | 需求分析(包括学习) | 135 | 200 |
Design Spec | 设计文档 | 15 | 15 |
Coding Standard | 代码规范 | 10 | 10 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 300 | 480 |
Code Review | 代码复审 | --(包含在编码过程当中) | |
Test | 测试 | 120 | 300 |
Record Time Spent | 记录用时 | 10 | 10 |
Test Report | 测试报告 | 20 | 40 |
Size Measurement | 计算工做量 | 20 | 10 |
Postmortem | 总结改进 | 180 | 180 |
Summary | 合计 | 885 | 1380 |
代码规范架构
一、文件名:一概小写。函数
二、类名:一概使用UpperCamelCase。
三、变量名、对象名、方法名(函数名):一概使用lowerCamelCase。
一、4空格缩进
二、左花括号换行
三、不一样模块代码之间空行
四、预处理命令:
文件包含:类和头文件分别集中,而且模块之间空格
宏定义:宏名一概大写
一、程序全部内容所有为英文,禁止出现中文和拼音,包括注释和UI界面文字。(博客下方展现代码块中注释是另外添加,程序中不含中文注释)
代码架构与具体实现
UI界面很是简单,因为使用qStackedWidget来实现翻页和题目的刷新,整个UI仅分为三个部分:主窗口CalGUI,存档对话框SaveSuccess,以及历史记录对话框History。绝大部分的功能都在主窗口上实现,存档对话框以及历史记录对话框仅有显示功能,所以着重介绍主窗口的结构和实现。
主窗口上添加StackedWidget控件,分红三页:
本页主要由各类数字输入框(SpinBox)和选项按钮(CheckBox、RadioButton)构成,用SpinBox::value
和CheckBox::isChecked
、RadioButton::isChecked
获取用户输入的值,而经过设定默认值和输入范围的方法,能够限制非法输入。
本页包含两个按钮(PushButton),Next和Cancel,Cancel顾名思义是退出,而Next则是说明已经设定完毕,能够开始作题,所以,Next的槽中调用了Core中的Setting接口。当用户按下Next时,各个参数已经设置完毕。
本页有两个按钮Start和Next,分别实现“开始”和“下一题”,Next按钮初始状态为隐藏,当Start被按下时显示。Start按钮使第一个题目显示在一个文本浏览框TextBrowser中,并使计时器开始倒计时。
倒计时的实现:
//添加在Start按钮按下信号的槽函数中 void CalGUI::on_startButton_clicked() { QTimer *timer = new QTimer(this); connect(timer,&QTimer::timeout,this,&CalGUI::timerUpdate); timer->start(1000); } //刷新时间的函数 void CalGUI::timerUpdate() { int a=ui->restTime->value(); if(a>0) ui->restTime->display(a-1); else ui->qNext->clicked(); //若是时间耗尽,发出Next按钮按下的信号,自动跳转至下一题。 } //timer的信号函数设置为空 void CalGUI::timeOut() { }
将Timer的时间耗尽和Next的按下两个信号链接在一块儿,便可方便地实现时间耗尽自动跳转的功能,因为判断正误由Next控制,所以将二者合并不会形成误判。
用两个QLabel分别显示当前题号和总题数。在Next槽函数中比较两个QLabel对应数字的大小(Qt提供了相关转换函数,很是方便),当前者大于后者时,进入显示结果页面。
结果显示即为前面作题时存储的正确题目数量、错题、正确率的显示。
存档按钮控制生成.txt存档文件(因为没有掌握对话框数据传递,偷了个懒不让用户自行输入文件名),历史记录按钮控制查看往期记录(包括时间、正确题目数、总题目数、正确率、错题、错误答案和正确答案)。比较简单。
测试结果
参数设置页面
开始答题前
开始答题后
结果(太难没法口算所以全错)
结果2(为了展现错题和正确率统计故意错一半)
历史记录对话框
BUG记录与分析
这是编写UI和对接过程当中遇到最多的一个BUG。
若是是在编写UI自己过程当中遇到,通常是给出了函数声明,可是没有具体实现所致使的,在.h+.cpp这种类定义和成员函数定义分离的状况下,此类错误极易出现。我认为较好的方法是,声明后马上在cpp文件中撰写函数定义,若是暂且不须要写,能够用花括号留空。
若是是在对接过程当中遇到,不多是相关函数core组同窗没有定义。则通常是lib文件没有正常加载,或者是dll文件的属性(位数x86仍是x6四、debug仍是release)与编译环境的属性不匹配所致使的。合理地发布SDK就能解决这种问题,所谓合理,指的是发布时分类,而且指明相应SDK的属性。
二、没法打开xxxx.lib文件
这是库文件没有正常加载致使的,Qt Creator中.lib文件的加载方式和VS中有所不一样,须要在.pro文件中新增格式以下的代码:
LIBS +=-L$$quote(D:\zhu\Software Engineering\2018-SE-Course\Calculator GUI\CalGUI\untitled\Core15\x64) -lCore15 或 LIBS +=-LD:\zhu\SoftwareEngineering\2018-SE-Course\CalculatorGUI\CalGUI\untitled\Core15\x64 -lCore15
值得注意的是,假如须要将源代码发给他人,此处绝对路径须要修改成相对路径,不然没法正常加载。
许多组发布SDK时仅仅注明了Qt for VS的使用方法,而忽略了Qt Creator的使用方法。
三、函数参数表没法将xxx转换为xxx
这种BUG本是函数传入的参数和参数表不一致致使的,是编程时出现的失误,为什么要在此处列出呢?由于Qt虽然支持部分C++库和语法,但二者仍然有区别。
好比Qt中的字符串类为QString,而C++中类为string(std::string),须要通过QString::fromStdString转换,才可使用。
这种差别的存在致使对接过程当中此类BUG大量出现,当心一些便可避免。
在与第七组对接后的BUG和解决方案:
一、显示结果页面正确率和正确题数显示不正常(因为计时器信号未阻塞,会致使正确题目数量不断增长,又因为正确率为实时计算,所以正确率也会不断增长),跳至结果页面后,阻塞计时器信号便可解决。
二、分辨率问题,控件没法自适应窗口大小和分辨率。修改UI布局能够解决(推荐刚开始编写UI时就考虑这个问题,不然会产生巨大的工做量)。
三、运行时有命令行(见上图),修改Qt设置文件,将CONFIG += console改成CONFIG += release便可。
由编程得出的一些建议
一、发布SDK时必定要根据编译环境和平台分类。
二、勤于写README,而且在写README时要考虑各类用户的需求(好比VS用户和Qt Creator用户)。
三、接口越少越好(接口数和参数数量折中)。
工做时刻
结对编程的意义相关
关于走上工做岗位后是否会选择结对编程
(刘鼎乾)我认为我会选择结对编程。不只是由于队友之间能相互找到彼此的灯下黑,还由于能在工做之余和别人进行交流,切磋。这也是不断提升本身,终身学习的有效途径。
(朱池苇)在工程须要迅速完成且规模不大时,我不会选择结对编程;但在工做量大的工程中,结对编程无疑是有其意义的。工程较大时,思路容易混乱,或者由于繁琐的各类定义而犯一些低级的错误。结对编程大大减小了这方面的成本。
课程建议:
(刘鼎乾)我认为邓老师确实很是很是负责,很认真地想把这门课上好,可是我以为仍是有一些问题。
一、上课不仅是讲软件工程的理论,还但愿能多讲一些实际编程有关的东西。
二、安排大做业和结对编程的时候,尽可能和期中考等考试分开,能不影响你们的gpa就不影响。但愿后面补作我的做业和结对编程时,不要放在和期末考冲突的时候,能够考虑放在暑假。
三、我以为为了难而难是不可取的。有些时候加大难度我感受不是颇有现实意义。而咱们工科是很是讲究现实意义的。增长难度能够,但要创建在实际有用的基础上,若是为了难为咱们而故意弄一些很繁琐的事情,我以为并不可取。
(朱池苇)目前我选这门课的目的基本上都实现了:了解本身技术栈的缺陷、体验一下稍难一些的工程、磨炼编程技术和肝功能(逃)。所以意见也很少。主要以下:
但愿能具体介绍一下哪一种工程师须要精通哪些技能(好比:前端工程师必须精通HTML,XML,JS,CSS,json,ajax等等),使咱们课外本身学习更有方向性,我在这方面比较迷茫,哪些东西是会有用的,它们是用来干吗的。若是能推荐一些教材或者学习时能够设定的目标等等就更好了。
团队项目如何改进
与结对编程相似,一个团队中通常都有所谓“架构师”“产品负责人”的存在,这些人对技术或是需求很是了解,他们应该成为团队的领航员,由他们规定工程的架构和规范,全部人须要根据他们设定的规则完成本身的工做。
而复审工做则不是同时进行的,而是完成一个部分后将代码交由领航员审核,对其中不恰当的部分进行修正。
同时组内工做职能相近的同窗也能够采用标准的结对编程方式。