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

项目地址 saodan
队友博客 口袋里的世界jjj
结对队友学号 廖志丹:201731032125
王川:201731021132

1. PSP表格

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10min 15min
· Estimate · 估计这个任务需要多少时间 5h 5h+
Development 开发 4h 3h
· Analysis · 需求分析 (包括学习新技术) 1h 1h
· Design Spec · 生成设计文档 10min 10min
· Design Review · 设计复审 (和同事审核设计文档) 8min 10min
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30min 25min
· Design · 具体设计 45min 45min
· Coding · 具体编码 4h 5h+
· Code Review · 代码复审 40min 35min
· Test · 测试(自我测试,修改代码,提交修改) 1h 1h30min
Reporting 报告 8min 10min
· Test Report · 测试报告 5min 5min
· Size Measurement · 计算工作量 15min 15min
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20min 20min
合计 1091min 1120min+

2. 解题思路(共同完成)

2.1 解题思维导图:


2.2 界面UI设计:



2.2 代码设计:


说明:OpenExcel类库中的GetExcelFile类和ExcelToDataTables类实现打开Excel文件读取学生信息的功能,student类实现将学生信息写入数据字典,WriteOutStu类库实现将学生信息写入Excel表格,结对编程_课堂随机点名系统类库实现主界面设计和功能的实现。

3. 具体实现(共同完成):

1.导入学生名单

code

OpenFileDialog op = new OpenFileDialog();
op.Filter = "Excel(97-2003)文件|.xls|所有文件|.";
op.Title = "打开文件夹";
string path = null;
op.InitialDirectory = "d:\";//最初从D盘开始查找文件,测试文件放置于本文件夹。
op.FilterIndex = 1;
if (op.ShowDialog() == DialogResult.OK)//判断路径是否正确
{
path = op.FileName;
}
string name = GetExcelFile.GetFile(path);//获取Excel文件。
string Tsql = "SELECT
FROM [" + name + "]";
DataTable table = ExcelToDataTable.Redatatable(path, Tsql).Tables[0];//将Excel转换为dataset类型并赋值于table
/获取文件名/
public static class GetExcelFile
{
public static string GetFile(string path)
{
string name = null;
if (File.Exists(path))
{
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;" + "data source=" + path + ";Extended Properties='Excel 12.0; HDR=yes; IMEX=2'"))
{
conn.Open();
name = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0][2].ToString().Trim();
}
}
return name;
}
}
/将Excel类型转换成datatable/
public static DataSet Redatatable(string path,string Tsql)
{
DataSet ds;
string strcon = "Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;" + "data source=" + path + ";Extended Properties='Excel 12.0; HDR=yes; IMEX=2'";
OleDbConnection mycon = new OleDbConnection(strcon);
mycon.Open();
OleDbDataAdapter myconn = new OleDbDataAdapter(Tsql, strcon);
ds = new DataSet();
myconn.Fill(ds);
mycon.Close();
return ds;
}


说明:
运用OpenFileDialog控件打开文件
运用OLedb连接Excel,并将Excel表中的信息填充到datatable表中

2.建立学生信息的数据字典

code

stuList = studentList.StudentList(table);//将学生信息存储到字典中
public static class studentList
{
public static Dictionary<int,string> StudentList(DataTable data)
{
Dictionary<int, string> stuList = new Dictionary<int, string>();
for (int i = 1; i < data.Rows.Count; i++)
{
stuList.Add(i, data.Rows[i][1].ToString());
}
return stuList;
}
}

3.随机点名并记录缺课名单

code

string path1 = @"E:/";
filepath = path1 + System.DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString().Replace(":", "-") + "缺课名单" + ".xls";//缺课学生文件命名
private void timerCallname_(object sender, EventArgs e)
{
    Random random = new Random();
    int t = random.Next(1, stuList.Count + 1);
    label1.Text = stuList[t];
}
private void label1_Click(object sender, EventArgs e)
{
    DialogResult re = MessageBox.Show(string.Format("{0}是否缺席。", label1.Text),"提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
    if (re == DialogResult.Yes)
    {
        WriteOutStu.Class1.Write(filepath, label1.Text.ToString());//将缺课学生导出为Excel文件
    }
}
public static void Write(string Path,string str)
{
    FileStream datafile = new FileStream(Path, FileMode.Append, FileAccess.Write);
    string data = string.Format("{0}\t缺席\n",str);
    StreamWriter writer = new StreamWriter(datafile, Encoding.GetEncoding("gb2312"));
    writer.Write(data);
    writer.Flush();
    writer.Close();
}

说明:
运用timer事件,利用random产生随机数进行随机点名
运用MessageBox判断学生是否缺课
运用IO类将缺课学生名单写入Excel文件



4.新增功能

(1) 实现从Excel表格中获取学生名单的功能,脱离了数据库的限制,无需安装数据库即可实现对学生信息的操作。

(2) 新增记录学生缺课信息的功能。

(3) 实现将学生缺课信息导出的功能,并运用时间命名文件,方便学生信息管理。

5. 源代码管理

本次实验运用VS2017的GitHub Extension for Visual Studio拓展进行源代码管理,实现代码的及时同步。

6.单元测试

思路:建立DataTable数据表进行测试

code

public class studentListTests
{
    [TestMethod()]
    public void StudentListTest()
    {
        DataTable table = new DataTable(;
        DataColumn column = new DataColumn(" ");
        column.AutoIncrement = true;
        column.AutoIncrementSeed = 1; 
        column.AutoIncrementStep = 1;
        column.AllowDBNull = false;
        table.Columns.Add("学号", Type.GetType("System.String"));
        table.Columns.Add("姓名", Type.GetType("System.String"));
        table.Rows.Add("2016", "王川");
        table.Rows.Add("2017", "廖志丹");
        Assert.AreEqual(studentList.StudentList(table)[1], "廖志丹");
    }
}

思路:
读取文件内容,检验写入信息是否正确

code

public class Class1Tests
{
    [TestMethod()]
    public void WriteTest()
    {
        Student s = new Student();
        s.Loading_Click(null, EventArgs.Empty);
        WriteOutStu.Class1.Write(s.filepath, "廖志丹");
        StreamReader sr = new StreamReader(s.filepath,Encoding.Default);
        string str = sr.ReadToEnd();
        Assert.AreEqual(str, "廖志丹\t缺席\n");
    }
}

7.回归测试及代码覆盖率

8.代码互审

  • 在这次结对编程过程中,我们边写代码,边进行代码互审,发现了许多命名不规范的问题并及时得到改正。
  • 在编程过程中,我们进行了多次代码合并,改正了许多命名空间和引用错误,保障了最终代码成功合并。
  • 详细的代码互审参考博文:高效代码审查的八条准则和十个经验

9.结对过程

  • 通过这次结对编程,锻炼了团队编程的能力,尤其是练习了代码合并,为今后的团队项目积累了经验。
  • 这次结对编程达到了1+1>2的效果,两人结对编程可以更快完成功能搭建,进行及时的代码互审,改正错误,提高质量

猜你喜欢

转载自www.cnblogs.com/liaozhidan/p/11615096.html