个人第三次作业——结对编程
Github项目地址 | https://github.com/hechenrui98/PairProgramming |
---|---|
队友博客地址 | https://www.cnblogs.com/71355cb/p/11615050.html |
1.结对PSP表格
psp | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 55 |
Estimate | 估计这个任务需要多少时间 | 180 | 200 |
Development | 开发 | 70 | 90 |
Analysis | 需求分析 (包括学习新技术) | 60 | 60 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 (和同事审核设计文档) | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 40 | 60 |
Coding | 具体编码 | 50 | 90 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 30 | 40 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 80 | 80 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 715 | 835 |
-
2.代码设计及其实现过程
- 代码的组织
本次的结对项目我们选择了学生点名系统,我们定义了四个类库,分别分为:窗体层,实体层,存储学生数据的数据集层,和一个学生签到情况层。在每个类库分别建立了一个类,窗体层包含一个主函数,实体集层定义一个定义学生信息的函数,数据集层定义了包含所有学生实体信息的函数,学生签到情况层定义了取得学生信息的函数,和一个返回学生序号的函数。 - 算法关键:实现学生信息的调用,学生的随机点名
- Design by Contract:通过精确的接口设计与调用实现契约式设计,使程序运行更安全有效
- Information Hiding:我们设计一个模块内包含的特定信息时,对于不需要这些信息的其他模块来说,我们使用了private和public两个字段来达到保护信息的同时使程序正常运行
Interface Design:
Loose Coupling:编写代码时,我们将每个类的函数结构设计的很紧凑,将每个类之间的函数关系定义的很简单,达到高内聚,低耦合
3.代码复审
在写完代码后我们发现函数定义准确,调用也是准确的,每一层的关系也设计的很好,但是调试始终有问题,后来发现在定义学生函数的时候,定义性别的字符串写成了小写string,到时无法运行,该为大写之后就可以正常执行了。
4.部分代码展示
窗体层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WinformControlUse
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmStudent());
}
}
}
- 学生实体层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Entity
{
public class Student
{
private String id;
public String Id
{
get { return id; }
set { id = value; }
}
private String name;
public String Name
{
get { return name; }
set { name = value; }
}
private String sex;
public String Sex
{
get { return sex; }
set { sex = value; }
}
public Student()
{
}
public Student(String id, String name, String sex)
{
this.id = id;
this.name = name;
this.sex = sex;
}
}
}
- 学生数据集层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Collections;
using Entity;
namespace DataBase
{
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);
Student stu7 = new Student("007", "汪小萍", "女");
studengList.Add(stu7);
Student stu8 = new Student("008", "母丹", "女");
studengList.Add(stu8);
Student stu9 = new Student("001", "许博", "男");
studengList.Add(stu9);
Student stu10 = new Student("002", "芦文钰", "男");
studengList.Add(stu10);
Student stu11 = new Student("011", "马昊妍", "女");
studengList.Add(stu11);
Student stu12 = new Student("012", "李宣晓", "女");
studengList.Add(stu12);
Student stu13 = new Student("013", "李清兰", "女");
studengList.Add(stu13);
Student stu14 = new Student("014", "成湘", "女");
studengList.Add(stu14);
return studengList;
}
}
}
注:由于学生人数太多,只展示部分
- 学生签到情况层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataBase;
using Entity;
namespace DaoLayer
{
public class StudentDAO
{
public int getStudentRecordsNums()
{
List studengList=StudentDataset.getAll();
return studengList.Count;
}
public List getAllStudents()
{
List studengList = StudentDataset.getAll();
return studengList;
}
}
}