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

    项目 内容
    课程 软件工程(罗杰)
    作业要求 结对项目-单词最长链
    本次作业的目的 体验结对编程
    本次作业对我的锻炼 熟悉结对编程,了解结对编程的优点和缺点
    项目github地址 项目地址

    1.Github项目地址

    项目地址

    2.预估耗时PSP

    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)

    3.接口设计方法

    • Information Hiding(信息隐藏)

      信息隐藏是指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。这个体现在类的私有属性和函数上。

    • Interface Design(接口设计)

      接口设计是对程序的进一步封装,主要依赖的原则有:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、开闭原则等。本次项目中的程序并未用到类的继承,除了里氏替换原则之外,其他的几个接口原则基本都满足了。

    • Loose Coupling(松散耦合)

      模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。本项目分为两个模块,输入模块和计算模块,基本实现了高内聚低耦合的要求。

    4.计算模块接口的设计与实现过程

    ​ 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);
    // 处理字母个数最多的单词链的长度
    
    • 我们接口主要体现在gen_chain_char 函数与 Every_Path 函数,gen_chain_char 函数将输入处理完毕,然后传入参数,表示计算的步骤需要进行哪些计算。这里主要体现的接口参数是 word(表示单词链)head(单词链的头)tail(单词链的尾)chose(从 gen_chain 到 Every_Path的选择参数)。这是最主要的接口设计与实现过程。
    • 在计算模块的内部,我们也使用了接口。在函数Every_Path 与 函数longestPath 之间,我们为了实现函数功能的单调性。所以我进一步在 Every_Path 中,将函数的功能细分。在 Every_Path 中主要是将函数细分,而longest_Path 只实现了从某一个起点开始找出最长链。这个设计使模块内的函数功能更加单一,也提高了函数的复用性。

    5.计算模块UML建模

    UML

    6.计算模块接口部分的性能改进

    计算的核心部分我们采用的是拓扑排序动态规划的算法。比暴力搜索比起来降低了计算的复杂性。在拓扑排序阶段,算法的采用的是类DFS的算法。在动态规划阶段,时间复杂度是O(n)。我们没进入下一个点就会存储到这一点的最长路径。在考虑有环的算法的时候,我们想的是对于环,可以将环切出来,也就是将环的入口链与出口链分出来,这样的话在环内计算环的最长链,在环外面加上入口最长链与出口最长链即可。不幸的是,我们并没有实现,还不如直接和其它同学一样使用暴力搜索。花了一些时间实现,但是没有成功。

    性能分析报告

    消耗最大函数

    7.Design by Contract, Code Contract

    契约式设计就是按照某种规定对一些数据等做出约定,如果超出约定,程序将不再运行,例如要求输入的参数必须满足某种条件。

    优点:

    • 充当外部和内部API的检查文档 。
    • 是一种稳固的保障,不仅意味着在满足前置条件时,代码将以特定的方式运行,还意味着在不满足的时候,就不会执行。
    • 增加程序的健壮性、鲁棒性。

    缺点:太过繁琐,使用起来比较费时费力。

    我们的项目并未严格按照契约式编程,但是对于非预期的情况做了输出提醒处理,并且终结程序。

    8.计算模块部分单元测试展示

    由于用VS的单元测试出现了一些问题,一直都无法运行测试程序。所以我们就采用了运行测试的方法,构造好测试样例后,不断重复运行程序,与预期效果比对,从而达到测试效果,下面是部分测试的截图和样例:

    • 例子一:例子1
    • 例子二: 例子二

    9.计算模块部分异常处理说明

    • 命令行参数中没有-r, 但是文本本身构成环,会报告相关异常错误,并结束程序。
    • 文本文件为空,传进去的单词数组为空,会报告异常错误,并结束程序。

    10.命令行模块设计过程

    • 命令行模块采用argc, char *argv[]两个参数作为命令行输入的接受单元,其中argc表明输入参数的个数(包括程序名),argv是一个字符型的指针数组,存储具体输入的参数。

    • 为了便于调试,最初采用的是控制台输入,即利用控制台模仿命令行输入。首先设置int 类型的变量argc, 字符指针数组argv[], 通过控制台将这两个数据补齐,从而达到模拟命令行的功能,这样就将命令行和其他模块分离开来。

    11.命令行模块与计算模块的对接

    命令行模块有两个参数作为接口,计算模块有相应的参数来接受命令行输入的参数,从而实现对接。

    12.结对编程过程

    下课后在空教室内进行结对编程。

    结对编程

    13.结对总结

    ​ 结对编程可以很大程度上减少BUG的数量,并且将编程这一过程变得相对轻松,简单,在确定了详细设计之后,可以很大程度上提高编程的速度和效率,但是,结对编程也确实是需要两人的默契配合,起初的磨合阶段其实效率还是比较低的,并且对于过于简单的程序编写,不如两人分开的效率高。总的来说结对编程还是有其独特的优势的,值得体验和学习。

    成员 优点 缺点
    吴光辉 认真仔细;总结能力强;果断 急躁,强势
    吴枫 脾气好;认真负责;乐观向上;有探索精神;坚持不懈 执行力稍欠缺

    14.PSP表格

    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
  • 相关阅读:
    Visual Studio调试器指南---Disassembly窗口
    Visual Studio调试器指南---Register窗口
    Visual Studio调试器指南---Threads窗口
    关于System.Convert.ToInt16(float value)抛异常System.OverflowException---值对于 Int32 太大或太小的原因的探究
    关于System.OverflowException异常
    Visual Studio调试器指南---Memory 1-4窗口
    关于异常System.NullReferenceException
    关于C++标准异常之std::out_of_range
    VC调试器高级应用----高级断点篇
    Visual Studio调试器指南---CallStack窗口
  • 原文地址:https://www.cnblogs.com/notstandalone/p/10534162.html
Copyright © 2011-2022 走看看