个人第三次作业——结对编程(黄耀萱、孙颖)
结对作业 | |
---|---|
Github项目地址 | GitHub项目 |
结对伙伴的博客地址 | 小孙的博客 |
作业链接 | 作业要求 |
一、PSP表格
PSP是卡耐基梅隆大学(CMU)的专家们针对软件工程师所提出的一套模型:Personal Software Process (PSP, 个人开发流程,或称个体软件过程)。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
·Estimate | · 估计这个任务需要多少时间 | 840 | 900 |
Development | 开发 | 720 | 810 |
· Analysis | · 需求分析 (包括学习新技术) | 80 | 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 | · 计算工作量 | 8 | 8 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 2578 | 2918 |
二、设计与原则
1.设计
该项目运用C#语言将学生信息录入,登录后进行数据加载,并实现实现点名功能。
- 设计流程图如下:
- 这些功能总体由这几个部分组成:
(1)FrmLogin(登陆窗体)
(2)FrmStudent(学生随机点名系统窗体)
(3)Student、StudentDataset、StudentDAO类
2.原则
(1)Design By Contract(契约式设计):契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。
如何体现:设计在正确的输入下,能够得到正确的输出,否则程序将报错。
参考链接:https://baike.baidu.com/item/%E5%A5%91%E7%BA%A6%E5%BC%8F%E8%AE%BE%E8%AE%A1/2180000?fr=aladdin
(2)Information Hiding(信息隐藏):信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
如何体现:C#中的访问修饰符分为public 、private、protected 、internal等,而修饰类的只有public和internal。
●public:公开的、公共的;
●private:私有的,只能在当前类的内部访问;
●protected:受保护的,只能在当前类的内部及该类的子类中访问;
●interal:只能在当前项目中访问。
(3)Interface Design(接口设计):对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
如何体现:我们用的是项目之间的引用,并没有涉及到接口。
(4)Loose Coupling (松耦合):软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
如何体现:目前并没有达到很熟练的程度,模块之间联系并不是很紧密,耦合性较差。
三、具体代码(部分)
(1)登录界面代码设计如下,由于没有连接数据库,所以只设计了一组用户名“黄老师”和密码“123”。
public FrmLogin()
{
InitializeComponent();
}
private void Login_Click(object sender, EventArgs e)
{
string name = this.TBname.Text;
string password = this.TBpwd.Text;
if (name.Equals("黄老师") && password.Equals("123"))
{
FrmStudent frm = new FrmStudent();
frm.Show();
this.Hide();
}
else
{
MessageBox.Show("用户名或密码错误");
}
}
private void Esc_Click(object sender, EventArgs e)
{
this.Close();
}
(2)FrmStudent代码设计,即学生随机点名系统窗体的设计:
private void btnLoadStu_Click(object sender, EventArgs e)
{
//获取学生数据源
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"));
//数据加载以进度条方式展现
foreach (Student stu in stuList)
{
dt.Rows.Add(stu.Id,stu.Name);
progressName.Value += 1;//一个学生,进度条加1;
Thread.Sleep(30);
}
dgvStuList.DataSource = dt;
setControlVisible();
}
(3)创建学生表并实现调用,完成随机点名:
public class StudentDataset
{
//模拟数据库中的学生集合
private static List studengList;
public static List getAll()
{
studengList=new List();
Student stu1 = new Student("001", "王川");
studengList.Add(stu1);
Student stu2 = new Student("002", "于丁");
studengList.Add(stu2);
Student stu3 = new Student("003", "张莹");
studengList.Add(stu3);
Student stu4 = new Student("004", "李楠");
studengList.Add(stu4);
Student stu5 = new Student("005", "陈欣");
studengList.Add(stu5);
Student stu6 = new Student("006", "马芸慧");
studengList.Add(stu6);
......
return studengList;
}
四、代码复审过程
1、C#代码编写规范:https://blog.csdn.net/VS18703761631/article/details/94615734
2、在代码复审过程中,我和小孙一起检查排版是否正确,命名是否规范,包括方法的命名、控件的命名、类的命名等。
五、运行结果
- 开始登陆
- 加载学生
- 开始点名
六、单元测试
测试代码:
public class UnitTest1
{
public static List studengList;
[TestMethod]
public void studengListTest()
{
studengList = new List();
Student stu1 = new Student("001", "王川");
studengList.Add(stu1);
}
}
结果如图:
七、结对的过程及照片
1、结对分工
我(黄耀萱):主要负责代码的编写
队友(孙颖):主要负责单元测试以及窗体设计
2、讨论的结对照片:
八、总结与感想
这次作业考验的是分工合作能力,我和小孙是室友,平时一起活动的时间比较多,所以和她结对很方便也很高效。在作业中我们遇到了很多问题,比如最初构想中在登陆环节连接数据库,后来我们一致觉得太繁琐没有必要,就换成了更简洁的模式。两个人在合作的过程中互相帮对方发现问题,共同找解决方案,大大提升了效率。以后在学习别的课程时,说不定也可以用上这种结对模式。