个人第三次作业——结对编程 (姜玖林&于丁)
博客要求
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 (作业界面已评分,可随时查看,如果对自己的评分有 ...
随机推荐
- Weblogic/WAS之Full GC监控与计算
在网上看到关于内存回收机制,同大家一起分析探讨.堆内存划分为Eden.Survivor 和 Tenured/Old 空间,如下图所示: Minor GC 会清理年轻代的内存,Major GC 是清理老 ...
- [板子]KMP
KMP板子,你甚至可以用这个板子A掉luogu的3375 基础懒得说,要求一个Next数组. #include<cstdio> #include<algorithm> #inc ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明(转)
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 缓存, 队列(Redis,RabbitMQ)
Redis Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- 什么?我往Redis写的数据怎么没了?
大概是因为int没有因为change方法而改变原值,所以就说它传过去的是自身的值,因而叫值传递:User对象经过change方法后,对象的数据变了,就认为是因为实参和形参指向的是同一片内存空间,内存空 ...
- 用Robot Framework+python来测试基于socket通讯的C/S系统(网络游戏)
项目终于换了方案,改用socket来实现而不是之前的http了,所以测试工具就不能用以前的了,因为测试人手少,逼不得已的必须要挖掘更多的自动化方案来弥补.于是先研究了下python的socket解决方 ...
- kotlin + springboot整合mybatis操作mysql数据库及单元测试
项目mybatis操作数据库参考: http://how2j.cn/k/springboot/springboot-mybatis/1649.html?p=78908 junit对controller ...
- context:component-scan 和 mvc:annotation-driven
前言 Spring MVC 框架提供了几种不同的配置元素来帮助和指示 Spring 容器管理以及注入 bean . 常用的几个 XML 配置是 context:component-scan mvc:a ...
- Java操作Jxl实现导出数据生成Excel表格数据文件
实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...
- 洛谷P1035 级数求和 题解 简单模拟
题目链接:https://www.luogu.com.cn/problem/P1035 题目描述 已知:\(S_n= 1+1/2+1/3+-+1/n\).显然对于任意一个整数 \(k\),当 \(n\ ...