这次的作业是结对编程,因为一些原因我们的队伍一共有三个人,成员为:梁杰、夏天晗、谢祖三。由于大家不在一个班,交流起来也不是特别方便,所以我们经过讨论决定三个人约一个时间在一起完成这次作业。考虑到每个人的空闲时间,我们最后决定在周六的上午完成,地点是我的宿舍。本来准备去自习室的,但是考虑到讨论的时候声音可能会比较大影响到其他同学学习,所以换成了自习室。
周六上午集合之后,我们就开始了讨论。
首先要解决的问题就是用什么语言来写。我和夏天晗使用的是Python,谢祖三使用的是JAVA。仔细察看第3次作业的要求,我们发现第3次作业是要采用第2次作业比较好的那个同学的代码,以此为基础来开发界面。所以我们对比了一下第2次的作业代码,发现夏天晗同学的代码更加简洁,也没有错误,所以决定使用夏天晗同学的代码。决定了这个以后,因为我们大家都不太清楚Python和JAVA的代码如何进行交互配合,所以最后我们决定第3次的开发采用Python语言。
语言决定了,下面就是分工了。因为谢祖三同学使用的是JAVA语言,所以编码的工作就落到了我和夏天晗同学的身上。考虑到谢祖三同学虽然不太熟悉Python语言,但是语言功底很强,所以我们决定让谢祖三同学来做代码复审以及测试的工作。因为我之前开发过Python的应用,对wxpython(一个写Python界面的库)比较熟悉,所以决定由我来开发界面部分,由夏天晗同学开发逻辑部分。
分工之后,我们就正式开始了关于题目的讨论。
第3次作业乍一看好像和第2次差不多,但是经过仔细分析之后我们发现第3次作业中其实有一些难点。对应每个难点我们又着重讨论,最后确定了一套基本思路:
难点1:第2次作业的代码不能直接使用
解决办法:我们在第2次作业的基础上进行修改,在找最大值的过程中将最优子矩阵也同时记录下来,这样才能画出对应的矩形
难点2:保证只有一个界面在系统中运行,并且还要进行更新
解决办法:这个确实很难做到。我们查看了设计模式中的单例模式,经过研究后发现单例模式适用情景是一个程序中只有一个类实例,而第3次作业其实并不是一个单例模式,只能说是“单界面”。单界面本身并不难做到,只要在程序运行的开头判断一下是否已经有界面即可。但是难点就在于,如果在已经有界面的情况下再次运行命令,不仅要保证单界面,还要使新命令的结果也添加到界面上。这个最主要的问题就是如何使新命令传递给已经存在的界面。经过激烈的讨论,我们最后选定了一个解决方案,就是通过文件的方式来为主界面添加新命令。具体思路就是,我们有一个data文件,文件当中存储的是当前的所有命令。主界面会定期访问data文件,从文件中读取所有命令,如果发现有新命令就刷新界面。如果在已经有一个主界面的情况下再次运行命令,则会将新命令添加到data文件中并退出。这样就变相实现了通信。虽然不是最完美的办法,但是也可以解决问题。
难点3:如何让用户可以移动矩形
解决办法:虽然这个是选做,但是我们还是决定做一下,锻炼一下能力。经过讨论,我们最后的解决方法是,先将当前tab的矩形储存到一个临时数组中,然后再根据用户的移动方向,将临时数组中的矩形移动之后再写回tab中,这样就实现了移动矩形。
讨论出思路之后,我们就开始了实际编写代码。因为之前思路和分工都已经很明确了,所以编写起来也不是很费力。偶尔遇到一些小问题大家就会马上讨论迅速解决。每写完一个小功能,谢祖三同学就会马上进行代码复审以确定代码没有问题。这当中还有一个小插曲,就是夏天晗同学的编码习惯不是很好,变量总是随便起名,经过谢祖三同学的提醒之后,夏天晗同学马上注意到了这个问题,并在之后的编码过程中进行了改正。总的来说,编写过程比较顺利。
我们选择的测试方法是人工测试。因为这次作业涉及到运行多条命令,还有界面的操作,所以我们使用人工进行测试。各功能测试截图如下:
运行主界面:
$ python homework03.py \\v \\a \\h input1.txt
可以看到出现了一个tab,显示的是结果。红色代表最优子矩阵。
在已经有主界面的情况下再次运行命令:
$ python homework03.py \\h input1.txt
可以看到界面中出现了新的tab。同时注意到,根据命令行参数不同,矩形可以移动的方向也会不一样。如果只有\\h参数则只能左右移动。因为\\h是代表水平相连。
点击剪头向右移动:
可以看到矩阵向右移动了一列,之前的最后一列移到了第一列。
然后向左移动两次:
关闭tab:
可以看到窗口底部有命令解释,关闭当前正在查看的tab
点击Close之后:
可以看到tab被关掉了
退出程序:
点击之后退出程序
这是我们第一次结对编程,虽然大家开始不太习惯,也不太熟练,但是在交流的过程中慢慢掌握了方法,互相之间越来越熟悉对方的思路。总的来说,虽然有一些小地方还有待继续努力,但是总体来说我们已经意识到了结对编程的巨大威力,开阔了视野。
你现在使用的代码规范是什么, 和上课前有什么改进?
使用的是PEP8,Python的标准代码规范。上课之前虽然偶尔会用,但是并没有养成习惯。结对编程之后意识到自己的代码如果写的不规范会对别人造成很大的障碍,所以开始严格按照规范编码。
你的同伴有哪些优点 (列出至少三点), 和那些需要改进的地方 (列出至少三点)
优点:有毅力,思维活跃,开朗
缺点:代码不太规范,编程时候不够集中注意力,交流时候还不是很习惯提出自己的看法
你的代码从 作业2 到 作业3 经历了哪些变化? 哪些代码需要重构 (看关于代码重构的资料), 哪些需要重写, 为什么?
主要添加了记录最优子矩阵的代码,重写了返回值,将子矩阵也一起返回,方便主界面调用。
你的设计是如何保证 不同的 maxsum.exe 命令行最后在一个GUI 的界面显示的? (C++ 的设计模式中有 singleton 的概念, 说明一个类的实例如何在一个进程中保持单例, 我们这里谈的是软件如何在操作系统中保持 singleton)
参考“具体思路”中的详细解释,这里不再赘述。
Personal Software Process Stages |
时间百分比(%) |
实际花费的时间 (分钟) |
原来估计的时间 (分钟) |
计划 |
10% | 24 | 18 |
· 估计这个任务需要多少时间,把工作细化并大致排序 |
10% | 24 | 18 |
开发 |
85% | 204 | 153 |
· 需求分析 (包括学习新技术) |
15% | 36 | 27 |
· 设计复审 (和同事审核设计文档) |
10% | 24 | 18 |
· 代码规范 (制定合适的规范) |
5% | 12 | 9 |
· 具体设计 |
10% | 24 | 18 |
· 具体编码 |
35% | 84 | 63 |
· 代码复审 |
5% | 12 | 9 |
· 测试(自我测试,修改代码,提交修改) |
5% | 12 | 9 |
总结报告 |
5% | 12 | 9 |
总计 | 100% | 总用时 240 |
总估计的用时 180 |
之前忘了显示最大值,现在补上了。
因为实在不想所有图都重新截一遍了。。。所以就截一张展示一下吧。
可以看到右边箭头上方显示了最大值。