结对项目完成WordCount
合作者:201731062111 201731062130(学号)
代码地址:
本次作业链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2882
搭档博客:https://www.cnblogs.com/dreamhch/p/10659666.html
参考链接:https://www.cnblogs.com/bingaa/p/9637677.html
https://www.cnblogs.com/aehyok/p/3418447.html
1.结对项目PSP编写
我们的项目于4月2日正式开始,在开始编写代码之前,我们先就对项目需求进行了一次商定与讨论,大体分析了一下需要我们做什么。结合自身课程情况,约定了一起进行结对编程的时间和地点,并且共同完成了PSP表格的填写:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 | 25 |
· Estimate |
· 估计这个任务需要多少时间 |
30 | 25 |
Development |
开发 |
1095 | 1360 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 | 60 |
· Design Spec |
· 生成设计文档 |
40 | 60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 | 60 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
60 | 100 |
· Coding |
· 具体编码 |
800 | 900 |
· Code Review |
· 代码复审 |
45 | 100 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 | 50 |
Reporting |
报告 |
110 | 125 |
· Test Report |
· 测试报告 |
60 | 80 |
· Size Measurement |
· 计算工作量 |
20 | 20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 25 |
合计 |
1235 | 1510 |
2.描述结对过程及照片
我们的项目于4月2日正式开始,共同对题目进行了分析,分别阐述了对题目的看法,并进行了任务分工以及制定代码规范,并且共同完成PSP表格的填写。按照项目要求,分别实现功能。遇到不懂的,两人互相帮助,查阅资料。在各自实现基本功能之后,按照制定的代码规范进行对程序的修改,将程序整合在一起,完成此次结对项目。
3.解题思路描述
阅读题目过程后,发现需要实现的功能主要有以下几个方面:
- 读取文件。
- 统计文件的字符数。
- 统计文件的单词总数。
- 统计文件的有效行数。
- 统计文件中各单词的出现次数。
- 输出格式:
- characters: number
words: number
lines: number
<word1>: number
<word2>: number
...
4.设计实现过程
在阅读完题目之后,开始查找资料,看需要完成的功能该如何更好的实现。读取文件有不同的方式,选取一种方式;查找资料,学习使用正则式匹配单词,c#编写代码,在主程序中调用 <字符统计> <有效行数统计><单词统计> <统计文件中单词出现次数>将代码剥离开,按要实现的不同功能将代码分成各个模块。
由于第一次尝试画流程图,有很多思路不知道怎么用流程图的方式表达,希望以后有所好转。
5.代码规范及链接(代码互审,审查的模块名,发现的问题)
5.1代码规范
1.类型(类、结构、委托、接口)、字段、属性、方法、事件的命名:
优先考虑使用英文(尽量使用英文),如果实在没有合适的英文进行描述,可以使用拼音。
2.不使用缩写:
所有类型、字段、属性、方法、事件尽量不使用缩写。
3.不使用单个字母的变量:
不使用单个字母的变量, 像 i、m、n,使用temp等来替换,用于循环迭代的变量除外。
4.用Tab作为缩进,并设置缩进大小为4。
5.注释:
类型、属性、事件、方法、方法参数,根据需要添加注释。
6.一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。
7.调用类型成员内部其他成员,需加this,调用父类成员需加base。
8.在一个类中,各个方法需用一空行(最好是一个空行)。
5.2代码互审
各自按照共同制定的代码规范对自己的代码进行修改更正后,彼此交换,看看是否已经按照制定好的规范进行完善,双方对各功能模块进行测试,在确定无误后,进行代码的拼接。拼接时由于两个人的编码方式不同,导致拼接完成的程序无法正常运行,在共同修改之后,完成单元的拼接。
6.效能分析
7.代码说明
有效行数统计
class GetLine //读取行数 { public static int GetRows(string Filename) { string path = Filename; int lines = 0; using (StreamReader sr = new StreamReader(path)) { while (sr.ReadLine() != null) { lines++; } } return lines; } }
单元测试
namespace WordCount.Tests
{
[TestClass()]
public class GetLineGetLineTests
{
[TestMethod()]
public void GetRowsTest()
{
Line Line = new Line();
string filename = @"E:\input.txt";
string filename2 = @"E:\input2.txt";
string filename3 = @"E:\input3.txt";
string filename4 = @"E:\input4.txt";
string filename5 = @"E:\input5.txt";
string filename6 = @"E:\input6.txt";
string filename7 = @"E:\input7.txt";
string filename8 = @"E:\input8.txt";
string filename9 = @"E:\input9.txt";
string filename10 = @"E:\input10.txt";
Console.WriteLine(Line.GetRows(filename));
Console.WriteLine(Line.GetRows(filename2));
Console.WriteLine(Line.GetRows(filename3));
Console.WriteLine(Line.GetRows(filename4));
Console.WriteLine(Line.GetRows(filename5));
Console.WriteLine(Line.GetRows(filename6));
Console.WriteLine(Line.GetRows(filename7));
Console.WriteLine(Line.GetRows(filename8));
Console.WriteLine(Line.GetRows(filename9));
Console.WriteLine(Line.GetRows(filename10));
}
}
}
字符统计
class Character { public int GetChar(string Filename) { FileStream path = new FileStream(Filename, FileMode.Open); long size = path.Length; byte[] array = new byte[size]; path.Read(array, 0, array.Length); path.Close(); int count = 0; for (int i = 0; i < array.Length; i++) { if (array[i] >= 32 && array[i] <= 126) count++; } return count; } }
单元测试
namespace Wordcount.Tests { [TestClass()] public class CharacterCharacterTests { [TestMethod()] public void GetCharTest() { Character character = new Character(); string filename = @"E:\input.txt"; Console.WriteLine(character.GetChar(filename)); } } }
结果
8.结对感受与收获
通过这次结对编程,发现两个人合作的效果是优于一个人编程的,在合作的过程中,体会到了交流沟通的重要性,同伴之间要经常的互动交流,才不至于在编写程序时,两人的思想构造差距太大。此外,在共同完成项目的过程中,彼此之间互相学习,取长补短,两个人,就有不同的思路,而这些思路在将来或许是可以借鉴吸收的。并且两人合作,使得代码完成效率提高,两人互相监督,共同进步。