个人第3次作业:结对编程
个人第3次作业:结对编程
Github项目地址 | 项目地址 |
---|---|
结对伙伴的作业地址 | 作业地址 |
1.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 1760 | 1888 |
Development | 开发 | 600 | 540 |
· Analysis | 需求分析 (包括学习新技术) | 60 | 90 |
· Design Spec | · 生成设计文档 | 10 | 8 |
Design Review | · 设计复审 (和同事审核设计文档) | 20 | 25 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 120 | 180 |
· Coding | · 具体编码 | 600 | 720 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 40 |
Reporting | 报告 | 120 | 140 |
· Test Report | · 测试报告 | 20 | 15 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 1760 | 1888 |
2.实现过程(共同完成)
(1)WinForm界面设计
在设计winform界面时,经过和队友讨论后,在老师原有的基础上增加了进度条读取界面,增加了缺勤记录的新功能,可以记录学生缺勤的次数。
设计界面图:
(2)代码设计基本思路
我和队友分别创建了3个类库,Stu_Database,Stu_Entity,Stu_Layer,这三个类库的主要作用分别是Stu_Database创建了学生信息Database类,在类里录入了学生信息。Stu_Entity创建了Entity类,主要用于创建学生实例。Stu_Layer创建了Layer类主要用于得到学生信息,在主函数中调用。
Stu_Database这个类库用来存储学生的基本信息,在这个基础上增加了缺勤次数的信息。
部分代码截图:
public class Databse
{
//模拟数据库中的学生集合
private static List<Entity> studengList;
public static List<Entity> getAll()// 学生信息库
{
studengList = new List<Entity>();
Entity stu1 = new Entity("001", "王川",0);
studengList.Add(stu1);
...
Entity stu84 = new Entity("084", "杨也", 0);
studengList.Add(stu84);
return studengList;
}
}
Stu_Entity这个内库是将Stu_Database内库中的学生信息进行实例化,用以进行数据的读写输入。
部分代码截图:
public class Entity
{
private String id;
public String Id//学号
{
get { return id; }
set { id = value; }
}
private String name;
public String Name//姓名
{
get { return name; }
set { name = value; }
}
private int abse;
public int Abse//缺勤次数
{
get { return abse; }
set { abse = value; }
}
public Entity()
{
}
public Entity(String id, String name,int Abs)
{
this.id = id;
this.name = name;
this.abse = abse;
}
}}
Stu_Layer是用来计算学生总人数,或者随机点一个学生,还可以在这个内库中增加其他新的功能,方便修改。
部分代码截图:
public class Layer
{
public int getStudentRecordsNums()
{
List<Entity> studengList = Databse.getAll();
return studengList.Count;
}
public List<Entity> getAllStudents()
{
List<Entity> studengList = Databse.getAll();
return studengList;
}
}
3,新功能
我们在原有的基础上增加了进度条读取界面,和增加了缺勤次数的记录。
部分代码截图:
public partial class Form2 : Form
{
public int i;
List
Layer Stulayer = new Layer();
public Form2()
{
InitializeComponent();
Layer Stulayer = new Layer();
stuList = Stulayer.getAllStudents();//获取学生数据
DataTable dt = new DataTable();
dt.Columns.Add("stuNo", Type.GetType("System.String"));
dt.Columns.Add("stuName", Type.GetType("System.String"));
dt.Columns.Add("abs", Type.GetType("System.String"));//构造数据源
foreach (Entity stu in stuList)
{
dt.Rows.Add(stu.Id, stu.Name,stu.Abse);
}
dataGridView1.DataSource = dt;
}
private void BtnStart_Click(object sender, EventArgs e)
{
timerCallName.Start();
}
private void TimerCallName_Tick(object sender, EventArgs e)
{
Random ra = new Random();
i = ra.Next(stuList.Count);
label2.Text = stuList[i].Name;
}
private void BtnAbs_Click(object sender, EventArgs e)
{
stuList[i].Abse= stuList[i].Abse+1;
MessageBox.Show("添加成功!");
}
}
5,单元测试
代码思路:测试的函数有 Assert.IsNotNull,Assert.ReferenceEquals。通过测试函数Assert.IsNotNull来判断程序是否调用了getAllStudents方法,结果是调用了这个方法。通过测试函数Assert.ReferenceEquals来判断getAllStudents方法的实例是否是Layer实例。
部分代码截图:
namespace Stu_Layer.Tests
{
[TestClass()]
public class LayerTests
{
[TestMethod()]
public void getStudentRecordsNumsTest()
{
Layer test = new Layer();
Assert.IsNotNull(test.getAllStudents());//测试是否为空
Assert.ReferenceEquals(test,test.getAllStudents());//测试实例是否是相同实例
}
}
}
3.代码复审过程
- 在代码复审时我和组员发现部分代码命名不规范,导致了后面的引用实例和调用方法时不知道使用哪个,我们在修改过后使得代码变得更易读,更有逻辑性。
- 在代码合作时队员发现我没有引用命名空间,于是纠正我使用了命名空间。
- 在合并代码时我们遇到了很大困难,就是代码很多名字都不一样,导致了合并不成功,于是我们又互相修改了命名。
4.单元测试
测试的函数有 Assert.IsNotNull,Assert.ReferenceEquals。通过测试函数Assert.IsNotNull来判断程序是否调用了getAllStudents方法,结果是调用了这个方法。通过测试函数Assert.ReferenceEquals来判断getAllStudents方法的实例是否是Layer实例。
部分代码如下:
namespace Stu_Layer.Tests
{
[TestClass()]
public class LayerTests
{
[TestMethod()]
public void getStudentRecordsNumsTest()
{
Layer test = new Layer();
Assert.IsNotNull(test.getAllStudents());//测试是否为空
Assert.ReferenceEquals(test,test.getAllStudents());//测试实例是否是相同实例
}
}
5.结对过程
总体来说我和队员的这次结对编程还是很成功的。因为是第一次编程,所以我们之间的默契还不够,还在相互磨合阶段,我相信之后合作多了就会变得更有默契。这次结对编程还大大增加了我们编程的效率,因为我们在编程时会互相提示哪里编写错了,哪里的思路不正确。我们在代码互审发现了许多问题,通过线下沟通我们还是慢慢解决了这些问题。
结对照片:
6.附加功能
这次编程的主要附加功能是可以通过 学生点名界面 的 缺勤 按钮来对缺勤的同学进行有效的记录。这个功能主要是通过添加一个新的学生int型来对同学的考勤次数进行初始化,然后再通过缺勤按钮来对学生int型的记录进行增加,从而实现对缺勤的同学进行记录。