项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming);(2)掌握Github协作开发程序的操作方法; |
结对方学号-姓名 | 201771010103-陈亚茹 |
结对方本次博客作业链接 | https://www.cnblogs.com/980303CYR/p/12554361.html |
这个作业在哪些方面帮助我实现学习目标 | (2)在githup的使用上;(2)在软件开发的实践上 |
项目githup的仓库地址链接 | https://github.com/980303/xiaochen1.git |
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
代码规范
代码风格规范:主要是文字上的规定。代码风格的原则是:简明、易读、无二义性,包括对于缩进、行宽、括号、分行、命名、下划线、注释、大小写以及断行与空白的{}行的处理;缩进限定为100字符;复杂的条件表达式中,用括号表示逻辑优先级;有清晰的断行和分行;命名应该遵循规则,简洁易懂。
代码设计规范:牵扯到程序设计、模块之间的关系、设计模式等。比如针对函数,他的最重要的原则就是:只做一件事,并且要做好。可以使用goto实现单一的出口。还有错误处理方面的一些内容,比如断言的正确使用等规范。程序的绝大多数功能,都在程序中实现,函数的原则是只做好一件事;使用goto语句使得程序有单一的出口;错误处理的时间更甚于程序功能的实现;所有的参数都要验证其正确性,验证正确性使用断言;
代码复审
看代码是否在代码规范的框架内正确地解决了问题。代码复审的三种形式:自我复审、同伴复审、团队复审。
- 自我复审:自己 VS 自己,用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信,如果能持之以恒,则对个人有很大好处。
- 同伴复审:复审者 VS 开发者,简便易行,最基本的复审手段。
- 团队复审:团队 VS 开发者,有比较严格的规定和流程,适用于关键的代码,以及复审后不再更新的代码,覆盖率高——有很多双眼睛盯着程序,但效率可能不高。
代码复审的目的在于:
- 找出代码的错误,比如编码错误和不符合团队代码规范的地方。
- 发现逻辑错误,程序可以编译通过,但是代码的逻辑是错误的。
- 发现算法错误,比如使用的算法不够优化,边界没有处理好等。
- 发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。
- 发现可能需要改进的地方。
- 教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
结对编程:
- 是指一起分析,一起设计,一起写测试用例,一起做单元测试,一起做集成测试,一起写文档等,在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。结对编程有以下好处:
- 在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。两人合作,还有相互激励的作用,工程师看到别人的思路和技能,得到实时的讲解,受到激励,从而努力提高自己的水平。
- 对开发人员自身来讲,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
- 在企业管理层次上,结对能更有效地交流、相互学习和传递经验,分享知识,能够更好地应对人员流动。
结对编程分为两个角色:
- 驾驶员:控制键盘输入。
- 领航员:起到领航作用。
结对编程的要领:
- 驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
- 领航员:审阅驾驶员的文档;监督驾驶员对开发流程的执行;考虑单元测试的覆盖率;思考是否需要如何重构;帮助驾驶员解决问题具体的技术问题。领航员也可以设计TDD中的测试用例。
- 驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟,领航员要控制时间。
- 主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任。
- 只有水平上的差距,没有级别上的差异。两人结对,尽管可能大家的级别资历不同,但不管在分析、设计、编码上,双方都拥有平等的决策权利。
- 设置好结对编程的环境、座位、显示器、等都要允许两个人舒适地讨论和工作。如果是远程结对编程,那么网络、语音通讯和屏幕共享程序要设置好。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
1.对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
-
结对方博客链接
https://www.cnblogs.com/980303CYR/p/12514601.html
-
结对方Github项目仓库链接
https://github.com/980303/xiaochen
-
博客评论
-
代码核查表
概要部分
代码能符合需求和规格说明么?答:能符合需求与规格。
代码设计是否有周全的考虑? 答:不太周全,修改了很多次,刚开始可能设计部分有一些问题。
代码可读性如何? 答:简单易懂。
代码容易维护么? 答:比较容易。
代码的每一行都执行并检查过了吗? 答:是的,检查过。
设计规范部分
设计是否遵从已知的设计模式或项目中常用的模式? 答:是。
有没有硬编码或字符串/数字等存在? 答:有一部分。
代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64) 答:没有依赖,不会影响。
开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现? 答:可以实现,不存在。
有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码。) 答:有,已清除。
代码规范部分
修改的部分符合代码标准和风格么(详细条文略)? 答:符合代码标准。
具体代码部分
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 答:查阅资料并讨论以后发现基本没有。
参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数? 答:基本无错误,字符串的长度是字节的长度,以0开始计数。
边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环? 答:通过检查代码和讨论,循环不会出现死循环。
有没有使用断言(Assert)来保证我们认为不变的条件真的满足? 答:没有使用。
对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化? 答:因为没有上线使用,基本不会导致资源泄露,没有优化。
数据结构中是否有无用的元素? 答:检查过后没有。
效能
代码的效能(Performance)如何?最坏的情况是怎样的? 答:代码正确,程序运行正常,数据很大时可能会比较慢。
代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)? 答:有可优化部分,但是可以。
正常运行
对于系统和网络调用是否会超时?如何处理? 答:不会超时,数据过大可能有一点延迟。
可读性
代码可读性如何?有没有足够的注释? 答:代码不是很复杂,在重要部分加了注释。
可测试性
代码是否需要更新或创建新的单元测试? 还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。 答:后期可以增加网页方面的UI设计,有更好地用户体验。
依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
pork伙伴的代码
clone伙伴的代码到本地便于运行
将更改后的项目上传到对方仓库
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
1.需求分析陈述。
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。在此基础上提供了高级查询,相对的可视化功能,定时功能以及导出到excel表中的功能。
软件设计说明。
2.功能设计
- 基本功能
(1)用户登录界面,凭借账号和密码可以登录。
(2)采集学生每天的疫情信息,每人每天只能上传一次。
(3)管理员可以插入删除修改信息。
(4)管理员登陆可查看各学院填报情况,学生汇总数据,关键疫情数据统计。
(5)采用可视化图表的形式进行统计。
(6)管理员进入后台管理系统,可将学生疫情数据导出到excel。 - 拓展功能
定时填报提醒
3.设计实现
用户类,实现用户的登录,检查状态,查询疫情数据,导出到excel,分页等功能
学生类,实现信息采集,保存,检查,查询等功能
类与类之间完全分离,拥有对数据的增改查等功能,有获取特定日期的函数等。函数之间存在比较固定的调用关系。
4.功能界面截图
数据库建立:
登录界面
成员信息:
添加成员信息:
添加疫情信息:
查询疫情信息:
统计图
导出数据
重要代码截图
package 疫情;
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;
public class LLogin {
public static void main(String[] args) {
new loginFrame();
}
}
class loginFrame extends JFrame implements ActionListener{
Box box1,box2,baseBox;
JLabel userName,userPwd,tubiao;
JTextField nameField;
JPasswordField pwdField;
JButton button;
JTabbedPane choose;
JPanel panel1,panel2;
loginFrame(){
setBackground(Color.white);
userName=new JLabel("账号",JLabel.CENTER);
userPwd=new JLabel("密码",JLabel.CENTER);
nameField=new JTextField(8);
pwdField=new JPasswordField(8);
panel1=new JPanel();
panel2=new JPanel();
choose=new JTabbedPane();
choose.add("登录界面",panel1);
panel1.setLayout(new GridLayout(2,2));
panel1.add(userName);panel1.add(nameField);
panel1.add(userPwd);panel1.add(pwdField);
add(choose,BorderLayout.CENTER);
button=new JButton("登陆");
add(button,BorderLayout.SOUTH);
button.addActionListener(this);
//小图标
ImageIcon tubiao=new ImageIcon("file:///D:/Program%20File/eclipse-workspace/疫情上报/src/疫情/层云.jpeg");
setIconImage(tubiao.getImage());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setBounds(200,100,500,200);
setTitle("疫情信息管理系统");
validate();
}
public void actionPerformed(ActionEvent e){
String name,pwd;
name=nameField.getText();
pwd=pwdField.getText();
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载数据库驱动
}
catch(ClassNotFoundException ex){
System.out.println(ex);
}
try{
Connection con;
Statement sql;
ResultSet rs;
String url,userName,userPwd;
// 连接数据库的语句
url="jdbc:sqlserver://localhost:1433;DatabaseName=Student";
userName="sa";
userPwd="chenke010919chan";
con=DriverManager.getConnection(url,userName,userPwd);
sql=con.createStatement();
rs=sql.executeQuery("select * from login where name ='"+name+"' and pwd='"+pwd+"'");
int q=0;
while(rs.next()){
q++;
}
if(q>0){
JOptionPane.showMessageDialog(this, "登陆成功!","消息对话框",JOptionPane.WARNING_MESSAGE);
this.dispose();
new CommFrame();
}
else
JOptionPane.showMessageDialog(this, "账号或者密码错误!","消息对话框",JOptionPane.WARNING_MESSAGE);
}
catch(SQLException exp){
System.out.println(exp);
}
}
}
描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图
提供此次结对作业的PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间 |
---|---|---|---|
Planning | 计划 | 30 | 25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 30 |
Development | 开发 | 1140 | 1300 |
Analysis | 需求分析(包括学习新技术) | 98 | 120 |
Design | Spec 生成设计文档 | 34 | 20 |
Design | Review 设计复审(和同事审核设计文档) | 2 | 0 |
Coding | Standard 代码规范(为目前的开发制定合适的规范) | 33 | 32 |
Design | 具体设计 | 34 | 25 |
Coding | 具体编码 | 1100 | 1100 |
Code Review | 代码复审 | 30 | 24 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 88 |
Reporting | 报告 | 180 | 165 |
Test Report | 测试报告 | 40 | 35 |
Size Measurement | 计算工作量 | 7 | 6 |
小结:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受
- 结对编程有利有弊,但是总的来说是利大于弊的,1+1的效果>2,在和结对伙伴结对编程的过程中,两个人可以互相帮助,解决对方的问题,相当于自己身边多了一个良师益友,可能你没有考虑到的问题她就会考虑到,可以做到优势互补。弊端是大家思考问题的方向不同,意见不一致,前期大家的机器环境不同意,编程过程中出现不同的问题,解决起来不太容易。