zoukankan      html  css  js  c++  java
  • 软件工程结对项目

    软件工程结对项目

    项目 内容
    作业所属课程 软件工程-罗杰
    作业要求 结对项目
    项目地址 最长单词链

    作业正文

    一、给出Github项目地址

    项目地址

    二、在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间

    PSP2.1 Person Software Process Stages 预计耗时(min) 实际耗时(min)
    Planning 计划 1900
    · Estimate · 估计这个任务需要多少时间 1900
    Development 开发 1600
    · Analysis · 需求分析 (包括学习新技术) 300
    · Design Spec · 生成设计文档 100
    · Design Review · 设计复审 (和同事审核设计文档) 30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30
    · Design · 具体设计 180
    · Coding · 具体编码 600
    · Code Review · 代码复审 180
    · Test · 测试(自我测试,修改代码,提交修改) 180
    Reporting 报告 300
    · Test Report · 测试报告 180
    · Size Measurement · 计算工作量 60
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60
    合计 1900

    三、看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的

    Information Hiding(信息隐藏)即限制其他模块对本模块内包含信息的访问,使得该模块的内部结构和信息,对于外部是不可见的,从而实现信息隐藏。
    Interface Design(接口设计)接口是使不同模块之间相连接的部分,各模块之间通过接口实现交流和访问。
    Loose Coupling(松耦合)模块间的耦合度是指模块之间的依赖关系,松耦合可以实现依赖最小化,使模块更灵活。

    四、计算模块接口的设计与实现过程

    计算模块一个Core类,提供四个接口方法
    1.int static gen_chain_word(char* words[], int len, char* result[], char head, char tail,2. bool enable_loop);
    2.int static gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop);
    3.bool static has_circle(char *words[], int len);
    4.int static readfile(char *path, char *words[]);
    第一和第二个接口寻找符合要求的最长路径,第三个接口判断字符串数组是否有环,有环返回true,无环返回false,第四个接口读取文件并返回字符串数组。
    以上四个接口调用了3个私有函数:
    1.int LONG(WORD *wod, int len, char *result[], int H, int T, char _h, char _t, int mark);
    2.int nocircle(WORD words[], int len);
    3.int in_array(char *arr, int len, char cc);
    typedef struct struct1 {
        char h;
        char t;
        char *word;
    }Word, *WORD;
    LONG函数第一个参数是字符串数组转化为自定义结构体数组,第二个参数是结构体数组大小,H为1,代表有-h参数,为0,代表无-h参数,T参数同理;_h代表首字母,_t代表尾字母,且仅仅当其为'a'-'z'时才起作用,否则报错,mark为0标记求最长单词数,为1标记求最多字符数。
    nocircle传入字符数组,及长度,若有环返回0,否则返回1
    in_array寻找字符cc在字符数组arr中的下表,若找到,返回下标,否则返回-1。

    五、画出UML图显示计算模块部分各个实体之间的关系

    六、计算模块接口部分的性能改进

    八、计算模块部分单元测试展示。 展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路

    单元测试部分代码如下:

    		int len1 = 10, len2 = 11;
    		char *list1[10] = {"app","pdfcde","hefarry","yakorm","morning","ed","dail","left","pd","dot" };
    		char *list2[11] = { "app","pdfcde","pd","die","early","ear","yet","tail","rabbittall","tab","leaf" };
    		TEST_METHOD(TestMethod1)
    		{
    			// TODO: 在此输入测试代码
    			int ans_len = 5;
    			char *ans[5] = { "app","pdfcde","ed","dail","left" };
    			char *result[5];
    			int len = 0;
    			len = Core::gen_chain_word(list1, len1, result, '', '', false);
    			Assert::AreEqual(len, ans_len);
    			Assert::AreEqual(strcmp(longchar(result, len), longchar(ans, ans_len)), 0);
    			Assert::IsFalse(Core::has_circle(list1,len1));
    
    		}
    		TEST_METHOD(TestMethod6) {
    			int ans_len = 3;
    
    			char *ans[3] = { "hefarry","yakorm","morning" };
    
    			char *result[3];
    
    			int len = 0;
    
    			len = Core::gen_chain_char(list1, len1, result, '', '', false);
    			Assert::AreEqual(len, ans_len);
    
    			Assert::AreEqual(strcmp(longchar(result, len), longchar(ans, ans_len)), 0);
    			Assert::IsFalse(Core::has_circle(list1, len1));
    		}
    

    测试的思路是在测试模块中list里保存所有的单词,用result存输出的结果,调用core计算模块中gen_chain_word和gen_chain_char接口,将返回值存入len中,最后把返回到result中的结果和预期的ans进行比对。针对每一个接口,通过-h、-t、-r参数的组合来编造相应的测试用例。

    九、计算模块部分异常处理说明。 在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景

    我们分析到的异常有单词的格式错误,比如单词内出现非法字符;当没有-r参数时,单词表内存在单词环;参数赋值出现异常,比如h和t参数的赋值传入非英文字符;单词表内所有单词无法构成单词链以及单词表为空时的异常处理。

    cout << "Error: ";
    	switch (n) {
    	case 1: cout << "wrong format after -h!";                   break;
    	case 2: cout << "wrong format after -t!";                   break;
    	case 3: cout << "wrong format in argvs!";                   break;
    	case 4: cout << "file doesn't exsits!";                     break;
    	case 5: cout << "error when read file!";                    break;
    	case 6: cout << "There exists circle(s),check words again!"; break;
    	case 7: cout << "error when write data!";                   break;
    	case 8: cout << "number of words larger than 10000!";       break;
    	case 9: cout << "number of words larger than 100!";         break;
    	default:break;
    	}
    	exit(0);
    1 wrong format after -h!
    2 wrong format after -t!
    3 wrong format in argvs!
    4 file doesn't exsits!
    5 error when read file!
    6 There exists circle(s),check words again!
    7 error when write data!
    8 number of words larger than 10000!
    9 number of words larger than 100!
    

    十、命令行模块的详细设计过程。

    根据命令行地址参数,读取文件信息,转化为字符串数组。根据字符串数组构造出自定一的结构体数组。首先判断字符串nocicle()函数判断是否能成环,若能成环且命令行不含-r参数,则报错,否则,进入LONG()函数寻找符合要求的最长单词链。
    nocicle函数的具体实现思想:先将首尾字母相同的字符串剔除,对剩下的字符串数组进行判断,记录下26个字母作为剩下字符串数组的首尾字母出现的次数(并去除从未在首尾部出现过的字母),若某一字母在剩下的字符串的首部出现次数为0或者尾部出现次数为0,则将该字母来源的字符串从字符串数组中剔除,将该字母从字母数组中剔除,重复操作,知道字符串数组无变化;根据这个方法,可以想象每次剔除链端字符串及其离环或者链中心最远一端的字母,知道最后无链端存在,若存在环,则最后字符串数组大小大于0,否则为0。
    LONG函数具体实现思想:2626n的数组存字符串(n表示有多少个字符串对应首字母相同,尾字母相同),[x][y][z]为下标,x为首部字母减去'a',y为尾字母减去‘a’,z根据字符串长度由大到小排序,从横纵坐标最大的[x][y]开始访问,每次访问[x][y][top],top从小到大,访问一次[x][y],top就+1,left[x][y]-1,否则top-1,left[x][y]-1,其中left[..][..]记录对应下标还能访问的剩下字符串个数,保证每次访问剩下的首尾字母相同的字符串时访问长度最长的那个;然后访问[y][..]那一行,从右往左,访问left[..][..]大于0的top位字符串,依次下去知道left[y][..]都为0,一个长链结束。接着回退到父节点的[x][<y],访问最近的left[x][<y]大于0的top位字符串,若left[x][<y]都等于0,则再次回退到祖父节点的left[<.][<.],依次下去访问,直到left[.][<.]不为0,继续访问其后继节点,形成新的长链。

    十二、描述结对的过程,提供非摆拍的两人在讨论的结对照片

    在结对编程前,我们先一起阅读分析题目要求,预估了作业的难度,然后对实现所用的算法进行探讨。在编程过程中,一个驾驶员,一个领航员,他负责代码的编写和实现,我主要负责编写测试数据,帮助测试和纠正。当遇到瓶颈时,一起线上或线下交流讨论。
    两人讨论照片如下:

    十三、看教科书和其它参考书,网站中关于结对编程的章节,说明结对编程的优点和缺点。结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)

    结对编程的优点:两人结对,互相督促,减少懈怠;在遇到问题时,相互交流,一起讨论,有利于找到更好的解决方法,发掘更好的思路;结对编程可以保证代码质量更高。
    结对编程的缺点:要求两人有共同的时间和空间坐下来一起工作;当想法或思路不同时,容易产生分歧,不利于效率的提升。
    本人的优缺点:交流相对主动,比较细心谨慎,态度诚恳;编程能力弱
    队友的优缺点:动手编程能力强,算法掌握得熟练,做事效率高;更喜欢独立作业,交流不够主动。

    十四、在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间

    PSP2.1 Person Software Process Stages 预计耗时(min) 实际耗时(min)
    Planning 计划 1900 2070
    · Estimate · 估计这个任务需要多少时间 1900 2070
    Development 开发 1600 1920
    · Analysis · 需求分析 (包括学习新技术) 300 420
    · Design Spec · 生成设计文档 100 100
    · Design Review · 设计复审 (和同事审核设计文档) 30 30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
    · Design · 具体设计 180 200
    · Coding · 具体编码 600 720
    · Code Review · 代码复审 180 180
    · Test · 测试(自我测试,修改代码,提交修改) 180 240
    Reporting 报告 300 150
    · Test Report · 测试报告 180 60
    · Size Measurement · 计算工作量 60 60
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 30
    合计 1900 2070
  • 相关阅读:
    Mesos 配置项解析
    1039. Course List for Student (25)
    Cts框架解析(12)-ITargetPreparer
    通过ulimit改善linux系统性能(摘自IBM)
    HDU 1080 DP
    C语言调用Lua函数
    创建MySQL从库
    C# Func&lt;&gt;托付
    SpringMVC入门
    VNC连接Ubuntu 16.04桌面灰色的问题解决
  • 原文地址:https://www.cnblogs.com/yufengfly/p/10533499.html
Copyright © 2011-2022 走看看