结对编程
这个作业属于哪个课程 | 课程链接 |
这个作业要求在哪里 | 作业要求链接 |
GitHub地址 | https://github.com/FantaPi/WordCount.git |
结对人博客地址 | https://www.cnblogs.com/fantapi/ https://www.cnblogs.com/Kowaine/ |
Part 1 结对编程过程
【结对编程部分,详见【BANされた】(可能暂时还未提交)】
Part 2 PSP表格
【结对编程部分,详见【BANされた】(可能暂时还未提交)】
Part 3 解题思路描述
由于正则表达式的特殊性,基本上每学习一门语言都得复习一遍,已经不知道用过多少次了。因此,拿到题目粗略浏览之后,第一反应就是:使用正则表达式可以方便快捷地实现这个程序。
这次的作业在题目难度上并没有什么复杂的地方,所以基本上复习了一下C#的输入输出、文件操作、正则表达式使用后,解题思路就明了了。
基本的解题思路如下:
input: 用户输入或者文件读取
do:
1. 分析用户输入
2. 运用正则表达式查询
3. 对查询结果进行统计、格式化,必要时使用Dictionary键值对形式储存
output: 控制台输出或者写入文件
Part 4 设计实现过程
一,设计过程
我主要负责底层实现,和GUI的实现
- 程序结构:经过简单分析,基本可以将程序划分为四个模块: 用户交互模块(控制台/窗体, 是程序运行的主体,在我负责范围内即是GUI窗体)、输入模块(Input类)、输出模块(Output类)、数据处理模块(Count类, 进行统计和数据处理)
- 模块交互:为了保证模块的独立性,模块之间不直接调用,而是通过窗体调用其他三个模块实现。
- 实现顺序: 先实现三个底层模块(输入、输出、数据处理),最后在实现用户交互模块(窗体,我决定采用更加美观的WPF)
二,类与函数
Input类
目前只有从txt文件读入,若以后要添加其他文件形式,可以在这个文件里方便地添加。
Output类
Count类
每个函数实现一个完全独立的功能,互不干扰。
三,单元测试
针对每个函数都编写了单元测试,由于实在太多,只进行部分截图
Input类的测试
Output类的测试
Count类的测试
字典之间的比较不能直接用Assert, 必须单独比较键和值
四,异常处理
-
检查文件的存在性
-
检查用户输入的合理性(我负责的部分不怎么涉及用户输入,GUI上也通过属性设置限制了输入,所以要检查的内容较少,直接用if语句检查)
五,附加功能实现
使用WPF设计,调用前三个模块进行相应功能的实现
运行截图
Part 5 制定的代码规范
一,代码规范设定
- 命名:
- 总则:清晰易懂,长度合适,控制在4个单词之内。若使用缩写,请在定义的地方注释含义。
- 变量名:驼峰法 例:words,wordCount...
- 函数名:驼峰法
- 类名:首字母大写 例:WordCount...
- 括号对齐:
- 大括号一律单独占用一行,小括号嵌套不要超过三层
- 空行:
- 执行不同功能的代码区块之间空一行, 函数定义之间空两行(类定义与函数定义之间也空两行)
- 空格:
- 表达式:操作数和操作符之间加一个空格
- 其他:英文逗号、冒号后加一个空格
- 注释:
- 执行单独功能的代码区块前加上注释,一般不需要具体到每一句,代码区块内部根据情况添加注释
- 涉及到复杂的数学运算或者正则表达式时需要解释代码块或表达式的作用
- 函数前加上注释,包含参数(如果存在)、功能、返回值(如果存在)
- 额外要求(依据个人习惯选择是否遵守)://后空一格再写注释内容
- 其他:
- 变量定义后如果不马上赋值,则赋值为null
- 基本变量一律使用封装后的类(如果存在)(如,不使用string, 而是封装后的String)
二,代码互审
在对方代码中发现的问题
-
模块名: CheckParam(及其单元测试) 检测和处理用户输入参数的模块
- 单元测试中没有用Assert进行检测,导致单元测试的结果无法显式地体现在测试报告中(只会显示"xx个单元测试未运行")。
- 多数函数没有任何返回值,无法在快捷地进行黑箱测试。
-
模块名: ParamException 自定义异常类
无问题 -
模块名: Program 控制台运行主体
- 同样的代码没有重构为单独的函数。
- 形式上类似,但是功能不同的函数,没有加上功能注释
总体来说,代码规范性太差,导致可读性较低,无法审查具体的逻辑,只能审查代码质量。
Part 6 性能分析
如图所示,耗时最长的都是自带函数,无力优化(我要能优化我会在这里?)
Part 7 感受与收获
这是第一次和人结对编程,能感受到和团队项目有很大区别。我大致分为以下几点对结对编程的感受进行了总结。
- 交流成本:交流上,明显比团队项目要轻松的多,只用考虑两个人之间一对一的交接,节省了不少时间。
- 分工问题:分工上,由于人数仅仅为2,基本上可以以前后端分离的方式来分工。但是由于前后端工作性质的不同,在工作量上是很难做到公平分配的,所以在个人能力和时间允许的情况下,前后端的实现也有互相之间的帮助。
- 项目质量:个人感受上,觉得这次项目的完成总体上是令人满意的,唯一的问题的两个人的代码可读性上差异比较大,导致结对编程的“结对”二字并没有太大的体现。
- 代码可读性:平时自己敲代码的时候,注释是加的比较少的,但这次由于要和人合作,所以在注释上花了很多时间。在这个过程中我发现,注释其实不仅仅是为了让合作者阅读,也能够更清晰地理顺自己的设计思路、更快速地发现设计上的问题。
- 代码测试:测试真的能很大程度上提高程序的稳定性。每写一个函数、都完成相应的测试单元,可以尽早地发现问题,大大地减少debug花费的时间。