个人第三次作业:结对编程
个人第三次作业:结对编程
结对作业 | |
---|---|
GitHub项目地址 | https://github.com/zerowcl/PairProgramming.git |
队友博客地址 | https://www.cnblogs.com/jiao54/ |
作业链接 | https://www.cnblogs.com/cherish599/p/11577268.html |
一、psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
.Estimate | .估计这个任务需要多少时间 | 800 | 970 |
Development | 开发 | 660 | 750 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 360 | 420 |
· Code Review | · 代码复审 | 60 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 120 | 200 |
· Test Report | · 测试报告 | 60 | 120 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 60 |
合计 | 800 | 970 |
二、计算模块接口的设计与实现过程
- 设计思路
(1)这次代码本来我们我们设想的是链接数据库来进行点名设计,但考虑到只能用VS完成,所以就简化了很多东西,没有链接数据库,但这样就不是很方便进行信息的及时更新,核心代码还是以老师的为主。我们设计的界面有
- 登录界面
- 点名界面
- 学生信息展示界面
流程图
graph LR
A[登录界面] --登录成功 --> B((学生信息展示界面))
A -- 登陆失败 --> C(取消)
B --> D{点名界面}
- 体现原则
- Design By Contract(契约式设计):
契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。
如何体现: 登录界面,如果密码正确即可进入学生信息界面,如果不正确,就不进入点名界面。 - Information Hiding(信息隐藏):
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
如何体现: 登录界面不需要学生信息,所以就没有添加对学生信息的引用,学生信息在登录界面也就不可访问。 - Interface Design(接口设计):
对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
如何体现:此次代码因为功能不是很多,就没有涉及接口。 - Loose Coupling 松耦合:
软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
如何体现:这次的代码设计因为没有接口,所以模块间耦合都比较高。
三、代码复审过程
- 代码规范参考
- 代码互申情况
因为我们住在一个寝室,所以在编码过程中我们就进行了代码互申,然后在互申过程中,发现我们前期构想的启动页面的进度条无法显示进度,最后抛弃了这个想法。
四、具体代码
- 登录(因为不能连接数据库,所以我们就只设计了一个用户名和密码,“text”,“1111”)
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void FrmLogin_Load(object sender, EventArgs e)
{
this.Tag = "验证失败";
}
private void button1_Click_1(object sender, EventArgs e)
{
if (textBox1.Text == "text")
{
if (textBox2.Text == "1111")
{
this.Tag = "验证成功";
this.Close();
}
}
else
{
MessageBox.Show("验证失败,请重新输入");
textBox1.Text = "";
textBox2.Text = "";
}
}
- 加载学生信息(代码出了差错,就是加载出来以后会另外添加3列放置学生信息)
StudentDAO stuDao = new StudentDAO();
stuList = stuDao.getAllStudents();
int stuCounts = stuList.Count;
progressName.Maximum = stuCounts;
DataTable dt = new DataTable();
dt.Columns.Add("stuID", Type.GetType("System.String"));
dt.Columns.Add("stuName", Type.GetType("System.String"));
dt.Columns.Add("stuSex", Type.GetType("System.String"));
foreach (Student stu in stuList)
{
dt.Rows.Add(stu.Id , stu.Name, stu.Sex);
progressName.Value += 1;
Thread.Sleep(500);
}
dgvStuList.DataSource = dt;
- 学生点名
Random ra = new Random();
int i = ra.Next(stuList.Count);
labName.Text = stuList[i].Name;
五、附加功能
- 这次代码在老师的代码的基础上增加了登录功能,其他功能由于自身C#功底浅薄,并未过多涉及。
六、单元测试
public void TestMethod1()
{
StudentDAO sd = new StudentDAO();
StudentDataset st = new StudentDataset();
}
单元测试截图:
七、结对过程
- 分工
- 何玉姣(我的队友)负责窗体信息设计及单元测试,
- 王春兰(我)负责代码编写
- 过程展示
八、个人感悟
这次代码优化,前期想了很多功能,可后期发现如果不使用数据库的话,单用C#就显得比较难做,比如学生信息即时更新等等,在经过长时间的尝试之后,由于作业时间来不及,还是选择了放弃,只保留了削减过的登录界面。这次结对编程相较之前的单人编程来讲,会好做一点,因为我们一起编程,就更容易发现对方代码中的瑕疵,对实现需求更有好处。