博客要求

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

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

一、PSP表格估计时间

Planning计划4545
Estimate估计这个任务需要多少时间4545
Development开发720660
Analysis需求分析 (包括学习新技术)4530
Design Spec生成设计文档3030
Design Review设计复审 (和同事审核设计文档)3045
Coding Standard代码规范 (为目前的开发制定合适的规范)3030
Design具体设计6060
Coding具体编码300450
Code Review代码复审6060
Test测试(自我测试,修改代码,提交修改)9090
Reporting报告7090
Test Report测试报告3030
Size Measurement计算工作量2530
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划2030
合计16001725

二、项目克隆

1.班级仓库。

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

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

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

3.VS软件编写

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

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

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

解题思路

骰子游戏注意设置随机数的生成,以及将该随机数与外部输入的数字进行比较,并返回结果

程序实现说明

投骰子游戏,用户先猜取一个骰子数,然后丢骰子,若相同则胜利。

1.用户猜取骰子数板块,不需要用户通过键盘录入,而是通过可视化按钮选猜选骰子数(1-6),同时可在此板块下方实时查看自己选取得数字,并且丢骰子前支持用户重新猜选数字

2.丢骰子游戏主板块,用户在猜选数字后通过“丢骰子”按钮开始游戏,经过丢骰子动画后,显示丢出骰子数与用户游戏胜利情况;

游戏结束后用户可以通过“开始新的游戏”按钮,重置游戏所有窗口开始下一轮。

3.规则说明及结果显示板块,若用户猜对则显示胜利,反之显示失败情况(大或小)

4.若用户未猜取数字,直接丢骰子,将弹出错误提示窗口,引导用户正确游戏。

附加功能

1.游戏局数计数显示

2.操作错误弹窗引导提示

3.一键重置开启新游戏

4.优化操作界面,增加投掷动画,提升游戏趣味性

Design By Contract(契约式设计):

契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。

该程序中

第一个版本A里,若用户输入骰子数不再0-6之间,程序将直接报错提示用户错误,并引导重新输入;

第二个版本B里,若用户未猜测骰子直接丢骰子,程序将弹窗报错并直接return此回游戏,引导用户正确流程“猜选后才可丢骰子”。

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

即为:设计在正确的输入下,能够得到正确的输出,否则程序将报错。

Information Hiding(信息隐藏):

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的

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

即为:在程序中根据使用情况,合理设置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.界面展示

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

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.单元测试(于丁博客

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

四、结对的过程

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

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

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.结果展示

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

五、总结

此次的作业着实太过幸运,竟然迎来了建国七十大庆,小姜同志只得把重重的电脑搬回家里,继续完成作业。

对于此次作业,我们组没有用老师给我们演示的案例(考勤系统)来做,我和于丁思考了一下,决定来个不一样的东西,然后就选择了骰子游戏。我们把骰子游戏进行了部分改动,即没有选择数字的限制(骰子最多选择六点),就单纯稍微改动了一下子。

非常感谢我的队友丁丁同学的帮助,教会了我很多东西,还推荐我使用了git软件的客户端,确实好用一些。代码还需继续努力呢,加油加油!

05-13 13:01