• [WIP] 软件工程实践个人编程作业(第一次)


    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
    这个作业的目标 实现一个 Github 用户行为数据统计器;初步掌握文档编写、单元测试与性能优化技术
    学号 031802422

    TODO

    • Github 与 VS 配置
    • 代码规范制定 codestyle.md
    • PSP 表格
    • 需求分析
    • 模块设计
    • 学习:单元测试
    • 学习:性能分析

    PSP

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 120
    Estimate 估计这个任务需要多少时间 60 120
    Development 开发
    Analysis 需求分析 (包括学习新技术) 480 360
    Design Spec 生成设计文档 120 150
    Design Review 设计复审 30 30
    Coding Standard 代码规范 (为目前的开发制定合适的规范)
    Design 具体设计 120 150
    Coding 具体编码
    Code Review 代码复审
    Test 测试(自我测试,修改代码,提交修改)
    Reporting 报告
    Test Report 测试报告
    Size Measurement 计算工作量
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划
    合计

    需求分析

    • 命令行参数解析
    • json 解析
    • 大数据检索
      • 有限的内存
      • 统计特定记录的数量
    • 目录读取

    功能设计

    • 参数解析
    • json 解析
    • 性能优化
      • 预处理
        • 仅提取 type, actor.login, repo.name
        • 逐行读取
        • 直接进行统计,结果存盘c
          • unordered_map 实现 hashmap
          • 仅 user 或仅 repo : hashmap 映射到次数记录之
          • user & repo : 二者合并后 hashmap 之
          • 存盘
            • 问题:Cpp 下序列化实现不便
            • 方案:手工遍历,转 JSON 后写文件
    • 查询
      • 直接全文件 parse 后在 CJsonObject 上查询
    • 目录读取
      • Windows 下采用 io.h
      • Linux 下采用 dirent.h

    模块设计

    • GHAnalysis.cpp
      • main(argc, argv)
        • 初始化
          • 参数解析器
          • 有效事件表
        • 根据参数选择功能
          • 存在 --init :取路径调用 analyze()
          • 否则:
            • 取出各字段初始化 fieldListevent
            • 调用 lookup()
            • 打印结果
      • analyze(path)
        • 实现预处理
        • 流程
          • 建文件表,Mapper 表
          • 遍历文件表
            • 按行读取
            • 解析为 CJsonObject 对象
            • EventCount::isValid(getEvent()) ?
              • 遍历 Mapper 表,逐个更新
          • 遍历 Mapper 表,逐个 toJSON() 存入 <getFields().getName()>.json
      • lookup(fields)
        • 打开并解析 <fields.getName()>.json
        • 返回以 fields.value() 为 key 的 CJsonObject 对象
    • FileIO.cpp
      • FileList
        • openAll(dirPath, endWith)
        • size()
        • begin()
        • end()
        • closeAll()
    • Mapper.cpp
      • Mapper
        • fields {get; set;}
        • toJSON(&cJsonObj)
        • unordered_map<string, EventCount> hashmap
        • update(&cJsonObj)
          • 获取各字段值
          • 根据字段值查找 EventCount 并更新
    • Field.cpp
      • Field
        • value {get; set;}
        • virtual getName()
        • virtual setValueFromJSON(&cJsonObj)
        • virtual addToCmdParser(parser)
      • FieldUser : Field
      • FieldRepo : Field
      • FieldList
        • add(*Field)
        • getName()
          • 返回所有 Field.getName() 的拼接,用 "-" 分隔
        • value()
          • 返回所有 Field.getValue() 的拼接,用 "-" 分隔
        • setValueFromJSON(&cJsonObj)
    • Event.cpp
      • getEvent(&cJsonObj)
      • EventCount
        • static validEvents[]
        • static addEvent(str)
        • static isValid(str)
        • update(&cJsonObj)
        • toJSON(&cJsonObj)
  • 相关阅读:
    【Vue】 computed和watch的区别
    【总结】html5新增标签以及css3新增属性
    【前端经典面试题】前后端分离(说一说你理解的前后端分离?)
    【前端面试CSS】—垂直水平居中终极版
    【CSS】清浮动的常用四种方法
    【前端面试CSS】——盒子模型(标准模型和怪异模型)
    【JavaScript】JS常用的方法总结(不定期更新中)
    【Cordova】开发app遇到的坑之 按两次返回键退出程序
    【JavaScript】深拷贝和浅拷贝的总结(含义、区别及实现)
    【vue】路由传参的三种方式
  • 原文地址:https://www.cnblogs.com/Abtd/p/13681312.html
Copyright © 2020-2023  润新知