【软工】第 二 次作业(结对项目)
前言
1.这个作业属于哪个课程?
2.这个作业的要求在哪里?
3.我在这个课程的目标是?
- 了解并学习软件工程的教学内容,完成课程任务,培养工程化设计和开发软件的能力。
- 提升在软件开发中计划、管理、测试和维护软件的能力。
- 理解团队与个人编程之间的异同与优劣,培养团队协作能力。
4.这个作业在哪个具体方面帮助我实现目标?
了解结对编程与个人编程的异同,进一步训练对程序进行设计和测试的能力
5.项目Github地址
正文
PSP进度管理表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning 计划 | 30 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 20
Development | 开发 | 1300 | 1150
· Analysis | · 需求分析 (包括学习新技术) | 120 | 140
· Design Spec | · 生成设计文档 | 30 | 40
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 5
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 5
· Design | · 具体设计 | 60 | 120
· Coding | · 具体编码 | 720 | 480
· Code Review | · 代码复审 | 180 | 60
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 300
Reporting | 报告 | 150 | 60
· Test Report | · 测试报告 | 60 | 30
· Size Measurement | · 计算工作量 | 30 | 10
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 20
| 合计 | | 1500(25h) | 1230(20.5h)
接口设计方法
Information Hiding,信息隐藏。通俗一些来解释,这即是封装和不同层次的抽象,从顶级的模块内容进行概念抽象,一直到底层类中成员的访问性控制进行物理逻辑上的信息隐藏。在本次作业中最重要,最不同于以往训练内容的抽象在于软件程序的模块化,我们希望尽量保持模块之间的独立,减低模块之间的耦合度,使各个模块达到一种Loose Coupling的状态。从模块这一层次的高度来说,我们严格按照博客中规定的规范进行了接口设计,遵循了一些接口设计的原则,进行了测试,并且保持不同模块仅通过我们定义的这些模块进行信息交流。但较为遗憾的是随着系统复杂性的增高,我们在模块内部耦合性并未保持在一个较低的水平上。
计算模块——设计、实现与独特性
public int gen_chain_char(string[] words, int len, string[] result, char head, char tail, bool enable_loop)
public int gen_chain_word(string[] words, int len, string[] result, char head, char tail, bool enable_loop)
软件总体——UML关系图
计算模块——性能展示
我们大约在性能改进上花费了4小时进行学习和代码修正。对于有环的情况我们采用DFS的方法进行遍历搜寻,对于无环的情况我们采用拓扑排序+动态规划的方法减少搜寻次数,从而提高性能。
契约设计编程(Design by Contract)思想实现
契约编程的核心即是与软件相关的不同角色需要有不同的约束。在这一点上,我们会对输入进行仔细地判断,对于不正确的内容我们会报出异常。在输出方面我们始终保持输出形式的一致性。
计算模块——单元测试
测试覆盖率截图:
计算模块——异常处理
本程序中所需要处理的一场主要包括:
· 文件操作异常
· 输入指令不规范异常
界面模块——样式、设计与接口
界面样式
界面设计
功能:
· 读入指定路径文件中的内容(单行)
· 输入自定义的内容(多行)
· 提供计算方式的选择:-w \ -c
· 提供是否指定首尾字符的多项选择(当输入框中不只包含一个字符时,取第一位字符)
· 提供是否允许包含隐含环的选项
· 单击生成后即时于输出框显示结果
· 可通过图形化界面选择导出文件位置
该界面通过 Windows Form 框架和可视化控件实现。
界面接口
GUI对外提供创建GUI界面的接口:
public static void showGUI()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
GUI g = new GUI();
Application.Run(g);
}
GUI通过调用计算模块的get_chainByLine函数获取处理之后的单词链,并予以显示:
coreBuild core = new coreBuild();
WordChain wc = core.get_chainByLine(textInput, char_h, char_t, b_r, c_wc);
foreach(Word word in wc.GetWordChain())
{
textOutput += word.Get_allWord();
}
//输出指结果框
textBox5.Text = textOutput;
其他——结对过程
首先放出一张结对照片:
我们两人平时是以微信作为通讯方式,每隔两天会进行线下的见面、技术研讨、设计规划和代码复审。由于我们原本就相互认识,并且两人都能相互理解与体谅,所以在沟通交流方面进行得相当顺利,不管是在线上还是线下,一旦发现问题,我们总是能很快地进行讨论,并各处双方协调的解决方案。最开始的时候我们对项目进行设计和分工,两人会较为独立地完成自己的任务;但随着项目逐渐变复杂,我们会更为主动地交流,积极进行共同的代码复审。这是一次愉快且有收获的结对编程经历。
其他——反思与改进
结对编程优劣
结对编程是极限编程的形式之一,根据老师上课所讲述内容,其内涵在于将代码复查实施到极致,这使得代码质量会大幅提升。除此之外,对于程序员来说,结对编程的方式能够提升他们的信心、动力、满足感和人际关系;对于组织来说,结对编程有利于知识的传递和人员的流动。
结对编程在不同的条件下也会显现出一些劣势,如当两人水平差距较大时可能会出现难以合作的问题,当任务量较小同时质量稳定性又较高时,两人协作可能会出现时间和生产力的浪费
个人优劣
彭一夫:优势在于注重细节,对整体要求和结构把控好,合作态度好;劣势在于编程水平较差
吴昊:优势在于能对算法优化进行深入研究,合作交流态度好;劣势在于对整体构架能力稍弱