UI第三组总结 PB16150206朱池苇+PB16070837刘鼎乾

项目简介前端

    此次软件工程结对项目为制做一个给小学生用的四则运算出题软件,咱们分配到的是UI组,也就是负责人机交互使用Core组封装好模块。git

    GitHub地址:https://github.com/Ignoramus0817/Calculation-GUIgithub

 

需求分析ajax

  •  对上述各属性参数(生成题目的数量,操做数的数量,题目及答案中的数值的范围……)进行设置
  •  调用Core模块获得题目和运算结果,显示题目,接受输入,并能判断答案是否正确
  •  增长倒计时功能,每一个题目必须在20秒内完成,不然,得0分并进入下一题
  •  增长错题记录功能,对于答错的题,将其保存下来,当下次进行复习时,增大错题在练习题中的几率
  •  增长历史纪录功能,把用户作题的成绩纪录下来并能够展示历史纪录
  •  增长成绩分享功能,生成成绩单,想想成绩单里要展示什么,仅仅是最后的得分吗?错题的类型及数量?帮用户分析其薄弱的环节,提出合理的学习建议?
  •  对全部Core组的模块进行测试

团队分工算法

     结对编程做业大部分的时间都是采起共同编写代码的方式,即“一个作驾驶员,一个作领航员,驾驶员负责敲键盘,领航员在一侧提供建议、检查错误或帮忙搜索相关的资料。编程

     就此次团队项目而言,合做比较愉快。清明节的后两天两人一块儿学习了Qt。因为朱池苇对Qt比较熟悉,因此大部分程序都是朱池苇同窗做为驾驶员,而刘鼎乾同窗则做为领航员,与朱池苇同窗对问题进行讨论,查找资料,检查错误等。博客则由两人共同完成。json

 

PSP 表格前端工程师

PSP2.1 任务内容 计划完成须要的时间(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

 

代码规范架构

 

1、命名风格

 

一、文件名:一概小写。函数

 

二、类名:一概使用UpperCamelCase。

 

三、变量名、对象名、方法名(函数名):一概使用lowerCamelCase。

 

 

 

2、代码风格

 

一、4空格缩进

 

二、左花括号换行

 

三、不一样模块代码之间空行

 

四、预处理命令:

 

​ 文件包含:类和头文件分别集中,而且模块之间空格

 

​ 宏定义:宏名一概大写

 

 

 

3、其余

 

一、程序全部内容所有为英文,禁止出现中文和拼音,包括注释和UI界面文字。(博客下方展现代码块中注释是另外添加,程序中不含中文注释)

 

 

代码架构与具体实现

 

     UI界面布局设计由Qt Designer完成,而复杂逻辑则由Qt Creator完成。

 

     UI界面很是简单,因为使用qStackedWidget来实现翻页和题目的刷新,整个UI仅分为三个部分:主窗口CalGUI,存档对话框SaveSuccess,以及历史记录对话框History。绝大部分的功能都在主窗口上实现,存档对话框以及历史记录对话框仅有显示功能,所以着重介绍主窗口的结构和实现。

 

     主窗口上添加StackedWidget控件,分红三页:

 

     第一页:初始化生成条件

 

     本页主要由各类数字输入框(SpinBox)和选项按钮(CheckBox、RadioButton)构成,用SpinBox::valueCheckBox::isCheckedRadioButton::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()
{
}

     Next按钮控制界面的刷新(从新向控件中写入数据便可)以及对错的判断,判断正误,获取LineEdit中字符串,和答案字符串比较便可。若正确,作对的题目加一,若错误,存储至错题部分。

     将Timer的时间耗尽和Next的按下两个信号链接在一块儿,便可方便地实现时间耗尽自动跳转的功能,因为判断正误由Next控制,所以将二者合并不会形成误判。

     用两个QLabel分别显示当前题号和总题数。在Next槽函数中比较两个QLabel对应数字的大小(Qt提供了相关转换函数,很是方便),当前者大于后者时,进入显示结果页面。

     第三页:显示结果,存档和查看历史记录

     结果显示即为前面作题时存储的正确题目数量、错题、正确率的显示。

     存档按钮控制生成.txt存档文件(因为没有掌握对话框数据传递,偷了个懒不让用户自行输入文件名),历史记录按钮控制查看往期记录(包括时间、正确题目数、总题目数、正确率、错题、错误答案和正确答案)。比较简单。

 

测试结果

 

参数设置页面

 

 

开始答题前

 

开始答题后

 

结果(太难没法口算所以全错)

 

结果2(为了展现错题和正确率统计故意错一半)

 

历史记录对话框

BUG记录与分析

 

    一、LNK2019 没法解析的外部命令

 

     这是编写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

     其中-L后接.lib文件的绝对路径,-l后接.lib文件不加拓展名的文件名。若是路径中含有括号,应该使用$$quote()将路径括起。

     值得注意的是,假如须要将源代码发给他人,此处绝对路径须要修改成相对路径,不然没法正常加载。

     许多组发布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就不影响。但愿后面补作我的做业和结对编程时,不要放在和期末考冲突的时候,能够考虑放在暑假。
      三、我以为为了难而难是不可取的。有些时候加大难度我感受不是颇有现实意义。而咱们工科是很是讲究现实意义的。增长难度能够,但要创建在实际有用的基础上,若是为了难为咱们而故意弄一些很繁琐的事情,我以为并不可取。

 

  (朱池苇目前我选这门课的目的基本上都实现了:了解本身技术栈的缺陷、体验一下稍难一些的工程、磨炼编程技术和肝功能(逃)。所以意见也很少。主要以下:

  但愿能具体介绍一下哪一种工程师须要精通哪些技能(好比:前端工程师必须精通HTMLXML,JSCSSjsonajax等等),使咱们课外本身学习更有方向性,我在这方面比较迷茫,哪些东西是会有用的,它们是用来干吗的。若是能推荐一些教材或者学习时能够设定的目标等等就更好了。

 

团队项目如何改进    

  与结对编程相似,一个团队中通常都有所谓“架构师”“产品负责人”的存在,这些人对技术或是需求很是了解,他们应该成为团队的领航员,由他们规定工程的架构和规范,全部人须要根据他们设定的规则完成本身的工做。

  而复审工做则不是同时进行的,而是完成一个部分后将代码交由领航员审核,对其中不恰当的部分进行修正。

  同时组内工做职能相近的同窗也能够采用标准的结对编程方式。

相关文章
相关标签/搜索