【软工】第 二 次做业(结对项目)

前言

1.这个做业属于哪一个课程?

2019春季计算机学院软件工程git

2.这个做业的要求在哪里?

第2次软工做业要求程序员

3.我在这个课程的目标是?

  • 了解并学习软件工程的教学内容,完成课程任务,培养工程化设计和开发软件的能力。
  • 提高在软件开发中计划、管理、测试和维护软件的能力。
  • 理解团队与我的编程之间的异同与优劣,培养团队协做能力。

4.这个做业在哪一个具体方面帮助我实现目标?

了解结对编程与我的编程的异同,进一步训练对程序进行设计和测试的能力github

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 框架和可视化控件实现。oop

界面接口

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;

其余——结对过程

首先放出一张结对照片:

咱们两人平时是以微信做为通信方式,每隔两天会进行线下的见面、技术研讨、设计规划和代码复审。因为咱们本来就相互认识,而且两人都能相互理解与体谅,因此在沟通交流方面进行得至关顺利,不论是在线上仍是线下,一旦发现问题,咱们老是能很快地进行讨论,并各处双方协调的解决方案。最开始的时候咱们对项目进行设计和分工,两人会较为独立地完成本身的任务;但随着项目逐渐变复杂,咱们会更为主动地交流,积极进行共同的代码复审。这是一次愉快且有收获的结对编程经历。

其余——反思与改进

结对编程优劣

结对编程是极限编程的形式之一,根据老师上课所讲述内容,其内涵在于将代码复查实施到极致,这使得代码质量会大幅提高。除此以外,对于程序员来讲,结对编程的方式可以提高他们的信心、动力、知足感和人际关系;对于组织来讲,结对编程有利于知识的传递和人员的流动。

结对编程在不一样的条件下也会显现出一些劣势,如当两人水平差距较大时可能会出现难以合做的问题,当任务量较小同时质量稳定性又较高时,两人协做可能会出现时间和生产力的浪费

我的优劣

彭一夫:优点在于注重细节,对总体要求和结构把控好,合做态度好;劣势在于编程水平较差 吴昊:优点在于能对算法优化进行深刻研究,合做交流态度好;劣势在于对总体构架能力稍弱

相关文章
相关标签/搜索