项目 | 内容 |
---|---|
课程 | 软件工程(罗杰) |
做业要求 | 结对项目-单词最长链 |
本次做业的目的 | 体验结对编程 |
本次做业对个人锻炼 | 熟悉结对编程,了解结对编程的优势和缺点 |
项目github地址 | 项目地址 |
项目地址git
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60(1h) | |
· Estimate | · 估计这个任务须要多少时间 | 60(1h) | |
Development | 开发 | 1500(25h) | |
· Analysis | · 需求分析 (包括学习新技术) | 120(2h) | |
· Design Spec | · 生成设计文档 | 120(2h) | |
· Design Review | · 设计复审 (和同事审核设计文档) | 60(1h) | |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60(1h) | |
· Design | · 具体设计 | 120(2h) | |
· Coding | · 具体编码 | 600(10h) | |
· Code Review | · 代码复审 | 240(4) | |
· Test | · 测试(自我测试,修改代码,提交修改) | 180(3h) | |
Reporting | 报告 | 240(4h) | |
· Test Report | · 测试报告 | 120(2h) | |
· Size Measurement | · 计算工做量 | 60(1h) | |
· Postmortem & Process Improvement Plan | · 过后总结, 并提出过程改进计划 | 60(1h) | |
合计 | 1800(30h) |
Information Hiding(信息隐藏)github
信息隐藏是指在设计和肯定模块时,使得一个模块内包含的特定信息(过程或数据),对于不须要这些信息的其余模块来讲,是不可访问的。这个体如今类的私有属性和函数上。算法
Interface Design(接口设计)编程
接口设计是对程序的进一步封装,主要依赖的原则有:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、开闭原则等。本次项目中的程序并未用到类的继承,除了里氏替换原则以外,其余的几个接口原则基本都知足了。数组
Loose Coupling(松散耦合)函数
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时代表其独立性越差( 下降耦合性,能够提升其独立性)。本项目分为两个模块,输入模块和计算模块,基本实现了高内聚低耦合的要求。oop
void Get_num(char* word[], int len, bool Weight);
// 构造图的模块
void topologicalSort();
// 拓扑排序模块
void longestPath(int start, char* word[], bool begin_end, bool Weight);
// 从点start找出最长链的模块
void Every_Path(int chose, char* word[], char end_letter, char start_letter, bool Weight);
// 根据处理输入的结果,以及接口实现找word list中的最长链性能
int getWord(char *words[], string path); // 根据路径path,从文件中读出 *word[] void paraAnalysis(int argc, char * argv[], char opt[][5], int & flag_wc, char & head, char & tail, bool & para_loop, string &filePath); // 根据argc,agrv[], 处理参数,得出输入参数的类型, int gen_chain_word(char* words[], int lens, char* result[], char head, char tail, bool enable_loop); // 处理单词个数最长的单词链 int gen_chain_char(char* words[], int lens, char* result[], char head, char tail, bool enable_loop); // 处理字母个数最多的单词链的长度
计算的核心部分咱们采用的是拓扑排序加动态规划的算法。比暴力搜索比起来下降了计算的复杂性。在拓扑排序阶段,算法的采用的是类DFS的算法。在动态规划阶段,时间复杂度是O(n)。咱们没进入下一个点就会存储到这一点的最长路径。在考虑有环的算法的时候,咱们想的是对于环,能够将环切出来,也就是将环的入口链与出口链分出来,这样的话在环内计算环的最长链,在环外面加上入口最长链与出口最长链便可。不幸的是,咱们并无实现,还不如直接和其它同窗同样使用暴力搜索。花了一些时间实现,可是没有成功。单元测试
契约式设计就是按照某种规定对一些数据等作出约定,若是超出约定,程序将再也不运行,例如要求输入的参数必须知足某种条件。学习
优势:
缺点:太过繁琐,使用起来比较费时费力。
咱们的项目并未严格按照契约式编程,可是对于非预期的状况作了输出提醒处理,而且终结程序。
因为用VS的单元测试出现了一些问题,一直都没法运行测试程序。因此咱们就采用了运行测试的方法,构造好测试样例后,不断重复运行程序,与预期效果比对,从而达到测试效果,下面是部分测试的截图和样例:
命令行模块采用argc, char *argv[]两个参数做为命令行输入的接受单元,其中argc代表输入参数的个数(包括程序名),argv是一个字符型的指针数组,存储具体输入的参数。
为了便于调试,最初采用的是控制台输入,即利用控制台模仿命令行输入。首先设置int 类型的变量argc, 字符指针数组argv[], 经过控制台将这两个数据补齐,从而达到模拟命令行的功能,这样就将命令行和其余模块分离开来。
命令行模块有两个参数做为接口,计算模块有相应的参数来接受命令行输入的参数,从而实现对接。
下课后在空教室内进行结对编程。
结对编程能够很大程度上减小BUG的数量,而且将编程这一过程变得相对轻松,简单,在肯定了详细设计以后,能够很大程度上提升编程的速度和效率,可是,结对编程也确实是须要两人的默契配合,起初的磨合阶段其实效率仍是比较低的,而且对于过于简单的程序编写,不如两人分开的效率高。总的来讲结对编程仍是有其独特的优点的,值得体验和学习。
成员 | 优势 | 缺点 |
---|---|---|
吴光辉 | 认真仔细;总结能力强;果断 | 急躁,强势 |
吴枫 | 脾气好;认真负责;乐观向上;有探索精神;坚持不懈 | 执行力稍欠缺 |
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60(1h) | 60(1h) |
· Estimate | · 估计这个任务须要多少时间 | 60(1h) | 60(1h) |
Development | 开发 | 1500(25h) | 1950 |
· Analysis | · 需求分析 (包括学习新技术) | 120(2h) | 120(2h) |
· Design Spec | · 生成设计文档 | 120(2h) | 60(1h) |
· Design Review | · 设计复审 (和同事审核设计文档) | 60(1h) | 60(1h) |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60(1h) | 30(0.5h) |
· Design | · 具体设计 | 120(2h) | 200 |
· Coding | · 具体编码 | 600(10h) | 1200 |
· Code Review | · 代码复审 | 240(4) | 200 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180(3h) | 80 |
Reporting | 报告 | 240(4h) | 240(4h) |
· Test Report | · 测试报告 | 120(2h) | 120(2h) |
· Size Measurement | · 计算工做量 | 60(1h) | 60(1h) |
· Postmortem & Process Improvement Plan | · 过后总结, 并提出过程改进计划 | 60(1h) | 60(1h) |
合计 | 1800(30h) | 2250 |