十二新作

导航

个人第三次作业——结对编程

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 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 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.IsNotNullAssert.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类库这两个部分的编码。在这里插入图片描述

四.总结

本次个人作业收获颇多,两个人一起编码与一个人体验不同,在编码过程中互相指出问题,互相提出自己的见解,是整个过程更加的迅速,效率更高。这次的编码整体上较为顺利,在点名系统的附加功能上,将学生添加到表中,花费时间较多,还有就是最后的单元测试花费时间较多。也有很多不懂的地方,不过通过网上学习,百度,也知道了更多的方法。

posted on 2019-10-01 09:29  十二新作  阅读(193)  评论(0编辑  收藏  举报