運用要件に対応 | https://www.cnblogs.com/harry240/p/11524113.html |
---|---|
Githubの住所 | https://github.com/1517043456/WordCount.git |
姉妹提携パートナーブログ | https://www.cnblogs.com/isHao/ |
、PSPテーブル
PSPは、ソフトウェアエンジニアのためのカーネギーメロン大学(CMU)のモデルであり、専門家は提案:パーソナルソフトウェアプロセス(また、パーソナルソフトウェアプロセスとして知られているPSP、個人的な開発プロセスを、)。
PSP2.1 | パーソナルソフトウェアプロセス段階 | 推定時間がかかる(分) | 実際の時間がかかる(分) |
---|---|---|---|
プランニング | 計画 | 20 | 30 |
.Estimate | このタスクが必要とどのくらいの時間の推定 | 400 | 600 |
開発 | 開発 | 300 | 350 |
。分析 | (新しい技術を学ぶ含む)需要分析 | 30 | 30 |
・デザインスペック | 設計ドキュメントの生成 | 20 | 30 |
・デザインレビュー | ・デザインレビュー(と彼の同僚は、設計文書を見直し) | 10 | 30 |
・コーディング標準 | ・コードの仕様(現在の開発のための適切な規範の開発) | 20 | 20 |
・ 設計 | ・具体的な設計 | 30 | 30 |
・コーディング | ・具体的なコーディング | 300 | 500 |
・コードレビュー | ・コードレビュー | 30 | 60 |
・テスト | ・テスト(セルフテスト、コードを変更し、変更を提出) | 60 | 30 |
報告 | ・レポート | 30 | 60 |
・ 試験報告書 | ・テストレポート | 60 | 30 |
・サイズ測定 | ・コンピューティングのワークロード | 30 | 30 |
・死後&プロセス改善計画 | ・後知恵、およびプロセス改善計画を提案します | 30 | 30 |
トータル | 1370 | 1640 |
双晶の第二に、プロセス
最初の問題を理解し終えた後、私たちはまず、我々は最初の完全であるかの特徴を決定しなければならない、このプロジェクトを完了する方法について説明し、より優れたその袖と乾燥燃料をロールアップするために、分析を必要とします。私たちの分析の後、我々は、機能実現の後、そのように上のコードのコード効率の再利用性を考慮してまで、目的を達成するために機能を開始することを決めました。私たちは、その後、マニュアル仕様を開発するためにアリババを使用する決定を議論し、議論は関数が使用されますどのくらいのクラスを含むことになります。コード仕様の現像後、各両方がピアレビュー開発コード仕様に従って行われ、最後にコードをマージし、コードを修正し、改善試運転続い暫定版、ユニットテストフォームを形成した後、自分の元のコード設計を開始します最終版。ここでは、画像記録処理の接合は次のとおりです。
第三に、問題解決のためのアイデア
1、基本的な機能
主題の基本的な機能は4つのステップに分かれています。中国語の文字に関係なく、まず、統計ファイルの文字、第二は、ファイル全体の統計で有効ラインの数である、第三には、通過-m
フレーズの有効数を計算するための命令、4つのワードカウントは、ファイルの合計数と出現し、レコーダ出力の数です。我々は、次のクラスと、私たちが作成した方法ですが、異なる機能が実装されます改善するためのさまざまな方法を使用します。
- PRINTFILEカテゴリ:ファイルoutput.txtと10ワードの出力の高い発生頻度。
- PrintWordカテゴリ:統計高頻度語のための出力、およびソート。
- StatisticsFileクラス:入力ファイル内の単語の数やファイルの統計情報は、数行を持っています。
StatisticsWordクラス:このファイルは、ワード数の統計が含まれています。
図2に示すように、プログラムのフローチャート
我々は、全体的な設計フロー・チャートを議論した後、次のとおりです。
第四に、実装コード部分
1、正規表現の統計
総正規表現文字の数、およびワードカウント。
/**
* 统计字符总数
* */
public static int signFile(string fileName)
{
string argex2 = "[a-zA-Z]{4,}[a-zA-Z0-9]*";
int signNumber = 0;
int sum = 0;
string allText = File.ReadAllText(fileName);
signNumber = Regex.Matches(allText, @"\d").Count;//统计数字
signNumber = signNumber + Regex.Matches(allText, @"\s").Count;//统计空白字符
signNumber = signNumber + Regex.Matches(allText, @"\w").Count;//统计任何单词字符
sum = Regex.Matches(allText, argex2).Count;
Console.WriteLine("字符数为:" + signNumber);
Console.WriteLine("单词数量为:" + sum);
return signNumber;
}
2、統計行数
ReadLineメソッドのSreamReaderにより、ファイルの行数をカウントします。
/**
* 统计文件行数
**/
public static int lineFile(string fileName)
{
int rows = 0;//文件行数
StreamReader streamReader = new StreamReader(fileName, Encoding.Default);
while (streamReader.ReadLine() != null)
{
rows++;
}
streamReader.Close();
Console.WriteLine("该文件行数为:" + rows);
return rows;
}
3、統計フレーズ
以下の方法で統計的なフレーズを達成。
/**
* 统计词组
* */
public static int sumWord(string fileName, int m)
{
int instructionM = m;
int number = 0;
int last = 0;
Dictionary<string, int> keyValuePairs = new Dictionary<string, int>();
StreamReader reader = new StreamReader(fileName, Encoding.Default);
String path = null;
string s = null;
while ((path = reader.ReadLine()) != null)
{
s += (path + "\n");
}
string[] words = Regex.Split(s, @"\W+");
foreach (string word in words)
{
if (keyValuePairs.ContainsKey(word))
{
keyValuePairs[word]++;
number++;
}
else
{
keyValuePairs[word] = 1;
number++;
}
}
if (number > instructionM)
{
last = number - instructionM;
Console.WriteLine("词组个数为:" + last);
}
else
{
Console.WriteLine("不存在这样的词组");
}
return last;
}
4、発注
単語の種類の発生頻度と同時に、所定の周波数の辞書で発注。
foreach (KeyValuePair<string, int> entry in keyValuePairs)//统计单词总量
{
wordKey[i] = entry.Key;
wordValue[i] = entry.Value;
i++;
}
for (int j = 0; j < i; j++)//排序
{
for (int x = j + 1; x < i; x++)
{
if (wordValue[j] < wordValue[x])
{
int value = 0;
value = wordValue[j];
wordValue[j] = wordValue[x];
wordValue[x] = value;
string key = null;
key = wordKey[j];
wordKey[j] = wordKey[x];
wordKey[x] = key;
}
}
}
string[] result = new string[instructionN];
for (int j = 0; j < instructionN; j++)
{
result[j] = wordKey[j] + ":" + wordValue[j];
// Console.WriteLine( ss1[j] );
}
var queryResults = from ni in result//字典序排序并输出
orderby ni
select ni;
foreach (var item in queryResults)
{
//Console.WriteLine(item);
File.AppendAllText(o, item + "\r\n");
}
V.コードのピアレビュープロセス
由于一些功能没有实现,所以我们互审主要基于代码的格式和已实现功能的纠错。
1. 命名变量、函数时不要随意取名,最好有相关意思,采用阿里巴巴规范命名法。避免过多地描 述和可要可不要的修饰词。
2. 尽量使代码简明易读,无二义性。
3. 在复杂的表达式中,用括号清楚地表示逻辑优先级。
4. 断行,每个“{” “}”独占一行,一一对应。
5. 给出关键的注释。
代码规范
我们在互审过程中,发现了我们代码不规范带来的烦恼。所以我们决定规定好代码规范。可以给我们带来以下好处。
- 规范的代码可以促进团队合作
- 规范的代码可以减少bug处理
- 规范的代码可以降低维护成本
- 规范的代码有助于代码审查
- 养成代码规范的习惯,有助于程序员自身的成长
代码规范链接:https://www.jianshu.com/p/d7e87107073c
六、建立单元测试
初步单元测试结果如下:
改进后单元测试结果如下:
七、效能测试及性能改进
本次性能分析,主要是从算法入手和设计入手。首先在初步完成项目后,我们就进行了一次项目性能分析,来查看哪里的优化效率和算法。
可见,当我们为了完成功能,将所有代码写到一起时,有的代码重复率十分高,消耗也大,耦合度也大。因此我们进行了相应的优化和改进。
当我们将代码进行整理后,代码的重复率下降,耦合性降低,同时也通过注入对象的方式减少了类实例化的开销。
改进后单个类效能测试如下:
总结
本次结对编程的项目我个人感觉还是比较难的,很多东西还是一如既往的不懂,然后一如既往的查资料,虽然做了很多天,仍然有些功能没能实现。在和队友商量后也没有解决,只把自己能做的写了出来。在编程过程中,通过代码互审,互相找到了对方代码的不足,并改正。很多之前不知道的东西在此次作业中出现,由于并不了解,所以做的很粗糙。在此次作业中深刻地认识到了自己的差距,会在之后的学习中更加努力,争取以后的作业不会出现此次情况。
此次结对1+1<2,由于自身的原因,且并没有真正领略到结对编程的含义,导致大多数代码是两个人各自完成,最后再来对照纠错,以及并不熟悉别人的想法导致效率的低下,结对编程比较要求两个人的水平相近。