项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
本次作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 | 利用结对编程的思想产生1+1>2的效果 |
这个作业在哪些方面帮助我实现学习目标 | 在遇到问题后,能用新学的知识解决问题 |
结对方学号-姓名 | 201771010114-李晓菁 |
结对方本次博客作业的链接 | https://www.cnblogs.com/li-xiaojing/p/12581215.html |
本次项目的github地址 | https://github.com/ajingya/managesystem |
1.实验目的与要求
(1) 体验软件项目开发中的两人合作,练习结对编程(Pair programming)
(2) 掌握Github协作开发程序的操作方法。
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
1、代码风格规范:原则:简明,易读,无二义性
2、代码设计规范:代码设计规范有程序书写的格式问题,要有程序设计、模块之间 类与类的关系、设计模式等
3、代码复审:看代码是否在代码规范的框架内正确的解决了问题,其目的在于找出代码错误、发现逻辑错误、发现算法错误、发现潜在和回归错误以及发现需要改进的地方。
4、结对编程:结对编程是软件开发过程中所使用的一种技术,两名程序开发人员共享同一台工作站。其中一个扮演驾驶者(Driver)的角色,进行代码编写,另一个扮演观察员(Observer)或导航员(Navigator)的角色,对代码进行评测。身份可以随时互换。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,将评论内容发布到博客评论区。
2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录
概要部分
概要部分
- 代码能符合需求和规格说明么?
答:符合需求与规格 - 代码设计是否有周全考虑?
答:考虑地较为全面,但还是存在问题 - 代码可读性如何?
答:符合规范,可读性高 - 代码容易维护么?
答:比较容易 - 代码的每一行都执行并检查过了吗?
答:已检查
设计规范部分
- 设计是否遵从已知的设计模式或项目中常用的模式?
答:否 - 有没有硬编码或字符串/数字等存在?
答:无 - 代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)
答:不会影响。
代码规范部分
- 修改的部分符合代码标准和风格么(详细条文略)?
答:符合
具体代码部分
- 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:有对错误进行处理,并对调用的外部函数,检查了返回值且处理了异常 - 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:基本无错误,字符串的长度是字节的长度,以0开始计数。 - 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:在网上找到的,,不会导致资源泄漏,有可能优化。 - 数据结构中是否有无用的元素?
答:经过检查已将无用的元素修改。
效能
- 代码的效能(Performance)如何?最坏的情况是怎样的?
答:程序运行正常
可读性
- 代码可读性如何?有没有足够的注释?
答:代码可读性较高,基本的注释都有。
可测试性
- 代码是否需要更新或创建新的单元测试?还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:不需要。
依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
1.Fork操作:这个操作会复制对方的仓库(包括文件,提交历史,issues,和其余一些东西)。
2.clone操作:将仓库克隆到本地,如下图:
3.push操作:将我的更改push到我的github仓库
4.原始界面
5.操作完的界面
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
需求分析陈述
- 学校能够及时了解学生的状况,做好安全保障;
- 在系统中各学院负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
- 对于查询结果,应该简单直观地反映出疫情情况。
功能设计说明
- VO:主要由属性,setter, getter 方法组成,VO 类中的属性与表中的字段相 对应,每一个 VO 类的对象都表示表中的每一条记录;
- DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查 等;
- Impl: DAO 接口的真实实现类,主要完成具体数据库操作,但不负责数据库的 打开和关闭;
- Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的 操作;
- Factory: 工厂类,通过工厂类取得一个 DAO 的实例化对象。
主要类,jsp页面及其说明
- DatabaseConnection.java 负责数据库的连接和关闭操作
- Pager.java 完成分页操作
- LoginServlet.java 接收请求参数,进行参数验证,调用DAO完成具体的登录验证,并根据 DAO 的验证结果返回登录信息
- LoginOutServlet.java 接收请求,完整注销操作并跳转到登录表 单页面
- LoginFilter 过滤器,拦截非法用户
- left.jsp 主页面之功能菜单子页面
- index.jsp 系统主页面,展现功能菜单
关键代码
package com.org.mvcdemo.controller;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.org.mvcdemo.common.Pager;
import com.org.mvcdemo.dao.IProductDAO;
import com.org.mvcdemo.factory.DAOFactory;
import com.org.mvcdemo.vo.Product;
/**
* Servlet implementation class SearchProductServlet
*/
@WebServlet("/SearchProductServlet")
public class SearchProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SearchProductServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
//获取可能传送过来的查询条件和页码,但不一定会传送过来。
//比如在点击左边菜单的“查询产品"时,是没有传送查询条件和页码的,所以后面代码中要判断是否有这些数据
String search_name = request.getParameter("search_name");
String currentPage = request.getParameter("currentPage");
//判断是否接收到页码,如果没有,则默认设置为第一页
int iCurrentPage = currentPage==null?1:Integer.parseInt(currentPage);
Pager pager = null;
ArrayList<Product> productList = null;
try {
IProductDAO proxy = DAOFactory.getIProductDAOInstance();
//如果没有查询条件提交上来,则查询全部,否则基于条件查询
if(search_name == null) {
int count = proxy.getCount();
pager = new Pager(iCurrentPage,count,5);//构建pager对象,设置当前页、总记录数、每页显示条数
productList = DAOFactory.getIProductDAOInstance().findProduct(pager.getStartResults(),pager.getPageSize());
}else {
int count = proxy.getCount(search_name);
pager = new Pager(iCurrentPage,count,5);
productList = DAOFactory.getIProductDAOInstance().findProduct(search_name,pager.getStartResults(),pager.getPageSize());
}
//如果有条件,则将条件设置到请求中,传送至jsp页面中,保证jsp的页面在刷新后,查询条件的值一直保留在文本框。
if(search_name != null) {
request.setAttribute("search_name", search_name);
}
//将Pager对象和查询出的结果设置到请求中,传送至jsp页面
request.setAttribute("pager", pager);
request.setAttribute("productList", productList);
request.getRequestDispatcher("product.jsp").forward(request,response) ;
}catch(Exception ex) {
ex.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
测试运行
1、登陆部分:考虑到登陆和页面操作的是同一个用户在这里采用jsp中的session会话操作,将用户的信息直接提交在服务器,不经客户端,保障用户的唯一性。设计一张数据表,里面存放三类人的用户名和密码,这三类人的登陆界面是相同的,区别就是登陆进去,可进行的操作不一样
2.学生登陆进去就是填写疫情上报
3.学院负责人登陆进去只能对本学院的学生信息进行增删改查
- 编辑功能
- 修改10006号的信息
- 修改成功
4.学校负责人登录进去可查看全校填报信息
5.对学生信息进行模糊查找
6.模糊查找的另外一个例子
7.统计分析
显示已填报和未填报的人数比例
显示各个学院是否填报统计图
显示各个学院已经感染的人数饼状图
8.将用户的所有信息导出到Excel
.描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图(截图要完整,能够显示结对双方姓名)
PSP展示
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间,并规划大致工作时间 | 1000 | 1500 |
Development | 开发 | 1000 | 2000 |
Analysis | 需求分析(包括学习新技术) | 500 | 1000 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审(和同事审核设计文档) | 30 | 30 |
Coding Standard | 代码规范 | 100 | 80 |
Design | 具体设计 | 100 | 150 |
Coding | 具体编码 | 500 | 800 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 500 | 300 |
Reporting | 报告 | 100 | 80 |
Test Reporting | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 80 |
Postmortern & Process Improvement Plan | 事后总结,并提出过程改进计划 | 2000 | 3000 |
代码规范说明
项目总结
这次两人的结对项目,比起上一次我一个人单个完成的项目来说,功能多了一点,界面稍微美观一点,两人合作,最多的时候就是沟通商量,这一点上我们倒是一直很一致没有发生过分歧,在项目开展之前就大致做了一个构想,大致的轮廓商量了一下,我们就开始分工先实现自己的部分,我觉得结对编程的好处有可以及时发现错误,并且两个人一起找方法来解决,效率比起一个人要快的多,互相借鉴,互相学习,这种应该就是1+1>2的体会吧。