个人第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界面时,经过和队友讨论后,在老师原有的基础上增加了进度条读取界面,增加了缺勤记录的新功能,可以记录学生缺勤的次数。

设计界面图:
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190926152109564.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5MzgxMQ,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190926152034294.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5MzgxMQ
,size_16,color_FFFFFF,t_70)

(2)代码设计基本思路

我和队友分别创建了3个类库,Stu_Database,Stu_Entity,Stu_Layer,这三个类库的主要作用分别是Stu_Database创建了学生信息Database类,在类里录入了学生信息。Stu_Entity创建了Entity类,主要用于创建学生实例。Stu_Layer创建了Layer类主要用于得到学生信息,在主函数中调用。

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190926152651820.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5MzgxMQ==,size_16,color_FFFFFF,t_70)
Stu_Database这个类库用来存储学生的基本信息,在这个基础上增加了缺勤次数的信息。
部分代码截图:
public class Databse
{
//模拟数据库中的学生集合

private static List studengList;

public static List getAll()// 学生信息库
{
studengList = new List();
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 studengList = Databse.getAll();
return studengList.Count;
}
public List getAllStudents()
{
List studengList = Databse.getAll();
return studengList;
}
}

3,新功能

我们在原有的基础上增加了进度条读取界面,和增加了缺勤次数的记录。
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190926154158811.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5MzgxMQ,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/2019092615363271.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE5MzgxMQ
,size_16,color_FFFFFF,t_70)
部分代码截图:
public partial class Form2 : Form
{
public int i;
List stuList;
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.结对过程

总体来说我和队员的这次结对编程还是很成功的。因为是第一次编程,所以我们之间的默契还不够,还在相互磨合阶段,我相信之后合作多了就会变得更有默契。这次结对编程还大大增加了我们编程的效率,因为我们在编程时会互相提示哪里编写错了,哪里的思路不正确。我们在代码互审发现了许多问题,通过线下沟通我们还是慢慢解决了这些问题。
结对照片:
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190926193551390.jpg?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b2p1bmppZTE5OTk=,size_16,color_FFFFFF,t_70)

6.附加功能

这次编程的主要附加功能是可以通过 学生点名界面 的 缺勤 按钮来对缺勤的同学进行有效的记录。这个功能主要是通过添加一个新的学生int型来对同学的考勤次数进行初始化,然后再通过缺勤按钮来对学生int型的记录进行增加,从而实现对缺勤的同学进行记录。

posted @ 2019-10-01 09:05  IE吃饭  阅读(322)  评论(0)    收藏  举报