zoukankan      html  css  js  c++  java
  • 【软工】第 二 次作业(结对项目)

    前言

    1.这个作业属于哪个课程?

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

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

    第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;
    

    其他——结对过程

    首先放出一张结对照片:

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

    其他——反思与改进

    结对编程优劣

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

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

    个人优劣

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

  • 相关阅读:
    验证码破解 | Selenium模拟登陆12306
    验证码破解 | Selenium模拟登录知乎
    Numpy | 16 算术函数
    Numpy | 15 数学函数
    Numpy | 14 字符串函数
    Numpy | 13 位运算
    Numpy | 12 数组操作
    Numpy | 11 迭代数组
    Numpy | 10 广播(Broadcast)
    Numpy | 09 高级索引
  • 原文地址:https://www.cnblogs.com/LifeIsAGame/p/10504406.html
Copyright © 2011-2022 走看看