结对编程-经验总结

这次结对编程我和冯同学组队,为了加快开发速度,我主要负责前端的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的不熟悉导致的。除此之外就是没能和冯同学对接好,这一点也值得我反思。

猜你喜欢

转载自www.cnblogs.com/firework-boom/p/11593325.html
今日推荐