201771030124-温腾虎 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
作业要求 https://www.cnblogs.com/nwnu-daizh/p/12521474.html
学习目标 1.学习和掌握结对软件项目开发的相关知识。
这个作业在哪些方面帮助我实现学习目标 学习和巩固软件开发相关知识
结对方学号-姓名 201771030107-廖堃焱
结对方本次作业博客链接 https://www.cnblogs.com/thencci/p/12542405.html
项目Github的仓库链接地址 https://github.com/thencci/gu

任务一

代码风格规范

包括:缩进、 行宽、括号(用括号清楚地表示逻辑优先级)、 断行与空白的{}行、分行、命名精简,会意、下划线、大小写 、注释等。
代码风格的原则是:简明,易读,无二义性。

代码设计规范

代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,要遵守下面的规定:
1.函数 现代程序设计语言中的绝大部分功能,都在程序的函数中实现。
2.goto 函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用。
3.错误处理 当程序的主要功能实现后,给代码加一些错误处理。
4.参数处理 在Debug版本中,所有的参数都要验证其正确性。在正式版本中,对从外部(用户或别的模块)传递过来的参数,要验证其正确性。
5.断言 当你觉得某事肯定如何时,就可以用断言。

代码复审
  1. 找出代码的错误
  2. 发现逻辑错误
  3. 发现算法错误
  4. 发现潜在的错误和回归性错误
  5. 发现可能需要改进的地方
  6. 开发人员,传授经验,在交流中不断提升能力。
结对编程

通过我本次结对实验的经验,我有如下体会,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。能带来更多的信心,高质量的产出能带来更高的满足感。结对能更有效地交流,相互学习和传递经验,分享知识,能更好地应对人员流动。
总之,结对编程是一个相互学习、相互磨合的渐进过程。

任务二

1.结对方博客链接:https://www.cnblogs.com/thencci/p/12516015.html

2.结对方Github项目仓库链接:https://www.cnblogs.com/thencci/p/12516015.html

3.符合要求的博客评论:

4.结对方项目仓库中的日志数据:

1.概要部分
1)代码符合需求和规格说明么? .
答:符合需求和规格说明。
2)代码设计是否考虑周全?
答:较周全。
3)代码可读性如何?
答:可读性较好。
4)代码容易维护么?
答:容易维护
5)代码的每一行都执行并检查过了吗?
答:是
2.设计规范部分
1)设计是否遵从已知的设计模式或项目中常用的模式?
答:是的
2)有没有硬编码或字符串/数字等存在?
答:无
3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64) ?
答:不依赖某一平台,不影响移植。
4)开发者新写的代码能否用已有的Library/SDK/Framework 中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
答:可以实现,存在。
5)有没有无用的代码可以清除?
答:有一小部分。
3. 代码规范部分
修改的部分符合代码标准和风格么?
答:基本符合
4. 具体代码部分
1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:有错误处理,处理了异常。
2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单1双字节)的长度,是以0开始计数还是以1开始计数?
答:无错误,字节长度,从0开始计数。
3)循环有没有可能出现死循环?
答:没有死循环
4)有没有使用断言( Assert)来保证我们认为不变的条件真的得到满足?
答:没有使用
5)有无可能存在资源泄漏(内存、文件、各种GUI资源、数据库访问的连接,等等) ?有没有优化的空间?
答:不会泄漏资源,有优化的空间
6)数据结构中有没有用不到的元素?
答:没有
5.效能
1)代码的效能如何?最坏的情况是怎样的?
答:代码效能较好。情况取决于数据大小。
2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中string的操作是否能用StringBuilder来优化) ?
答:有可优化部分
3)对于系统和网络的调用是否会超时?如何处理?
答:不会超时
6.可读性
代码可读性如何?有没有足够的注释?
答:可读性较好,有注释。
7.可测试性
代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。
答:不需要

任务三

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

(1)可采集全校各类师生员工疫情信息;

(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;

(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;

(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);

登陆界面

导航栏

总管理员

学院表

学院老师表

导出学生

柱状图

扇形图

(5).关键代码

    private Chooser(java.util.Date date, String format, int startDAY){
        if(startDAY > -1 && startDAY < 7) defaultStartDAY = startDAY;
        int dayIndex = defaultStartDAY;
        for(int i=0; i<7; i++){
            if(dayIndex > 6) dayIndex = 0;
            weekLabels[i] = new WeekLabel(dayIndex, showTEXT[dayIndex]);
            dayIndex ++ ;
        }
        sdf = new java.text.SimpleDateFormat(format);
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        initCalendarPanel();
    }
    
    public static Chooser getInstance(java.util.Date date, String format){
        return new Chooser(date, format, defaultStartDAY);
    }

    public static Chooser getInstance(java.util.Date date){
        return getInstance(date, DEFAULTFORMAT);
    }
    public static Chooser getInstance(String format){
        return getInstance(new java.util.Date(), format);
    }
    public static Chooser getInstance(){
        return getInstance(new java.util.Date(), DEFAULTFORMAT);
    }
    
    private void initCalendarPanel(){
        calendarPanel = new JPanel(new java.awt.BorderLayout());
        calendarPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0xAA, 0xAA, 0xAA)));
        calendarPanel.add(titlePanel = new TitlePanel(), java.awt.BorderLayout.NORTH);
        calendarPanel.add(bodyPanel = new BodyPanel(), java.awt.BorderLayout.CENTER);
        calendarPanel.add(footerPanel = new FooterPanel(),java.awt.BorderLayout.SOUTH);
        this.addAncestorListener(new AncestorListener() {
            public void ancestorAdded(AncestorEvent event) { }
            public void ancestorRemoved(AncestorEvent event) {hidePanel();}
            //hide pop when move component.  
            public void ancestorMoved(AncestorEvent event) {
                hidePanel();
            }
        });
    }
    public void register(final JComponent showComponent) {
        this.showDate = showComponent;
        showComponent.setRequestFocusEnabled(true);
        showComponent.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent me) {
                showComponent.requestFocusInWindow();
            }
        });
        this.add(showComponent, BorderLayout.CENTER);
        this.setPreferredSize(new Dimension(90, 25));
        this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        showComponent.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent me) {
                if (showComponent.isEnabled()) {
                    showComponent.setCursor(new Cursor(Cursor.HAND_CURSOR));
                }
            }
            public void mouseExited(MouseEvent me) {
                if (showComponent.isEnabled()) {
                    showComponent.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    showComponent.setForeground(Color.BLACK);
                }
            }
            public void mousePressed(MouseEvent me) {
                if (showComponent.isEnabled()) {
                    showComponent.setForeground(hoverColor);
                    if (isShow) {
                        hidePanel();
                    } else {
                        showPanel(showComponent);
                    }
                }
            }
            public void mouseReleased(MouseEvent me) {
                if (showComponent.isEnabled()) {
                    showComponent.setForeground(Color.BLACK);
                }
            }
        });
        showComponent.addFocusListener(new FocusListener() {
            public void focusLost(FocusEvent e) {
                hidePanel();
            }
            public void focusGained(FocusEvent e) { }
        });
    }

(6)结对小讨论

任务四

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

总结

在本次结对编程的过程中,我了解了合作是十分重要的,通过相互的讨论和监督使得代码更规范,功能更完善,逻辑较为严谨,特别是在单元测试和代码复审时,能更快的发现代码的错误,结对编程的效率比较高,在代码规范方面,意识到随意编写的危害,读代码改代码都很费劲,在按编写规范写程序后,逐渐改善了这种情况,但在结对编程中也遇到了问题,比如刚开始分工上打算一人主导一人辅助,但发现主导的人思维有时会混乱,所以就交换充当主导者的角色。本次项目做出改进在编程的过程中经常会出现事与愿违的事情,这样使得讨论陷入僵局,这时我们相互讨论取长补短解决问题

原文地址:https://www.cnblogs.com/Vereda-Tropical/p/12589035.html