个人第三次编程:结对编程

结队作业
GitHub项目地址 https://github.com/cl12312/PairProgramming.git
队友博客地址 https://www.cnblogs.com/q1281037172/
作业链接 https://www.cnblogs.com/cherish599/p/11577268.html

一、psp表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 20
Estimate 估计这个任务需要多少时间 700 800
Development 开发 600 700
Analysis 需求分析 (包括学习新技术 60 90
Design Spec 生成设计文档 10 10
Design Review 设计复审 (和同事审核设计文档) 10 10
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
Design 具体设计 60 60
Coding 具体编码 300 500
Code Review 代码复审 60 60
Test 测试(自我测试,修改代码,提交修改) 180 180
Reporting 报告 180 180
Test Report 测试报告 90 100
Size Measurement 计算工作量 15 15
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 60
合计 1665 2045

二、计算模块接口的设计与实现过程

1、设计思路

  (1).此次代码编写全程由c#来实现,将学生信息全部编辑在代码中,省去了与数据库连接的操作,但在后期维护上会有些困难。   我们设计有:

  • 登录界面
  • 显示全部学生信息的窗口
  • 实现点名的窗体
  • 小游戏窗体(掷骰子)
graph LR A(登录界面) --登录成功--> C(加载数据) C-->D(随机点名) C-->E(掷骰子) D-->E A--登录失败-->B(退出)

  (2).核心代码思路主要借鉴老师上课所提到的代码思路,在此基础上加了登录界面和掷骰子小游戏窗口。   加载数据及随机点名环节:

创建的类:

  • Base(用于模拟数据库) 通过创建一个列表并往里面加入学生信息,同时在添加学生数据时候引用了Entity类进行实例化。
  • Entity(对添加的数据进行实例化) 通过构造有参构造函数和无参构造函数为增加数据实例化做准备。
  • Dao(构造两个函数得到列表的值和列表的行数)
  • WinformControlUse(主控制台) 有三个窗口(登录窗口、点名窗口、掷骰子小游戏窗口)
    • 登录窗口:模拟登录所以只设计了一组登录账号密码(账号:admin;密码:123),密码正确则弹出点名窗口否则提醒“密码或账号错误”;
    • 点名窗口:有进度条、随机点名功能、加载数据功能,进度条是设置进度最大长度是列表长度同时每增加一行数据就进度条长度加一,加载数据是利用列表的值加载进DataGridView控件,随机点名系统是随机在小于或等于列表长度数据生成一个数据同时对应列表中某一行数据输出;
    • 游戏窗口:设计比较简单,在pictureBox中根据情况显示七张图片,利用imagelist存储骰子上1-6的图片,当点开始游戏pictureBox里显示骰子转动的GIF格式图片,随机生成六个数字对应显示1-6;
graph LR A(学生信息) -->B(Entity) B--实例化-->C(Base) C-->D(Dao) D--得到列表的值和行数-->E(WinformControlUse) E-->F(随机点名) E-->G(加载数据) E-->H(打开游戏窗口)
2、如何体现原则的
  • (1)Design By Contract(契约式设计): 契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。 如何体现:只有输入正确的账号和密码才能打开点名系统;
  • (2)Information Hiding(信息隐藏): 信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。 如何体现:设计了private和public两种访问权限,例如有些学生信息将不会在其他类中得到数据;
  • (3)Interface Design(接口设计): 对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。 如何体现:由于这次思路设计并没有地方能用的接口,所以没有实现接口设计;
  • (4)Loose Coupling 松耦合: 软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。 如何体现:在登录窗口和随机点名窗口以及游戏窗口互相切换中能很好体现松耦合;

三、代码复审

  1.代码规范   参考:C#代码规范   2.代码互审情况、发现的问题   我们在编辑代码的过程中,尝试了很多方法,但皆以失败告终,因此耽误了很多时间。但是在最后我们还是采取了相对简单的一种方法,最终完成本次作业。

四、代码说明

1.登录代码

//模拟登录界面
private void button1_Click(object sender, EventArgs e)
        {
            string name = this.textBox1.Text;
            string password = this.textBox2.Text;
            if(name.Equals("admin") && password .Equals ("123"))
            {
                MessageBox.Show("登录成功");
                this.Hide();
                welcome w = new welcome();
                w.Show();

            }
            else
            {
                MessageBox.Show("密码或账号错误!");
                this.textBox1.Clear();
                this.textBox2.Clear();

            }

        }
        //重置按钮
        private void button2_Click(object sender, EventArgs e)
        {
            this.textBox1.Clear();
            this.textBox2.Clear();
        }

2.随机点名界面

// 随机点名代码
 private void timerCallName_Tick(object sender, EventArgs e)
        {
            Random ra = new Random();
            int i = ra.Next(stuList.Count);
            lblName.Text = stuList[i].Name;
        }

3.加载学生信息代码

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(500);                
            }            
            
            dgvStuList.DataSource = dt;

            setControlVisible();

        }

4.掷骰子代码

private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = Image.FromFile(@"C:/Users/chen123/Desktop/材料/timg.gif");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
            Random rd = new Random();
            int i = rd.Next(0, 5);
            pictureBox1.Image = imageList1.Images[i];
        }

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、附加功能

  我们添加了一个掷骰子的小游戏,可以用来增加课堂上的趣味性。

六、计算模块部分单元测试展示

测试用例是将登录界面改过来的

// 登录界面创建的单元测试
[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            Console.WriteLine("请输入账号");
            string name = Convert.ToString(Console.ReadLine());
            Console.WriteLine("请输入密码");
            string password = Convert.ToString(Console.ReadLine());
            if (name.Equals("admin") && password.Equals("123"))
            {
                Console.WriteLine ("登录成功");
                }
            else
            {
                Console.WriteLine("密码或账号错误!");
            }
             }

测试结果 在这里插入图片描述

七、结对过程展示

1.结对过程:因为同为室友所以在寝室我们就说好组队,我主要负责掷骰子界面设置以及随机点名功能实现,队友主要负责界面美化以及登录界面实现; 2.结对过程: 在这里插入图片描述

八、收获

这次本来想着利用数据库可是安装很久数据库没有成功后来再尝试用Excel和记事本但是总是遇到很多问题,比如无法随机实现点名和进度条实现。在查找很多教程中浪费很多时间,后来队友说我们时间不多了我们只好匆匆忙忙借鉴老师的例子加了一些小的想法结束了这次作业。总结一下,做很多事情不能一贯而终往往中途改弦易辙浪费大量时间,以后写一个项目的时候一开始就先思考清楚具体思路以及需要用到哪些东西,如此应该在行动上可以节约大量时间。

猜你喜欢

转载自www.cnblogs.com/chen100/p/11614610.html