结对编程-经验总结
这次结对编程我和冯同学组队,为了加快开发速度,我主要负责前端的UI设计以及函数调用,冯同学则是负责后端的函数编写。
一 需求说明
用户:
小学、初中和高中学生。
功能:
1、用户注册功能。用户提供手机号码,点击注册将收到一个***,用户可使用该***完成注册;
2、用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功。密码6-10位,必须含大小写字母和数字。
用户在登录状态下可修改密码,输入正确的原密码,再输入两次相同的新密码后修改密码成功;
3、密码设置成功后,跳转到选择界面,界面显示小学、初中和高中三个选项,用户点击其中之一后,提示用户输入需要生成的题目数量;
4、用户输入题目数量后,生成一张试卷(同一张卷子不能有相同题目,题目全部为选择题),界面显示第一题的题干和四个选项,用户选择四个选项中的一个后提交,界面显示第二题,...,直至最后一题;
5、最后一题提交后,界面显示分数,分数根据答对的百分比计算;
6、用户在分数界面可选择退出或继续做题;
7、小初高数学题目要求见个人项目。
二 代码复用
由于该项目是建立在第一次项目的基础上的,因此该项目的需求中有许多功能已经实现过,可以复用。
之前说过,由于我第一次在架构设计上的不足,在这次的项目中,复用的模块是冯同学的。
这两个项目中功能相同的模块有许多,例如登陆模块,出题模块。登陆模块倒是不需要复杂的关系调用了,因为这部分在前端可以实现。
但是用户名和密码却需要从文件/数据库中读取,这比之前困难些。同样的模块情况不同,实现的难度也不同。同理,之前出题模块可以不考虑答案的计算,但是在这个项目中就要考虑。
三 结对编程相关经验和教训
这次编程虽然我负责的是相对简单的前端,但是实际上还是遇到了许多的问题。
一 工具的选择
由于我是使用java语言开发,涉及UI设计很自然的想到了swing。不过我对swing并不是特别熟悉,而且组件的布局也是一件十分令人头疼的事情。
幸好,在同学的提醒下,我发现了windowbuilder这个插件,它提供了可视化的页面设计,大大减少工作量。
图·1 windowbuilder页面(可视化编程,可以产生对应代码)
二UI设计的流程
本着先设计,再实现的理念。我先简单地用word做出了页面的原型。然后利用上面的工具,我很快地将这个模型实现了。
图2 登陆界面的原型 (标明了用到的组件)
接下来摆在我面前的难点就是页面的切换以及如何调用后台的程序。
页面的切换
这方面算是我设计上的一个缺陷,因为对swing的不熟悉,我选择了函数调用函数的方法。类似下图这种,通过不断地打开新的frame,再关闭旧的frame。
但是这么一来,就大大限制了参数的传递,以及对象的调用。不过我当时还未考虑调用后端的函数,因此并没有看到这一点。
图3 页面转换的例子 (不断地创建frame,效率很低,应该是在panel之间切换)
调用后台程序:
一开始我在这方面是毫无头绪的。单做静态页面或者是写几个类之间的互相调用都不是难事,但是如何将这两者结合起来才是难点。
通过学习他人的代码,我终于这才意识到可以利用swing组件的事件监听机制来完成两者的连接。
例如登陆功能,用户先在用户名和密码这两个文本框中输入内容,然后按下登陆按钮切换页面。如果用户名和密码确实存在且符合,那么就成功登陆,反之则出现错误提示。
在这个流程中,比较重要的活动是用户按下按钮。至于用户输入的内容则通过组件本身的函数获取。
因此,如果对按钮进行监听,然后调用对用户名和密码检验的函数,那么就可以很好地将解决我一开始的问题。
图4 文本框事件+用户名重复判断 (桥梁是事件监听器)
因此我在考虑每个组件的行为后,设计了如下的函数(初始版本)交给冯同学实现。在这之后我的主要工作就是测试各个组件之间的交互是否正确,这点在此不提。
图5 后端需要实现的方法(部分)
在组装最后程序时,我要做的就是将事件中函数的判断条件从简单的判断条件(输入的值是否为1)替换成真实存在的函数调用(判断输入的内容是否合法)。
三总结
当然,除了我上述遇到的问题,其实还有许多的小问题,大多是因为对swing的不熟悉导致的。除此之外就是没能和冯同学对接好,这一点也值得我反思。