zoukankan      html  css  js  c++  java
  • 201771030111-刘维 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

    项目 内容
    班级博客 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
    作业链接 https://www.cnblogs.com/nwnu-daizh/p/12521474.html
    学习目标 了解并掌握软件工程的相关知识及其应用
    作业目标 体验软件项目开发中的两人合作,练习结对编程
    结对搭档 李松榆-201771030110
    结对方本次实验博客链接 https://www.cnblogs.com/Unicorn-snow/p/12573679.html
    Github仓库链接 https://github.com/Unicorn-snow/EIS

    任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;

     1.代码风格规范:
      原则:简明、易读、无二义性;

      ①缩进:最好为4个空格;
      ②行宽:可以限定为100个字符;
      ③括号:在复杂运算中要善用括号、巧用括号;
      ④分行:要注意不要将多条语句放置在一行;
      ⑤命名:命名的时候要注意言简意赅,尽量避免不必要的修饰;
      ⑥下划线:下划线用来分隔变量名字中的作用域标注和变量的语义;
      ⑦大小写:区分复合词组中的不同单词;
      ⑧注释:解释程序做什么,为什么这么做;

     2.代码设计规范:
      >代码设计规范不光是程序书泻的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里又有不少内容与具体程序设计语言息息相关(如C、C++. Java、C#)。

     3.代码复审:
      >看代码是否在代码规范的框架内正确地解决了问题。代码复审在于找出代码的错误,不管是代码错误、逻辑错误还是算法错误都要努力发现并尽量解决,发现潜在错误和回归性错误,寻找可能需要改进的对方,开发人员之间相互“教育”,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。

     4.结对编程:
      >结对编程是个渐进的过程,有效率的结对编程不是一天 就能做到的。结对编程是一个相互学习 、相互磨合的渐进过程。开发人员需要时间来适应这种新的开发模式。一开始,结对编程很可能不比单独开发效率更高,但是在度过了学习阶段后,结对编程小组的开发质量、开发时间通常比两个人单独开发会更有明显的改善。

    任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

    • 结对方博客链接
    • 结对方Github项目仓库链接
      (1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
        

    (2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
      

      

    (3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
      
      
      
      
      

    任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统

    1.需求分析:

      2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
      值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
      为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报

      此次作业便是给我们一个理论与实际相结合,充分利用我们所学知识的大好机会,面对疫情,作为大学生的我们将继续利用专业优势,制作疫情上报系统,贡献自己绵薄之力,方便防控机构对疫情相关信息进行采集、统计和排查,并实现可视化效果并将筛选信息通过Excel表的方式导出。

    2.软件设计说明:

     (1)功能设计
      ①可采集全校各类师生员工疫情信息;
      ②要能实现师生以及管理员不同种身份的登录;
      ③学院疫情防控工作负责人可查看本学院人员疫情汇总;
      ④为学院疫情防控工作负责人提供高级查询功能进行多属性组合查询并将查询结果进行可视化统计功能;
      ⑤学校防控办指定负责人登录系统,可浏览所有人员填报汇总数据清单;
      ⑥学校防控办负责人可以利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,并将查询列表导出为【导出】EXCEL文件;
      ⑦实现人机交互的GUI界面;
      ⑧附加分功能:定时填报提醒部分。

     (2)整体设计:
      

     (3)数据库设计:


    3.软件实现及核心功能代码展示:

    //使用poi扩展库,将输入的Jtable对象写入HSSFWork对象中,然后输出
    public class JtableDownload {   
    
        JTable table;   
        FileOutputStream fos;
        JFileChooser jfc = new JFileChooser();   
        public static  boolean flag;
    
        public JtableDownload(JTable table) {
            this.table = table;   
            jfc.setSelectedFile(new File(""));  
            int result= jfc.showSaveDialog(null);
            File file = jfc.getSelectedFile();
            try { 
                if (result == JFileChooser.APPROVE_OPTION) {
                    this.fos = new FileOutputStream(file + ".xls"); 
                    flag=true;
                } else {
                    flag=false;
                    JOptionPane.showMessageDialog(null,"您取消了下载!");
                }
            } catch (FileNotFoundException ex) {
                JOptionPane.showMessageDialog(null, "已存在文件名相同的文件,要替换请先关闭!");
            } 
        }   
    
        public void export() {   
            HSSFWorkbook wb = new HSSFWorkbook();   
            HSSFSheet hs = wb.createSheet();   
            TableModel tm = table.getModel();   
            int row = tm.getRowCount();   
            System.out.println(row);
            int cloumn = tm.getColumnCount(); 
            System.out.println(cloumn);
            String te = table.getColumnName(0);
            System.out.println(te);
            
            //样式设计
            HSSFCellStyle style = wb.createCellStyle();   
            style.setAlignment(HorizontalAlignment.CENTER); // 居中
            HSSFFont font = wb.createFont();   
            font.setFontHeightInPoints((short) 11);   
            style.setFont(font);   
    
            for (int j = 0; j < cloumn; j++) {
                hs.setColumnWidth( j, (1 * 4000));   //设置列宽
            }
              
    
            //写入HSSF对象
            for (int i = 0; i < row + 1; i++) {   
                HSSFRow hr = hs.createRow(i);   
                for (int j = 0; j < cloumn; j++) {   
                    if (i == 0) {   
                        String value = table.getColumnName(j);  
                        System.out.println(value); 
                        HSSFCell hc = hr.createCell(j);   
                        hc.setCellStyle(style);   
                        hc.setCellValue(value);   
                    } 
                    else {   
                        if (tm.getValueAt(i - 1, j) != null) {   
                            String value = tm.getValueAt(i - 1, j).toString();   
                            HSSFRichTextString srts = new HSSFRichTextString(value);   
                            HSSFCell hc = hr.createCell((short) j);   
                            hc.setCellStyle(style);   
                            if (value.equals("") || value == null) {   
                                hc.setCellValue(new HSSFRichTextString(""));   
                            } else {   
                                hc.setCellValue(srts);   
                            }   
                        }   
                    }   
                }   
            }   
           
            try {   
                wb.write(fos);   
                fos.close();  
                JOptionPane.showMessageDialog(null,"下载完成");
            } catch (IOException ex) {  
    
            }   
        }   
    } 
    
    

    4.程序运行:
     (1)登录部分:
      

     (2)疫情上报部分:
      

     (3)二级部门负责人查询部分:
      登录后只能查看文学院信息,显然该账号为文学院负责人
      

      ①可视化情况:
       

      ②高级查询
       

     (4)学校负责人查询部分:
      登录后可以查看全部信息,显然该账号属于学校负责人
      
      登录后可以查看全部信息,显然该账号属于学校负责人
      ①高级查询结果:
       页面与(3)中无二,故不再赘述
      ②可视化情况:
      学校负责人可查看各学院统计情况,这是切换到计算机学院的填报情况统计
       
      ③Excel导出情况:
       点击"导出"按钮弹出保存对话框
       
       成功后弹出对话框
       
       找到该文件并打开,发现数据成功导入
       
       

    5.结对过程:

    ①参考代码规范讨论完成结对实验的代码规范。
    ②下载并阅读对方的代码,在征得对方同意的前提下利用Github仓库操作对对方源码进行合作修改。
    ③讨论并填写PSP计划时间。
    ④逐条分析实验任务要求,共同进行本次项目的需求分析和总体设计。
    ⑤由李松谕负责框架的搭建、和GUI界面部分,我主导Excel的导出功能和附加功能的实现,在主导位置的互换过程中,另一人则进行对代码规范的监督和提醒,提供功能实现上的不同想法,然后选择更好的实现方法,在出现Bug时,一起对代码进行阅读,找出逻辑错误,比独自编码效率更高。
    ⑥整个项目完成后,两人共同根据代码规范进行复审,对多余的语句进行简化。
    ⑦填写PSP实际所用时间。
    ⑧撰写报告文档,总结经验。
      

      

      打字聊天交流不便,我们选择用电话交流,用Github共享代码。所以附上了上面两张截图

    6.PSP展示:

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

      
    7.小结:在本次结对编程实践过程中,我深刻体会到了结对编程的好处。虽然在线上学习,结对过程有诸多不便,但是我们也因此掌握了各种Github等各种工具平台的应用。另一方面,与个人软件开发相比,结对搭档的存在促使我更能尽早地开展软件开发工作,并且在开发过程中一直督促我按时完成代码的进度。尽管结对初期进展很慢,但是在软件的开发过程中我们互相学习、互相督促,让我在软件开发上面投入了更多的时间和精力,也学到了更多的知识,所以本次结对编程最终的结果一定是好于我一个人学习的效果。当然,最应该感谢的是我靠谱的队友。

  • 相关阅读:
    pytest扫盲21--pytest-assume多重效验插件
    pytest扫盲20--HTML报告
    pytest扫盲19--pytest重运行机制
    pytest扫盲18--配置文件pytest.ini
    pytest扫盲17--自定义命令行参数
    pytest扫盲16--某个用例失败后,关联的用例标记为xfail
    pytest扫盲15--skip跳过用例
    pytest扫盲14--pytest.raises()函数文档及在参数化中处理异常
    pytest扫盲13--遇到异常的两种处理方式及断言异常
    【CF】CF1430_G Yet Another DAG Problem_最小割/网络流/状压dp
  • 原文地址:https://www.cnblogs.com/Summer-Sy/p/12556274.html
Copyright © 2011-2022 走看看