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


结对编程之经验教训总结

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

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

项目思路

我和队友的个人项目都是用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、当关闭一个界面的时候,里面的所有数据都关闭了,因此如果需要保留数据,在重新打开的时候,一定要再次进行赋值。
这里是因为我们测试修改密码的那个功能时,登录状态下不能修改两次以上,我们不停的尝试,后来发现,从修改界面回到选择界面的时候,是新建的窗口,因此原来从登录界面传过来的数据就已经不在了,如果想要一直保存这个数据,在修改界面回到选择界面之前,将用户名再次传入。 优质内容筛选与推荐>>
1、Redis学习-复制
2、设置页面所有控件
3、[转]博弈论(二):Sprague-Grundy函数
4、.NET泛型解析(上)
5、NSString与NSMutableString


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号