结对作业

| 结队作业|
:--|:--|-
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,因为在编程的时候,虽然我们负责不同的地方,也有共同的地方,但是遇到不懂的也会相互问问,还能够在互审阶段会更容易发现对方自己不易察觉的问题,不仅如此,两人合作会使遇到的困难更容易被解决,学习中得到的进步也更大。而在这一次结对的实际操作中,让我对结对编程的理解更加深入了。

posted @ 2019-09-29 21:16  曾琅  阅读(252)  评论(1编辑  收藏  举报