个人第3次作业:结对编程

个人第三次作业——结对编程(黄耀萱、孙颖)

结对作业
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#语言将学生信息录入,登录后进行数据加载,并实现实现点名功能。
  

  • 设计流程图如下:

个人第3次作业:结对编程_第1张图片

  • 这些功能总体由这几个部分组成:

(1)FrmLogin(登陆窗体)

个人第3次作业:结对编程_第2张图片

(2)FrmStudent(学生随机点名系统窗体)

个人第3次作业:结对编程_第3张图片

(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、在代码复审过程中,我和小孙一起检查排版是否正确,命名是否规范,包括方法的命名、控件的命名、类的命名等。

五、运行结果

  • 开始登陆

个人第3次作业:结对编程_第4张图片

  • 加载学生

个人第3次作业:结对编程_第5张图片

  • 开始点名

个人第3次作业:结对编程_第6张图片

六、单元测试

测试代码:

 public class UnitTest1
    {
        public static List studengList;
        [TestMethod]
        public void studengListTest()
        {
            studengList = new List();
            Student stu1 = new Student("001", "王川");
            studengList.Add(stu1);
        }
    }

结果如图:

个人第3次作业:结对编程_第7张图片

七、结对的过程及照片

1、结对分工

我(黄耀萱):主要负责代码的编写

队友(孙颖):主要负责单元测试以及窗体设计

2、讨论的结对照片:

个人第3次作业:结对编程_第8张图片

八、总结与感想

这次作业考验的是分工合作能力,我和小孙是室友,平时一起活动的时间比较多,所以和她结对很方便也很高效。在作业中我们遇到了很多问题,比如最初构想中在登陆环节连接数据库,后来我们一致觉得太繁琐没有必要,就换成了更简洁的模式。两个人在合作的过程中互相帮对方发现问题,共同找解决方案,大大提升了效率。以后在学习别的课程时,说不定也可以用上这种结对模式。

你可能感兴趣的:(个人第3次作业:结对编程)