天天看点

结对项目总结----已部署上线

学生自主考试系统(Auto-Generate TextPaper System)

前端开发:肖宇

后端开发:陈文康

一. 访问项目

此次制作的项目是一个Web项目,并且成功在华为云服务器部署上线,您可以在浏览器地址栏输入以下地址来访问和使用该项目:

114.116.234.151:8099

初次登录该系统需要使用手机号进行注册账户

二. 项目说明

该Web项目是基于前端网页+后端+服务器完成的,前后端技术如下:

前端:原生三件套+jquery

html

css

js

jquery

后端:SSM框架

Java8

Spring

SpringMVC

Mybatis

Maven

服务器:

华为弹性云服务器

数据库:

MySQL8.0

应用服务器:

tomcat9

三. 项目结构

结对项目总结----已部署上线

四. 项目预览

结对项目总结----已部署上线
结对项目总结----已部署上线
结对项目总结----已部署上线
结对项目总结----已部署上线

五. 代码复用

在我和结对队友一起制作该项目时,我们明显地感觉到此次制作时间十分紧张,即使是复用了个人项目代码

由此看来,代码复用是十分重要且必要的工作。下面我就分享一下如何进行代码复用:

1. 清晰的代码结构

在编写个人项目时,时间比较充裕。于是在个人项目完成之后,花费了大量的时间在整理代码结构上。例如下图:

结对项目总结----已部署上线

上图中,generator包中包含了三个Generator类,用于生成各种Product。而其中包含了一个AbstractGenerator,即抽象生成器,所有的Generator实现类都需要继承该类并实现抽象方法。

其结构树如下:

结对项目总结----已部署上线

AbstractGenerator有两个子类,分别用于生成需要生成试卷的路径和相应文件(FileGenerator)、生成试题(TestPaperGenerator)

这样做有什么好处呢?

在结对项目中,需要生成试题的答案,那么就可以通过AnswerGenerator继承AbstractGenerator,实现AbstractGenerator的代码复用

2. 模块化的方法

在TestPaperGenerator类中,我并没有将所有的代码逻辑直接写在一个方法中,而是尽可能地将代码功能进行分割,直到原子方法再进行实现:

在上图中,最终的生成方法是generate。而generate方法会根据当前试卷的难度,调用generatePrimaryTest、generateJuniorTest、generateSeniorTest;

这三个方法本质地不同就在于运算符的不同,所以可以都调用generateTest方法而传入不同的参数,实现不同的试题生成:

这样做的好处就是我可以很轻松地在结对项目中修改和复用代码:

在结对项目中的需求发生改变,需要生成答案,所以相应的方法也改变,可以观察到所有的返回值都是ArrayList。

虽然读者看起来所有的代码都进行了更改,但其实不然:因为所有的方法根源都来自于generateTest方法,其实我只是修改了一下generateTest方法,而其余的方法并没有作大的改动,只是修改了一下返回值类型罢了

由此看来,这种模块化的方法利于代码地复用

六. 结对编程交流

在结对编程,特别是像Web这种前后端交互的项目中,队友之间的沟通是十分重要的。

1. 错误的经历

在一开始结对的过程中,我和队友是分开写前后端的,只是大致交代了下两个人的工作,需要做哪些页面、需要后台提供哪些接口访问等等。

这样一直持续了2~3天,最后在两个人再次交流、合并代码、测试代码的时候就发现,虽然我提供的接口功能是完备的,但是页面上的请求访问完全对不上(例如一些请求参数、请求名等等);

于是花费了很长的时间去统一接口、统一请求参数和请求名。当一切完成时,项目可以正常启动,并且不出意外地出现了bug,于是开启了漫长的改bug之路……

这时候我才意识到,我们花费了2~3天编写的代码量太大了,没有测试的地方太多了,所以导致出现bug时,完全不知道bug出现在哪。所以后面花费了一整天来找和改bug。

2. 走上正轨

a. 接口文档

后面我们吸取了教训,对于接口和前端的交互,我会在编写接口之前,将想法写成一份接口文档交给前端。其中包括了每个请求的请求名、请求参数、返回参数,如下:

请求名:/login

请求参数:name:用户名、password:密码、phoneNumber:手机号

返回参数:当数据库中存在该用户时返回"true";否则返回"false"

b. 一次提交一小部分代码

我们不会再像一开始那样,一次性编写大量的代码,然后集中起来进行测试。

而是每次只写1~2个功能,然后立即测试,这样可以使得bug无处遁形——如果出现bug,那么肯定在这两个功能的代码中

至此我们后面的进程十分迅速和紧凑,基本的逻辑和显示很快就完成了,最后花费一定的时间美化页面、优化代码、编写注释、购买服务器和部署项目等等。

七. 总结

总的来说这是一次十分不错的合作编程经历,我和队友都受益匪浅。不只是代码能力的提升,更多地是学会如何与人交流、如何提高项目进行地速度、如何多线程地完成一个项目,

以及如何尽可能地避免bug(将bug地产生控制在一个小范围的代码内)。

最后项目也是成功上线了,十分开森

继续阅读