结对作业
结队作业| |
:--|:--|-
GitHub项目地址|https://github.com/1402120950/PairProgramming
队友博客地址|https://www.cnblogs.com/zlang/
作业链接|https://www.cnblogs.com/cherish599/p/11577268.html)
一.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
·Estimate | · 估计这个任务需要多少时间 | 840 | 900 |
Development | 开发 | 720 | 810 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 60 |
· Coding | · 具体编码 | 360 | 360 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 180 |
Reporting | 报告 | 130 | 190 |
· Test Report | · 测试报告 | 60 | 120 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 870 | 1030 |
二.计算模块接口的设计与实现过程
1.设计
这个项目由数据库和C#语言完成,将学生信息存储在数据库中,再由C#语言将数据库中的学生信息提取出来,并实现点名功能,并在新设计了登陆的功能。
这些功能总体由这几个部分组成:
(1)WinLogin(登陆窗体)
(2)Form1(加载学生窗体)
(3)Form2(实现点名窗体)
(4)connect(和数据库相连接和查询语句的类)
(5)Demo(存储账号和密码以及学生基本信息的数据库)
大致结构如下:
2.如何体现原则的
(1)Design By Contract(契约式设计):
契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。
如何体现:我们的数据库无法实现共享。所以只能利用每个人本人本地数据库,数据库的名称都是Demo。
(2)Information Hiding(信息隐藏):
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
如何体现:我们的项目都是两个人一起设计,编码的,并没有对对方设计一些影藏的东西,同时也方便了操作。
(3)Interface Design(接口设计):
对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
如何体现:没有设计接口,只有系统自带的接口,肯定是符合原则的。
(4)Loose Coupling 松耦合:
软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
如何体现:由于并没有设计接口,所以没有办法去通过增加接口去提供模块间的耦合。
三.代码复审过程
1.代码规范
参考:C#代码规范
2.代码互审情况、发现的问题
因为我们是同一个寝室,所以我们的代码在边开发,边审改,我们都可以随时看到对方的工作情况,有什么问题都能随时指出,只是在每次在不同的机子上面测试代码的时候,我们需要更改链接数据库的链接语句,出现的问题也主要集中在开发人员的性格上面,但是都不至于影响配合。
四.代码说明
(1)登陆代码,与数据库连接起来,并使用查询语句查询出数据库设置的账号和密码
private void btmLogin_Click(object sender, EventArgs e)
{
string sql = string.Format("select * from tbluser where username='{0}' and userpwd='{1}'", txtName.Text, txtPwd.Text);
DataSet ds = connect.querysql(sql);
if (ds.Tables[0].Rows.Count > 0)
{
Form1 f = new Form1();
f.Show();
this.Hide();
}
else
{
MessageBox.Show("账号或密码错误");
}
}
(2)加载数据,使用查询语句,将数据库的学生信息加载到相应窗体
private void timerCallName_Tick(object sender, EventArgs e)
{
string sql = string.Format("select * from tblStu");
DataSet ds = connect.querysql(sql);
dataGridView1.DataSource = ds.Tables[0];
}
(3)点名,从Tables[0]随机生成姓名的关键代码
Label1.Text = Convert.ToString(ds.Tables[0].Rows[i]["stuName"])
五.附加功能
我们的随机点名程序与数据库相连接,可以在数据库里直接进行对数据的增加、删除、编辑,方便我们对学生进行管理,并且我们增加了登陆功能,对点名程序增加了安全性。
六.计算模块部分单元测试展示
1.单元测试思路:
定义一个数据库查询语句,再将查询到的结果返回到ds,定义一个字符串A,将指定的结果放在A中,再断言他的结果是否正确。
2.单元测试代码
public class Form2Tests
{
[TestMethod()]
public void timerCallName_TickTest()
{
string sql = string.Format("select * from tblStu");
DataSet ds = connect.querysql("select * from tblStu");
string A = Convert.ToString(ds.Tables[0].Rows[0]["stuName"]);
StringAssert.Contains("曾琅", A);
//Assert.Fail();
}
}
3.单元测试结果以及代码覆盖率
七.结对的过程及结对照片
1.结对过程:
我们结对成功后,首先想到的就是要通过连接数据库来实现点名的功能,所以一开始就由我来设计界面,同时他来建立数据库表格,然后再来一步一步的进行代码的编写,每个人负责自己的那部分代码,在遇到大的问题的时候,又进行合作来解决,过程基本上可以说是比较顺利的。
2.结对照片:
八.解决项目的心路历程与收获,以及结对感受
结对编程在一定程度上确实效率比较高,但是其弊端也很明显,特别是对于这种小型的项目,结对编程在一定程度上浪费了一小部分资源,但是总体而言,还是比一个人的效率更高的多,所谓当局者迷,党一个人遇到困难时,队友常常能够给出很有建设性的意见。还有就是GitHub的使用上,对于两个人,进行简单的项目而言,GitHub就可以说没有一点儿优势,只能平添玛法,但是能够想象到当遇到多人协作的大项目的时候,GitHub的优势就能很好的凸显出来。