目录git
项目 | 内容 |
---|---|
此次做业属于哪一个课程 | 软件工程 |
此次做业的要求在哪 | 结对编程做业 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
.Estimate | 估计这个任务须要多少时间 20001970 | ||
Development | 开发 | ||
.Analysis | 需求分析 (包括学习新技术) | 240 | |
.Design Spec | 生成设计文档 | 180 | |
.Design Review | 设计复审 (和同事审核设计文档) | 120 | |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | |
.Design | 具体设计 | 200 | |
.Coding | 具体编码 | 450 | |
.Code Review | 代码复审 | 240 | |
. Test | 测试(自我测试,修改代码,提交修改) | 240 | |
Reporting | 报告 | ||
.Test Report | 测试报告 | 180 | |
.Size Measurement | 计算工做量 | 30 | |
·Postmortem & Process Improvement Plan | 过后总结, 并提出过程改进计划 | 60 | |
Sum | 合计 | 1970 |
Information Hiding, Interface Design, Loose Coupling,指的就是信息隐藏,接口设计,松散耦合这几个方面。
Information Hiding的概念最初由David Parnas在Parnas(1972)中描述,在此以前,Richard Gauthier和Stephen Pont在其1970年出版的“ 设计系统程序”一书中对模块化进行了讨论。Information Hiding, Interface Design做为将任何设备,软件或硬件划分为功能模块的有效标准。例如,汽车是一种复杂的设备。为了使汽车的设计,制造和维护合理,将复杂的设备分红具备隐藏设计决策的特定接口的模块。经过以这种方式设计汽车,汽车制造商还能够提供各类选择,同时仍然具备制造经济的车辆。Information Hiding, Interface Design提供了灵活性。这种灵活性容许程序员在正常演进期间修改计算机程序的功能,由于计算机程序被改变以更好地适应用户的须要。当计算机程序设计得很好时,使用信息隐藏原理将源代码解决方案分解为模块,进化变化更容易,由于变化一般是局部变化而不是全局变化。
因此咱们的设计方案主要就是对类的变量进行私有封装,不让其暴露出来,其次为调用私有变量和修改提供特殊的接口。其次就是对每个命令行参数的处理封装成函数,便于调用,提供标准化的接口。程序员
st=>start: main函数入口 e=>end op=>operation: 处理命令行参数状态机 cond=>condition: 是否有环? op2=>operation: 拓扑排序及动态规划(类) op3=>operation: dfs暴力搜索(类) st->op->cond cond(yes)->op3 cond(no)->op2
咱们没有写这个正则表达式来匹配全部的命令行参数,由于参数个数较少,组合状况很少,因此咱们采起了有限状态机的方式来识别全部的命令选项。而后根据这个图是否有环调用相应的类去处理。对单词文本的处理是将输入的一个个单词看成图上的一个个点进行处理,采用邻接矩阵来储存边与边之间的距离,距离为被指向单词的长度
无环类:主要是一个类,运用了拓扑排序和动态规划的思想,寻找最长路径。
有环类:这个也是一个类,这部分是我写的,我主要就是DFS遍历图,暴力搜索寻找最长路径。github
VS自动生成的类图以下:正则表达式
由图咱们能够看出,咱们主要是实现了一个公共接口类,分别在有环和无环类中实现了这个处理-w和-r的函数实现。算法
咱们小组开始没有对搜索进行优化,因此说有时候进行了大量的无用搜索。咱们主要对这个拓扑排序进行了优化,减小了不少没必要要的搜索。其次就是在处理-r参数时,咱们先判断了图,若是没有环,仍然调用拓扑排序来作。这样就减小了不少时间开销。咱们这个改进大概总共花费了6个小时吧编程
Design by Contract, Code Contract就是指合同化编程,契约式设计。契约式设计就是按照某种规定对一些数据等作出约定,若是超出约定,程序将再也不运行,例如要求输入的参数必须知足某种条件。契约式设计的核心概念就是前置条件,后置条件和不变式,这种方式的好处是能够避免不少bug,减小调试的时间,这个咱们大二下OO的JSF要求差很少了。可是这种方式设计起来过于繁琐,每个函数设计起来费时费力。
因此说,咱们并无采起这种方式,而是采起了函数内检查的形式。模块化
没有封装成core接口,因此测试很差作。
TEST_METHOD(TestMethod1) { string xx = "test.txt"; ProcessNoRing p = ProcessNoRing(xx); p.init(); p.getWord(xx); Assert::AreEqual(2, p.wordNum); }
函数
-输入文件不存在oop
例如输入111.txt,可是在这个目录下没有这个文件,会报错:open file failed!!!性能
-输入的单词数量过多
例如输入五百个以上不一样的单词的文件,会报错:too many words!!!
-输入了有环的指令但图中没有环
报错:topologicalSort successed! 表示能够拓扑排序,图中无环
-输入了无环的指令但图中有环
报错:topologicalSort failed! 表示不能够拓扑排序,图中有环
-输入的首字母有除了字母以外的字符出现
报错:illegimate input as first char X(表示错误的字符)
-输入的尾字母有除了字母以外的字符出现
报错:illegimate input as last char X(表示错误的字符)
-输入的某个单词自身首尾相同
不会报错,不会自身成环
-输入单个字母的单词
不会报错,视为正常单词
这个主要就是运用状态机的知识来处理这个命令行参数。
主要函数有下面三个
void FirstState(char *argv[]); void SecondState(char *argv[]); void ThirdState(char *argv[]);
这个主要就是识别到-r进入第一个状态,而后识别到-h或者-t进入第二个状态,最后-w,-c进入第三个状态。
在这个过程当中,咱们会把一些参数转为bool型变量。
void FirstState(char *argv[]) { if (strcmp(argv[ArgvCnt], "-w") == 0 || strcmp(argv[ArgvCnt], "-c") == 0) { process = strcmp(argv[ArgvCnt], "-w") == 0 ? 0 : 1; ArgvCnt++; ThirdState(argv); } else if (strcmp(argv[ArgvCnt], "-h") == 0 || strcmp(argv[ArgvCnt], "-t") == 0) { ProStart = strcmp(argv[ArgvCnt], "-h") == 0; ProEnd = strcmp(argv[ArgvCnt], "-t") == 0; ArgvCnt++; if (strlen(argv[ArgvCnt]) == 1 && isalpha(argv[ArgvCnt][0])) { StartWord = argv[ArgvCnt][0]; EndWord = argv[ArgvCnt][0]; ArgvCnt++; SecondState(argv); } else { ErrorPrint(argv); } } else { ErrorPrint(argv); } }
部分函数如上所示。
int EnalbleLoop; //是否容许单词环 (0不容许,1容许) int process; //处理单词的方式 (0为单词数量,1为单词字母数) int ProStart; //是否指定首字母(0不指定,1指定) char StartWord; //首字母 int ProEnd; //是否指定尾字母(0不指定,1指定) char EndWord; //尾字母 string fileName; //文件路径
如上所示,这个界面模块和计算模块主要就是经过这几个全局变量进行对接,命令行的参数已经彻底转化为咱们所需的参数,直接调用便可。
咱们整个结对的过程,开始也和大多数人同样。彼此也有一些不太一致的地方。可是既然选择了在一块儿,就只能慢慢去沟通、交流、配合。通过几回线上线下的讨论以后,咱们的观点也趋于一致,而后就开始了愉快的编程了。咱们主要是我开始编写命令行参数的识别部分并提供部分接口,而后文政尧就开始写无环部分单词链的处理,而后我在开始有环单词链的处理,文政尧再进行单元测试,我负责把整个程序封装好。
结对编程的优势:
1.可以发现一些人为bug,并且可以及时修复。
2.对一些复杂算法可以及时讨论,找出合理的解决方案。
3.程序版本更新比较及时,没有滞后感
结对编程的缺点:
1.对两我的要求比较高,不必定适合本身。
2.比较耗时耗力,并且容易滞后进度,容易处在等的环节。
由于此次没有作的很好,咱们打算继续改进。
成员 | 优势 | 缺点 |
---|---|---|
15005012 左顺 | 性格开朗,执行力好,善于思考 | 有时候比较固执,对算法领悟不够深 |
16061100 文政尧 | 性格开朗,对算法理解比较好,有一些创新想法 | 执行力不是很够 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
.Estimate | 估计这个任务须要多少时间 | 2000 | |
Development | 开发 | ||
.Analysis | 需求分析 (包括学习新技术) | 240 | 250 |
.Design Spec | 生成设计文档 | 180 | 120 |
.Design Review | 设计复审 (和同事审核设计文档) | 120 | 120 |
.Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
.Design | 具体设计 | 200 | 300 |
.Coding | 具体编码 | 450 | 500 |
.Code Review | 代码复审 | 240 | 200 |
. Test | 测试(自我测试,修改代码,提交修改) | 240 | 260 |
Reporting | 报告 | ||
.Test Report | 测试报告 | 180 | 100 |
.Size Measurement | 计算工做量 | 30 | 20 |
·Postmortem & Process Improvement Plan | 过后总结, 并提出过程改进计划 | 60 | 30 |
Sum | 合计 | 1970 | 1930 |