个人第三次作业——结对编程 (姜玖林&于丁)

博客要求

Github项目地址:https://github.com/zhibihuayue/PairProgramming

作业地址 : https://www.cnblogs.com/cherish599/p/11577268.html|

一、PSP表格估计时间

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

二、项目克隆

1.班级仓库。

在这里插入图片描述

2.进入PairProgramming文件夹,新建一个自己使用的文件夹。

在这里插入图片描述

3.VS软件编写

在这里插入图片描述

三、代码设计(代码设计和队友一起商量,所以这部分很多是一样的)

1.计算模块接口的设计与实现过程

解题思路
骰子游戏注意设置随机数的生成,以及将该随机数与外部输入的数字进行比较,并返回结果
程序实现说明
投骰子游戏,用户先猜取一个骰子数,然后丢骰子,若相同则胜利。
1.用户猜取骰子数板块,不需要用户通过键盘录入,而是通过可视化按钮选猜选骰子数(1-6),同时可在此板块下方实时查看自己选取得数字,并且丢骰子前支持用户重新猜选数字
2.丢骰子游戏主板块,用户在猜选数字后通过“丢骰子”按钮开始游戏,经过丢骰子动画后,显示丢出骰子数与用户游戏胜利情况;
游戏结束后用户可以通过“开始新的游戏”按钮,重置游戏所有窗口开始下一轮。
3.规则说明及结果显示板块,若用户猜对则显示胜利,反之显示失败情况(大或小)
4.若用户未猜取数字,直接丢骰子,将弹出错误提示窗口,引导用户正确游戏。
附加功能
1.游戏局数计数显示
2.操作错误弹窗引导提示
3.一键重置开启新游戏
4.优化操作界面,增加投掷动画,提升游戏趣味性
Design By Contract(契约式设计):
契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。
该程序中
第一个版本A里,若用户输入骰子数不再0-6之间,程序将直接报错提示用户错误,并引导重新输入;
第二个版本B里,若用户未猜测骰子直接丢骰子,程序将弹窗报错并直接return此回游戏,引导用户正确流程“猜选后才可丢骰子”。

即为:设计在正确的输入下,能够得到正确的输出,否则程序将报错。
Information Hiding(信息隐藏):
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的

即为:在程序中根据使用情况,合理设置public和Private,准确设置各模块访问权限
Interface Design(接口设计):
对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
该程序中
我们程序中对骰子1-6模拟建库,封装类库“DataBase”存放骰子数,封装类库“Entity”映射数据,封装类库“DaoLayer”提取所有筛子数据,并在窗体中模拟获取数据源,并构造数据加载。(实际之后窗体程序中未用该数据,仅作练习)

代码展示(我负责代码部分)

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 DiceData
    {
        private static List<Dice> diceList;


        public static List<Dice> getAll()
        {
            diceList = new List<Dice>();

            Dice num1 = new Dice("1");
            diceList.Add(num1);
            Dice num2 = new Dice("2");
            diceList.Add(num2);
            Dice num3 = new Dice("3");
            diceList.Add(num3);
            Dice num4 = new Dice("4");
            diceList.Add(num4);
            Dice num5 = new Dice("5");
            diceList.Add(num5);
            Dice num6 = new Dice("6");
            diceList.Add(num6);


            return diceList;
        }
    }
}


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 DiceData
    {
        private static List<Dice> diceList;


        public static List<Dice> getAll()
        {
            diceList = new List<Dice>();

            Dice num1 = new Dice("1");
            diceList.Add(num1);
            Dice num2 = new Dice("2");
            diceList.Add(num2);
            Dice num3 = new Dice("3");
            diceList.Add(num3);
            Dice num4 = new Dice("4");
            diceList.Add(num4);
            Dice num5 = new Dice("5");
            diceList.Add(num5);
            Dice num6 = new Dice("6");
            diceList.Add(num6);


            return diceList;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;
using Entity;
using DataBase;
namespace DaoLayer
{
    class DaoDice
    {
        public class StudentDAO
        {
            public int getDiceRecordsNums()
            {
                List<Dice> DiceList = DiceData.getAll();
                return DiceList.Count;
            }

            public List<Dice> getAllDice()
            {
                List<Dice> diceList = DiceData.getAll();
                return diceList;
            }

        }
    }
}


2.界面展示

3.代码复审(于丁博客

通过自己测试审查自己的代码,以及交换互审对方的代码,最后一起审核阅读版本合并后的代码,说明如下:
1.概要部分
1.代码符合需求和规格说明。对功能的实现非常完善。
2.代码设计有比较周全的考虑。首先,通过将原版本的用户录入读取数据的方式,更改为全窗体按钮式交互。减少输入处理,不需要对输入的格式进行检查,只需数字大小进行判断。
3.代码有较高的可读性。代码根据功能分为了几个不同的类,对功能的划分较为直观,关键部分有详细的注释,但有些部分仍缺少必要的注释,存在一些难以理解的代码。
4.由于代码的分工十分明确,所以易于维护。
2.设计规范部分
1.没有应用常用的设计模式。
2.有较多的硬编码存在,比如在很多的if判断
3.调用已有库的功能较少。
4.尽量删减无用的代码。
3.代码规范部分
1.程序整体代码风格一致。
4.具体代码部分
1.对不同类型的错误进行了处理,在某些地方检查了函数的返回值。
2.没有使用断言。
3.在生成覆盖Num的过程中,没有可导致内存泄漏的地方。
5.效能
1.程序的效能较差,重复50000个词游戏大概要4分钟。
2.程序只有对文件的读写操作,不会超时。没有网络调用。
6.可读性
1.代码的可读性较高,有大量的注释。但仍有个别关键函数缺少必要的注释,读起来难以理解。
7.可测试性
1.代码的单元测试不足。需要增加一些单元测试。
2.没有涉及到数据库、网络、多线程等。

4.单元测试(于丁博客

四、结对的过程

1.结对成员(姜玖林&于丁)

在这里插入图片描述

2.提前准备内容

我们组计划做两个不同版本,我先做了个控制台的应用程序,下面的代码便是我提前做出来的内容,在此基础上进行改动,最终程序确定的是form的程序.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace GuessNumber

{

   
class Program

    {

       
static void Main(string[] args)

       
{

           
const int GuessChance = 7;

 

           
while (true)

           
{

               
Console.WriteLine("*********************欢迎来到猜数字*********************\n");

 

                //生成一个随机数.

                int targetNum = new
Random().Next(1, 101);

 

                for (int i = 1; i <=
GuessChance; i++)

                {

                    //输入猜想.

                    Console.Write("请输入猜想 {0}:
", i);

                    int guessNum =
Convert.ToInt32(Console.ReadLine());

                    Console.WriteLine("猜想 {0}:
{1}", i, guessNum);

 

                    //判断猜大了还是猜小了.

                    if (guessNum >
targetNum)

                    {

                       
Console.WriteLine("猜大了!");

                    }

 

          
         if (guessNum <
targetNum)

                    {

                       
Console.WriteLine("猜小了!");

                    }

 

                    //猜中了.

                    if (guessNum == targetNum)

                    {

                        Console.WriteLine("恭喜你猜中了!");

                        Console.WriteLine();

                        break;

                    }

 

                    Console.WriteLine();

                }

 

                //是否继续游戏的判断.

                Console.WriteLine("是否再来一次游戏?y/n");

                string comfirm =
Console.ReadLine();

                if (comfirm == "y" ||
comfirm == "Y")

                {

                    Console.WriteLine();

                    continue;

                }

                else

                {

                    Console.WriteLine("游戏结束!");

                    break;

                }

           
}

 

           
Console.ReadKey();     
          }
    }
}

3.结果展示

五、总结

此次的作业着实太过幸运,竟然迎来了建国七十大庆,小姜同志只得把重重的电脑搬回家里,继续完成作业。
对于此次作业,我们组没有用老师给我们演示的案例(考勤系统)来做,我和于丁思考了一下,决定来个不一样的东西,然后就选择了骰子游戏。我们把骰子游戏进行了部分改动,即没有选择数字的限制(骰子最多选择六点),就单纯稍微改动了一下子。
非常感谢我的队友丁丁同学的帮助,教会了我很多东西,还推荐我使用了git软件的客户端,确实好用一些。代码还需继续努力呢,加油加油!

posted @ 2019-10-01 21:40  jearry  阅读(236)  评论(0编辑  收藏  举报