Week3结对项目-数独游戏
题目要求
1)在文章开头给出Github项目地址。(1')
2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')
3)看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。(5')
4)计算模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。(7')
5)阅读有关UML的内容:https://en.wikipedia.org/wiki/Unified_Modeling_Language。画出UML图显示计算模块部分各个实体之间的关系(画一个图即可)。(2’)
6)计算模块接口部分的性能改进。记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2015/2017的性能分析工具自动生成),并展示你程序中消耗最大的函数。(3')
7)看Design by Contract, Code Contract的内容:
http://en.wikipedia.org/wiki/Design_by_contract
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
描述这些做法的优缺点, 说明你是如何把它们融入结对作业中的。(5')
8)计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。要求总体覆盖率到90%以上,否则单元测试部分视作无效。(6')
9)计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。(5')
10)界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。(5')
11)界面模块与计算模块的对接。详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。(4')
12)描述结对的过程,提供非摆拍的两人在讨论的结对照片。(1')
13)看教科书和其它参考书,网站中关于结对编程的章节,例如:
http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html
说明结对编程的优点和缺点。
结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。(5')
14)在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。(0.5')
回答
- 问题中带#的部分是我的回答内容,其余部分请移步 http://www.cnblogs.com/wzjb/p/7667822.html 梓嘉在它的博客里做了很好的回答与说明,在设计和实现的许多环节里,梓嘉
都做出了非常大的贡献,而我则因为种种原因(拖延症,时间安排等),没有非常好的尽到应尽的责任,甚至拖慢了项目的进度。
github
https://github.com/ZiJiaW/SudokuGame
3)
设计
- 关于Information Hiding
其概念的具体内涵在我看来就是,尽可能隐藏、封闭实现的细节,将具体复杂琐碎的数据和操作用函数化、私有化、局部化的方法加以限制,使其不需要也不能被外部了解。
这样一来好处有两点:
- 减少其他人或者日后的自己理解主要逻辑流程的难度
- 方便维护,如要更改具体实现的细节,升级或者是修复Bug都可以在局部解决。
在实现中,我举个例子
我在类的设计中使用了ArgumentHandler和FileHandler
class ArgumentHandler
{
public:
ArgumentHandler();
void ParseInput(int argc, char **argv);
State GetState();
unsigned int GetCount();
const char * GetPathName();
Difficulty GetDifficulty();
unsigned int GetLower();
unsigned int GetUpper();
private:
..
}
这个类的作用就是处理命令行参数,并且提供各种Get返回处理的结果,作为外部使用者而言,不需要知道任何private的内容就可以使用它,其内部储存的数据对外界是不可见的(没有Set)这样一来其能确保安全性。
- 关于Interface design和LooseCoupling
继续以上一个例子进行说明,我们在结对编程时需要处理比个人项目而言更多的参数,但是对于ParseInput而言,其输入端不需要改变,其原有的输出也不用改变,唯一需要改变的就是ParseInput内部的实现。像这样的设计还被用来将数独生成和求解的算法细节与类的公共接口分开,将缓冲的内部实现对外部隐藏等。
其作用就是将功能实现代码,与使用功能的代码区分开来,以Interface作为协议,这么做的好处很明显,划清责任能方便共同开发。
契约式编程的好处是使的代码的流程和结构变得非常的精致,每一个函数的行为规范都有明确设计,这样一来大部分的错误和问题变得有径可循。
其坏处是使的代码的改动变得不那么容易,因为这意味着重新设计契约-而这最好是在一开始就能确定下来,否则其损失的成本可能不能被其带来的好处所弥补。
我们在实现项目时并没有完全按照契约式编程的设计来做。
对于前置条件,我们往往假定所有传入的参数都是合理的,而不对其做检查,这样可能有风险但是其使得开发变得快捷高效。
对于SideEffect, 这在实现中经常被用来返回数据(通过指针)
对于后置条件,一般函数名能够很好的说明返回值的意义,例如Get,Is开头的函数。不过确实有一些函数的返回值,其意义较难以从函数名中看出来,例如Solve这个函数,我规定其返回
的值为传入的数独中可解数独的数量,这点可能确实不明显。
9)
/*计算模块中使用的主要是参数错误异常,在函数的开头就对参数做详细的分析,确保其符合规范,否则就抛出参数无效异常。
其提示依据不同的函数而不同*/
void generate(int number, int mode, int result[][81]){
if (number < 0)
{
throw invalid_argument("The argument of \"-n\" shouldn`t be less than zero");
}
else if (number > gMaxGenRanAmount)
{
throw invalid_argument("The argument of \"-n\" shouldn`t be bigger than 10000");
}
else if (mode < 1 || mode>3)
{
throw invalid_argument("The argument of \"-m\" should be in the range of [1,3]");
}
else if(result==NULL)
{
throw invalid_argument("The argument of result shouldn`t be NULL");
}
}
bool solve(int puzzle[], int solution[81])
{
if (puzzle == NULL)
{
throw invalid_argument("The argument of puzzle shouldn`t be NULL");
}
else if (solution == NULL)
{
throw invalid_argument("The argument of solution shouldn`t be NULL");
}
}
结对编程的优点
- 弥补个人能力的短板和重大的缺陷
- 互相督促,对其他人负责的心理能很好的促进进度。
- 分工合作,节省精力
- 相互学习
缺点
- 进度难以把控
- 合作可能会低效率,责任不清楚的地方可能两个人做的还不如一个人好
PSP
部分数据来自后期估计..
Week3结对项目-数独游戏的更多相关文章
- [buaa-SE-2017]结对项目-数独程序扩展
结对项目-数独程序扩展 step1~step3:github:SE-Sudoku-Pair-master step4:github:SE-Sudoku-Pair-dev-combine step5:g ...
- [BUAA_SE_2017]结对项目-数独程序扩展
结对项目-数独程序扩展 Runnable on x64 Only sudoku17.txt 须放置在可执行文件同目录中,可移步以下链接进行下载 Core-Github项目地址 GUI-Github项目 ...
- [2017BUAA软工]结对项目-数独程序扩展
零.github地址 GitHub地址:https://github.com/Liu-SD/SudoCmd (这个地址是命令行模式数独的仓库,包含了用作测试的BIN.DLL核心计算模块地址是:http ...
- 结对项目——黄金分割点游戏(陈香宇&蔡春燕)
结对项目名称:黄金分割点游戏(单机) 运行环境:vs 编译语言:c语言 项目分析: 实现的功能:用户可以选择继续游戏并且可以保存之前获得的分数,但是为了游戏的公平性,游戏的参数人数一开始用户确定以后就 ...
- [2017BUAA软工]结对项目:数独扩展
结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...
- 使用Xamarin开发移动应用示例——数独游戏(一)项目的创建与调试
最近项目中需要移动客户端,由于团队基本上使用.Net产品线,所以决定使用Xmarin进行开发,这样技术路线统一,便于后期维护.官网上是这样介绍的" Xamarin 允许你使用 .NET 代码 ...
- 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(结对项目)
Foreword 此次的结对项目终于告一段落,除了本身对软件开发的整体流程有了更深刻的了解外,更深刻的认识应该是结对编程对这一过程的促进作用. 在此想形式性但真心地啰嗦几句,十分感谢能端同学能够不厌其 ...
- [2017BUAA软工助教]结对项目小结
2017BUAA结对项目小结 一.作业链接 http://www.cnblogs.com/jiel/p/7604111.html 二.评分细则 1.注意事项 按时间完成并提交--正常评分 晚交一周以内 ...
- 结对项目:SudokuGame
1. Github项目地址:https://github.com/ZiJiaW/SudokuGame GUI在BIN目录下的SudokuGUI.rar中,解压后打开SudokuGame.exe即可.2 ...
随机推荐
- JavaWeb基础—邮件发送
一.JavaMail概述与入门 JavaMail-java提供的一组API,用来收发邮件 中间有个邮件服务器: 客户端发给邮件服务器,另外一收件客户端从邮件服务器下载(最稳的还是163,QQ有点不靠谱 ...
- Gson转换复杂对象报错【类型强转错误】
一.问题: 项目里遇到一个需求,规则文件下载后,导入本地解析. 采用的方案是:获取复杂对象,使用谷歌Gson转换为字串保存为文件下载,客户端读取文件,解析字串,反解对象 遇到的问题:传输的对象是一个嵌 ...
- PosgreSQL 9.0 High Performance中文版瑕疵
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页 发表此文不是为了吐槽,而是为了防止更多的受害者出现啊,拿到书后 ...
- 18-[模块]-random&os&sys
1.random模块 程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串 # randrange #返回1-3之间的一个随机数,不包含3 # ra ...
- File System Object(FSO对象)B
一.实例FSO获取当前路径下的文件 Sub Fsotest() Dim Fso As New FileSystemObject, Path As String, File Path = ThisWor ...
- nginx解析漏洞,配置不当,目录遍历漏洞环境搭建、漏洞复现
nginx解析漏洞,配置不当,目录遍历漏洞复现 1.Ubuntu14.04安装nginx-php5-fpm 安装了nginx,需要安装以下依赖 sudo apt-get install libpcre ...
- Unity扩展编辑器二
Unity支持自行创建窗口,也支持自定义窗口布局,在Project视图中创建一个Editor文件夹,在文件夹中创建一条脚本 自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时 ...
- Unity面试技巧之C#基础
1. 定义常量最好使用运行是常量就是readonly 编译常量就是 const public static readonly MyClass myClass = new MyClass(); publ ...
- Shader食谱 Chapter3--Toonshader卡通效果
Shader食谱 Chapter3--Toonshader卡通效果 unity shader toon 卡通Shader Shader食谱 Chapter3--Toonshader卡通效果 Over ...
- node安装和npm全局配置
本文章环境 windows10 64位家庭版 Node10.15.3LTS 安装包下载 Node官网 安装node 点击安装文件, 一键安装, 注意安装位置和添加到环境变量(xx to PATH)选项 ...