个人第三次作业——结对编程
Github项目地址 | 地址 |
---|---|
结对伙伴的作业地址 | 地址 |
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 |
一 . WinForm随机点名的程序(共同完成)
1,WinForm窗口界面的设计
我们设计了winform界面,希望可以实现班级学生的随机点名,运行程序时可以实现进度条的跟踪,并且此基础上,增加了其他的功能,可以记录学生的缺课次数在表中。
下面是我们的winform界
2,基本功能设计及代码基本的思路
我们创建了三个类库,Stu_Database,Stu_Entity,Stu_Layer。这三个类库之间相互引用。Stu_Database创建Database 类,Stu_Entity中创建Entity类,Stu_Layer中创建Layer。三个类库之间相互引用,基本思路是通过Stu_Entity将学生基本信息实例化,然后在Stu_Layer对其进行相关规则,并在主函数中调用,显示到winform界面。
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 Form2_Load(object sender, EventArgs e)
{
}
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 BtnStop_Click(object sender, EventArgs e)
{
timerCallName.Stop();
}
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());//测试实例是否是相同实例
}
}
}
二,代码复审过程发现的问题。
-
代码格式不规范,大小写混用,命名不合理,层次不清晰。导致后面在其他类中调用时出现未声明其变量的错误,结构混乱,程序整体没有逻辑结构。
-
在引用时没有加入头文件 using 命名空间 ,导致引用不成功,很久没有发现是怎么回事,最后上网查资料发现了解决方法。
-
在设计载入学生信息时,程序载入界面未将 Opacity 选项设置为0%,导致载入时未出现进度条加载界面,在复审过程中发现这个问题将其调整为0%。
三,描述结对的过程,两人在讨论的结对照片
这次结对过程中,我们两人基本上都是一起完成所有的过程,在编程的过程里,我负责Attendance_System中两个窗体的创建和Stu_Layer类库这两个部分的编码。
四.总结
本次个人作业收获颇多,两个人一起编码与一个人体验不同,在编码过程中互相指出问题,互相提出自己的见解,是整个过程更加的迅速,效率更高。这次的编码整体上较为顺利,在点名系统的附加功能上,将学生添加到表中,花费时间较多,还有就是最后的单元测试花费时间较多。也有很多不懂的地方,不过通过网上学习,百度,也知道了更多的方法。