结对作业

结队作业| |
:--|:--|-
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的优势就能很好的凸显出来。

posted @ 2019-09-29 21:36  Amazing-ZYJ  阅读(156)  评论(1编辑  收藏  举报