• 结对编程——经验教训总结


    结对编程之经验教训总结

    “宝剑锋从磨砺出,梅花香自苦寒来。”

    整整做了一个星期,终于将结对编程项目做完了,多少心酸只有自己知道,多少成就感也只有自己知道。这是真正自己动手,从最初的一头雾水到现在水到渠成,为自己鞠一把辛酸泪的同时,不禁也有一丝自豪:我还是很厉害的,用心去做还是能做出来的。

    项目思路

    我和队友的个人项目都是用C++写的,因此,这个结对编程我们选择的软件是QT。

    我们把项目分为了两个部分:登录注册部分、题目显示部分。

    登录注册部分我们做了四个界面:登录界面、注册界面、设置密码界面和修改密码界面;

    题目显示部分有三个界面:选择类型界面、答题界面和成绩界面。

     

    在制作时,我们先做出界面的基本框架,运用现学的知识,使用槽对界面进行连接,通过这种方式建立类与类之间的内部关系。然后我们再实现各个部件的功能,完成相应模块的代码,当然这其中出现了很多bug,我们一直在不停的debug。最后,当功能点都实现了之后,我们又花了一天半的时间对界面进行布局美化,同时测试运行,完善功能。

    个人项目复用

     虽然这个结对编程和个人项目有所关联,但是在实现的时候并不是很一样,除了生成试卷的函数进行了复用,其他的基本上都是重新写的。因为这里用户名和密码不是固定的几个,而是要用手机号注册,密码也是用户自己设置的,因此,个人项目的登录在这里就无法直接用了。个人项目中并没有计算出题目的答案,而在结对编程中又要有正确答案的选项,因此这部分也是要重新写的。而查重那一部分,由于个人项目的要求是同一个账户生成的试题不能重复,因此需要从文件的角度来进行查重,但是结对编程只需要保证一套卷子的试题不重复就可以了,这里使用vector数组就可以了。个人项目需要切换账号,但是结对编程并没有这个要求。综上所述,我和队友都感觉只有生成试卷那部分代码重用了,其余都是要重新写。当然,生成试卷的这部分代码是整个项目的核心,由于个人项目完成了,在这方面我们就省了很多时间,所以我们的结对编程的时间基本上都在可视化界面上。

    教训总结

    1、结对编程中,我得到一个结论,那就是1+1>2,我自认为,如果不是合作编程,在遇到问题我一定会花费更多的时间解决,我做出来的东西也会有很多功能没有实现,很多细节没有考虑。最重要的是,当思路陷入死局的时候,两个人一起讨论更容易打开思路,走出困境。

    2、要养成一个记录的好习惯。在我们结对编程刚开始的时候,遇到很多错误,但是通常我们是遇到一个解决一个,可是到了最后却发现前面解决过的问题,后面又不会解决了。这里最明显的是输出问题,由于我们对qt语言的不熟悉,不怎么会debug,结果不对的时候就把中间变量输出,但是又不知道怎么输出QString变量。最初找到了一种解决方案,输出了一次,解决了当时的问题,但是后来需要的时候,又忘了如何输出,又重新百度,浪费了很多时间。然后从这个时候开始,我们才意识到应该用一个文档记录我们遇到的问题,并附上解决方案,这样才会学到更多的东西。文章最后附上了我们从开始记录之后记录到的问题。

    3、学无止境。虽然这个项目做完了,但是我知道,这个项目实现的功能其实很简陋,还有可能在后面测试的时候又发现了现在没有发现的问题。在最后完善代码的阶段,每次我们感觉已经很完美了,但是一测试,又有一些小小的问题,然后我们就要开始修改。好在,这个项目我们都是分类写的,遇到问题修改起来还是有头绪有思路的,这又一次证明了模块化编程对于维护修改的重要性。

    4、沟通很重要。在整个项目,由于沟通的问题,原本想表达的意思对方get不到,因此起了好多次争执,其中还有几次我们争执到最后发现我们要表达的意思是一样的。这样子的情况花费了我们很多时间,但同时也锻炼了我们,到后面我们交流起来就比开始的时候顺畅多了。同时,我个人习惯的不同,我个人习惯由难到简,由面到点,但是队友习惯从简入难,由点及面,这个也不能说谁对谁错,主要还是要交流沟通,互通有无,取长补短。

    5、控制情绪,心态平和的写代码。由于这个结对编程的工作量大,时间紧,中间又夹杂着很多其他的事情,因此我们都有些暴躁,尤其是遇到问题,就更加暴躁了,唉声叹气传递负能量,最终也不能解决问题。后来我们学习其他小组,彼此打气,互相鼓励,效率高多了。

    总而言之,每次的实验都是一次学习进步的机会,这次的结对编程,真的让我们受益颇多。

     

    附录:

    1、输出QString user;
    方法一:
    QByteArray userName = userRead.toLocal8Bit();
    std::cout<<userName.data()<<std::endl;//需要头文件iostream
    方法二:
    user.sprintf("%s",user);
    方法三:
    cout<<code.toStdString()<<endl;//需要头文件iostream和using namespace std;
    2、connect函数中槽不能和自定义命名相同,不然会执行两次,比如说logindialog中。
    3、正则表达式验证密码6-10位,必须包含大小写字母和数字
    4、逐行读取文件:
    QFile readFile(userRead);
    QTextStream readStream(&readFile);
    while(!readStream.atEnd()){//注意这里是readStream而不是readFile
    }
    5、头文件中有using namespace std的时候,可以直接当做C++使用,即string、cout等都可以直接用。
    6、在定义对象的时候,会自动调用构造函数。在构造函数的时候,传参还没有完成,因此从构造函数中输出的是固定的初始值。
    7、界面美化问题
    由于不同电脑的分辨率等不同,因此会出现在一台电脑上看起来正常,但是在其他电脑上控件不能完全显示的问题。
    解决方案是将文本框与界面同宽,然后居中设置、右对齐设置等。
    8、当关闭一个界面的时候,里面的所有数据都关闭了,因此如果需要保留数据,在重新打开的时候,一定要再次进行赋值。
    这里是因为我们测试修改密码的那个功能时,登录状态下不能修改两次以上,我们不停的尝试,后来发现,从修改界面回到选择界面的时候,是新建的窗口,因此原来从登录界面传过来的数据就已经不在了,如果想要一直保存这个数据,在修改界面回到选择界面之前,将用户名再次传入。
  • 相关阅读:
    盒子阴影——Box-shadow
    Flex布局
    常用正则表达式
    选择器
    上传头像功能
    利用百度地图API获取用户浏览器所在省市区
    Android Studio编译运行卡慢的解决方案
    Laravel5.5 解决时区设置差8个小时解决办法
    Git:远程代码与本地冲突常见解决方法
    vue-element-admin解决跨域问题
  • 原文地址:https://www.cnblogs.com/qszy-yhh/p/11601249.html
Copyright © 2020-2023  润新知