结对作业
| 结队作业|
:--|:--|-
GitHub项目地址|结对作业
队友博客地址|队友博客
作业链接|作业
一.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(契约式设计):
契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。
如何体现:设计在正确的输入下,能够得到正确的输出,否则程序将报错。
(2)Information Hiding(信息隐藏):
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
如何体现:看了Information Hiding的释义,对这一项还是不太明白,所以并不知道如何隐藏,想到了Public和Private。
(3)Interface Design(接口设计):
对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
如何体现:由于我们是窗体居多,类只有一个,所以我们的程序并没有接口的设计。
(4)Loose Coupling 松耦合:
软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
如何体现:由于并没有设计接口,所以没有办法去通过增加接口去提供模块间的耦合。
三.代码复审过程
1.代码规范
参考:C#代码规范
2.代码互审情况、发现的问题
我们完成这个项目都是一起讨论编程的(因为我们在一间寝室),所以并没有发现什么大的问题,有问题的进度条的设置,连接数据库,从数据库中提取随机名字,设计放置随机名字的Text的颜色和大小(不是经常使用,不是很熟),花了很多时间。
四.代码说明
(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.结对过程:
我和与我结对的同学,先把项目需要完成的功能划分成几个模块,再一起填写psp表格并进行分工。我们分别完成各自分配的模块,中途遇到的问题一起讨论查资料解决,最后我们将代码合并起来。
2.结对照片:
八.解决项目的心路历程与收获,以及结对感受
虽然老师上课给了随机点名的代码,但是要求我们去利用给出的代码自己去设计,当时心理压力和负担很大,因为对编程并不是很熟,队友想到通过和数据库连接来实现随机点名,在编程过程中遇到了很多的困难,使得完成这个项目实际花费的时间远远大于预估计划的时间,遇到了很长时间解决不了的困难的时候我们俩的心情真的很差,但是当解决掉这些困难得到时候,当时开心了很久,可能这就是编程的魅力所在吧。第一次结对完成一个项目,我的感受是1+1>2,因为在编程的时候,虽然我们负责不同的地方,也有共同的地方,但是遇到不懂的也会相互问问,还能够在互审阶段会更容易发现对方自己不易察觉的问题,不仅如此,两人合作会使遇到的困难更容易被解决,学习中得到的进步也更大。而在这一次结对的实际操作中,让我对结对编程的理解更加深入了。