个人第三次作业——结对编程 (姜玖林&于丁)
博客要求
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软件的客户端,确实好用一些。代码还需继续努力呢,加油加油!
个人第三次作业——结对编程 (姜玖林&于丁)的更多相关文章
- 第三次作业-结对编程(wordcount)
GIT地址 https://github.com/gentlemanzq/WordCount.git GIT用户名 gentlemanzq 结对伙伴博客地址 https://home.cnblogs ...
- [BUAA软工]第二次博客作业---结对编程
[BUAA软工]结对作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 2019年软件工程基础-结对项目作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能 ...
- 软件工程第三次作业-结对作业NO.1
第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...
- 第四周作业&&结对编程
1. 结对编程. 本周开始,和我结对编程的小伙伴是齐嘉亮(博客:http://www.cnblogs.com/zhengrui0452/). 因为这周需要发布四人团队项目的alpha版本,刚好我和亮哥 ...
- 软工第三次作业 -- 结对之AutoCS1.0
031302331 031302223 一.将初始排课表导入系统数据库 法1:通过jxl解析excel,把数据插入数据库.较简单,预计用时60分钟 我们采取的是 法2(预计用时30分钟):我们使用的是 ...
- 软件工程实践2019第五次作业——结对编程的编程实现 version1.1
1.链接 我的博客链接https://github.com/S031402112 结对同学的博客https://www.cnblogs.com/jiabingge/ 我们队创建的仓库的Github项目 ...
- 软工2017第四周作业结对编程——个人psp
29.22 --9.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间 结束时间 中断时间 ...
- 福大软工1816 · 第三次作业 - 结对项目Salty Fish原型图
SALTY FISH原型图 LINKS IMPORT to LIST FOCUS TRENDS ANALYSE NIGHT
- 2017-2018-2 1723《程序设计与数据结构》第十一周作业 & 实验三 & (总体)第三周结对编程 总结
作业地址 第十一次作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1933 (作业界面已评分,可随时查看,如果对自己的评分有 ...
随机推荐
- ios设备iframe无法滚动
在使用IFRAME,你需要使用一个元素(如DIV)来包装他们 <div class="scroll-wrapper"> <iframe src="&qu ...
- 一个简单的Web服务器-支持静态资源请求
目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...
- Team Foundation Server 2015使用教程【2】:默认团队成员添加
官方文档:https://www.visualstudio.com/en-us/docs/setup-admin/add-users
- HBase 分裂(split)
1. 为什么split 最初一个Table 只有一个region(因此只能存放在一个region server上).随着数据的不断写入,HRegion越来越大,当到达一定程度后分裂为两个,通过负载均衡 ...
- java环境所遇问题
在javac能运行通过并且生成了.class文件但是java文件在运行时通不过出现上面图片情况,试了一上午发现我的和别人好像不一样,下面展示我的情况, 之前用户变量那里新建了一个classpath,不 ...
- 图解Go里面的sync.Map了解编程语言核心实现源码
基础筑基 在大多数语言中原始map都不是一个线程安全的数据结构,那如果要在多个线程或者goroutine中对线程进行更改就需要加锁,除了加1个大锁,不同的语言还有不同的优化方式, 像在java和go这 ...
- HttpServletRequest,HttpServletResponse
1, Java中HttpServletRequest接口是ServletRequest子接口,HttpServletRequest接口遵循http协议.相比于HttpServletRequest接口, ...
- js中时间戳转换成xxxx-xx-xx xx:xx:xx类型日期格式的做法
1.十三位数字的时间戳转换方法 var time = new Date(datetime).toLocaleString().replace(/年|月/g, "-").replac ...
- Pillow库来着
第一步肯定是安装啦 pip install pillow 如果安装报错,可以升级一下pip库,因为有可能是pip版本低了......... pip show pip 升级用 python -m pip ...
- C语言---总结
基础 程序结构是三种: 顺序结构.选择结构(分支结构).循环结构. 读程序都要从 main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 计算机的数据 ...