日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第三次作业-结对编程

發(fā)布時(shí)間:2025/3/19 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三次作业-结对编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Github項(xiàng)目地址:https://github.com/WHYNOTEN/WordCount.git

合作同學(xué)作業(yè)地址:https://www.cnblogs.com/Mchandu/p/10657935.html

?一.PSP表格

PSP2.1

Personal Software Process Stages

預(yù)估耗時(shí)(分鐘)

實(shí)際耗時(shí)(分鐘)

Planning

計(jì)劃

890?1435

· Estimate

· 估計(jì)這個(gè)任務(wù)需要多少時(shí)間

890?1435

Development

開(kāi)發(fā)

770??1270

· Analysis

· 需求分析 (包括學(xué)習(xí)新技術(shù))

40??50

· Design Spec

· 生成設(shè)計(jì)文檔

30??35

· Design Review

· 設(shè)計(jì)復(fù)審 (和同事審核設(shè)計(jì)文檔)

50??60

· Coding Standard

· 代碼規(guī)范 (為目前的開(kāi)發(fā)制定合適的規(guī)范)

20??15

· Design

· 具體設(shè)計(jì)

30??50

· Coding

· 具體編碼

420??900

· Code Review

· 代碼復(fù)審

60??40

· Test

· 測(cè)試(自我測(cè)試,修改代碼,提交修改)

120??120

Reporting

報(bào)告

120??165

· Test Report

· 測(cè)試報(bào)告

?60?80

· Size Measurement

· 計(jì)算工作量

30??60

· Postmortem & Process Improvement Plan

· 事后總結(jié), 并提出過(guò)程改進(jìn)計(jì)劃

30??25
?

合計(jì)

900??1435

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

二.計(jì)算接口模塊的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程

?1.需求分析(由兩人共同商議)

  基礎(chǔ)功能

    1.統(tǒng)計(jì)文件字符數(shù)(包括字母/數(shù)字/特殊符號(hào)/空白符)

    2.統(tǒng)計(jì)單詞總數(shù)(單詞必須四個(gè)英文字母開(kāi)頭,后面可以為數(shù)字,不區(qū)分大小寫(xiě))

    3.統(tǒng)計(jì)文件中有效行數(shù)

    4.統(tǒng)計(jì)文件中單詞單詞總數(shù),按頻率排序,對(duì)于相同頻率單詞按字典順序排列

    5.按照字典順序輸出到文件中

    6.調(diào)用程序時(shí),通過(guò)命令行傳入文件讀取和寫(xiě)入路徑

  新功能:

    1.輸出前n個(gè)頻率最高的單詞

    ? 2.指定一個(gè)詞組長(zhǎng)度,輸出詞組及其出現(xiàn)頻率

    ? 3.多參數(shù)混合使用

實(shí)現(xiàn)所有需求思路:

  • 需求主要是對(duì)于文本中內(nèi)容的提取,由于之前學(xué)習(xí)過(guò)爬蟲(chóng),自然想到了利用正則表達(dá)式對(duì)內(nèi)容提取,但是由于C#和Python還是存在一些區(qū)別同時(shí)對(duì)于正則的支持不太一樣,所以需要學(xué)習(xí)一下C#中對(duì)正則表達(dá)式的使用。
  • 對(duì)于行數(shù)提取則可以通過(guò)讀取文件(按行提取內(nèi)容)時(shí),判斷提取內(nèi)容是否為null來(lái)解決。
  • 統(tǒng)計(jì)頻率可以通過(guò)字典這種Key,Value這種存儲(chǔ)方式來(lái)進(jìn)行統(tǒng)計(jì),排序則通過(guò)字典排序?qū)崿F(xiàn)。
  • 對(duì)于命令行傳入?yún)?shù)可以通過(guò)Main(string[] args)中對(duì)args進(jìn)行解析來(lái)實(shí)現(xiàn)。
  • 新功能輸出前n個(gè)頻率最高可以直接輸出字典內(nèi)容即可。
  • 對(duì)于第二個(gè)新功能最初不是很理解,最后詢(xún)問(wèn)助教老師后確定同樣可以利用字典統(tǒng)計(jì)詞組并輸出
  • 第三個(gè)功能主要是對(duì)于Main方法args參數(shù)的解析,可以利用字典保存參數(shù)及其內(nèi)容
  • 最終確定主要寫(xiě)兩個(gè).cs文件,其中一個(gè)對(duì)功能實(shí)現(xiàn),另外一個(gè)進(jìn)行功能類(lèi)調(diào)用,這樣測(cè)試時(shí)即只需要對(duì)功能類(lèi)函數(shù)進(jìn)行測(cè)試即可,基本功能由筆者實(shí)現(xiàn),對(duì)于新功能有合作者實(shí)現(xiàn),最終整合在功能中:

    Function.cs:主要實(shí)現(xiàn)對(duì)文本內(nèi)容的提取篩選實(shí)現(xiàn)需求功能;

    Program.cs:對(duì)命令行參數(shù)進(jìn)行分析(GetMand()),調(diào)用Function.cs對(duì)文本內(nèi)容分析,實(shí)現(xiàn)功能(Main()).

    ?算法關(guān)鍵在于正則表達(dá)式的書(shū)寫(xiě)以及將內(nèi)容寫(xiě)入字典整合:

    ?

    文件讀取代碼:

    //讀取文件中的字符數(shù)目并保存文件內(nèi)容public void GetChar(){//打開(kāi)文件FileInfo file = new FileInfo(this.path);//定義讀取文件對(duì)象StreamReader sw = file.OpenText();//按行進(jìn)行讀取,不為空行記錄行數(shù)并保存內(nèi)容,返回null打斷循環(huán)while (true){//對(duì)文件讀取內(nèi)容進(jìn)行判斷,如果不為空用變量接收,行數(shù)加一string temp = sw.ReadLine();if (temp != null){account++;this.content += temp;}//為空則停止else{break;}}} View Code

    正則匹配函數(shù):

    public void ExtractChar(){//利用正則進(jìn)行匹配,以字母開(kāi)頭,可以數(shù)字結(jié)尾MatchCollection rel = Regex.Matches(this.content, @"([a-zA-Z]{4}\w*)");for (int i = 0; i < rel.Count; i++){//匹配到的單詞進(jìn)入列表this.result.Add(Convert.ToString(rel[i]));}} View Code

    字典寫(xiě)入代碼:

    //利用字典統(tǒng)計(jì)單詞出現(xiàn)次數(shù)public void Statistical(){//建立臨時(shí)字典保存單詞以及出現(xiàn)次數(shù)Dictionary<string, int> words = new Dictionary<string, int>();for (int i = 0; i < this.result.Count; i++){if (words.ContainsKey(this.result[i])){words[this.result[i]]++;}else{words[this.result[i]] = 1;}}//對(duì)字典內(nèi)容排序,并賦值給類(lèi)變量this.words_sort = words.OrderByDescending(p => p.Value).ToDictionary(p => p.Key, o => o.Value);//清空臨時(shí)字典內(nèi)容 words.Clear();} View Code

    ?

    三.代碼復(fù)審

      代碼規(guī)范:詳情請(qǐng)查看鏈接

      各自完成代碼交換代碼,對(duì)代碼內(nèi)容進(jìn)行查看,基本均按照代碼規(guī)范進(jìn)行編碼,對(duì)于不懂部分進(jìn)行了增添注釋,使代碼得到可讀性提高。同時(shí)對(duì)命名部分進(jìn)行了詳細(xì)檢查,修改了部分變量名。

    ?

    四.性能改進(jìn)

    從性能分析圖看出Program.Main()與Function.ToFile()分配最多,但由于這兩個(gè)函數(shù)都是調(diào)用了其余函數(shù),所以減去其余調(diào)用函數(shù)分配,得出Function.ToFile()分配最多,為786,其次是Function.ExtractChar()

    //將內(nèi)容寫(xiě)入文件中public void ToFile(string path){//運(yùn)行先行函數(shù),將需要的文件內(nèi)容保存至變量中this.GetChar();this.ExtractChar();this.ToLow();this.Statistical();//獲取當(dāng)前文件路徑string filepath = Directory.GetCurrentDirectory();//定義文件輸出路徑filepath += path;FileInfo file = new FileInfo(@filepath);StreamWriter sw = file.AppendText();sw.WriteLine("characters: {0}", this.CharNum());sw.WriteLine("words: {0}", this.WordsNum());sw.WriteLine("lines: {0}", this.account);//遍歷字典將內(nèi)容寫(xiě)入文件foreach(KeyValuePair<string,int> kvp in this.words_sort){sw.WriteLine("{0,-10}:{1,-3}", kvp.Key, kvp.Value);}//關(guān)閉文件 sw.Close();Console.WriteLine("結(jié)果文件保存于:{0}", filepath);} View Code

    分析代碼發(fā)現(xiàn)在ToFile()函數(shù)中進(jìn)行了當(dāng)前文件路徑讀取,讀取文件,并多次寫(xiě)入文件(特別是遍歷字典同時(shí)進(jìn)行寫(xiě)入文件),由此可見(jiàn)循環(huán)寫(xiě)入文件是導(dǎo)致性能變差的原因。改進(jìn)方法是將需要寫(xiě)入的內(nèi)容保存至一個(gè)臨時(shí)字符串中,遍歷字典后再對(duì)整個(gè)字符串進(jìn)行寫(xiě)入文件操作。ExtractChar()函數(shù)使用了正則進(jìn)行匹配,由于對(duì)Regex類(lèi)具體實(shí)現(xiàn)不清楚,暫時(shí)無(wú)法進(jìn)行性能優(yōu)化。

    ?

    ?五.單元測(cè)試

    ?    由于項(xiàng)目中函數(shù)依賴(lài)關(guān)系,故只需要對(duì)部分函數(shù)進(jìn)行單元測(cè)試即可,即對(duì)CharNum()和WordsNum()兩個(gè)函數(shù)查看返回結(jié)果是否正確即可,若返回字符數(shù)與單詞數(shù)均正確,則單元測(cè)試通過(guò)。但是有一個(gè)缺陷那就是對(duì)于命令行輸入內(nèi)容的測(cè)試,沒(méi)有找到方法對(duì)于.exe運(yùn)行時(shí)接收的外部參數(shù)進(jìn)行測(cè)試判斷.同時(shí)部分函數(shù)是將內(nèi)容寫(xiě)入文件中,沒(méi)有找到合適的途徑進(jìn)行測(cè)試。另外由于VS2017社區(qū)版本無(wú)自動(dòng)輸出代碼覆蓋率功能,無(wú)法判斷代碼覆蓋率是否符合要求。下面是部分測(cè)試代碼:

    ?

    ?

    六.異常處理

    異常處理主要針對(duì)命令行傳入?yún)?shù)的判定:

    1.文件傳入路徑

    //對(duì)得到內(nèi)容進(jìn)行處理 - i參數(shù)確定文件是否存在try{StreamReader sw = new StreamReader(command["-i"]);}catch{Console.WriteLine("需處理的文件不存在!請(qǐng)檢查路徑重新運(yùn)行!");}

    2.-m 與-n 參數(shù)內(nèi)容是否為整數(shù)

    //對(duì)-m -n 參數(shù)內(nèi)容進(jìn)行強(qiáng)制轉(zhuǎn)換看是否為整數(shù) if (command.ContainsKey("-n") && command.ContainsKey("-m")){try{int nums = Convert.ToInt32(command["-n"]);int length = Convert.ToInt32(command["-m"]);}catch{Console.WriteLine("參數(shù)輸入有誤,請(qǐng)重新運(yùn)行!");}}else if (command.ContainsKey("-m") && !command.ContainsKey("-n")){try{int length = Convert.ToInt32(command["-m"]);}catch{Console.WriteLine("參數(shù)輸入有誤,請(qǐng)重新運(yùn)行!");}}else if (!command.ContainsKey("-m") && command.ContainsKey("-n")){try{int length = Convert.ToInt32(command["-n"]);}catch{Console.WriteLine("參數(shù)輸入有誤,請(qǐng)重新運(yùn)行!");}}else { }

    ?

    七.結(jié)對(duì)過(guò)程

      在結(jié)對(duì)之后,選定了兩方都有空的時(shí)間進(jìn)行討論,根據(jù)PSP表格預(yù)估時(shí)間,討論出項(xiàng)目需求,代碼設(shè)計(jì),根據(jù)各自水平進(jìn)行分工,完成代碼先進(jìn)性自省,然后交換代碼進(jìn)行復(fù)審,最后匯總生成.exe文件進(jìn)行實(shí)例測(cè)試,單元測(cè)試并不斷提交進(jìn)度,最后撰寫(xiě)博客。

    ?

    八.總結(jié)

      這是第一次與人進(jìn)行真正意義上的結(jié)對(duì)編程,最大的感覺(jué)就是比單獨(dú)一個(gè)人編程輕松許多,同時(shí)更容易發(fā)現(xiàn)問(wèn)題所在,在代碼注釋方面也明顯比單獨(dú)編程時(shí)多了許多,代碼可讀性更高,變量命名更加規(guī)范。同時(shí)也有一些小問(wèn)題,兩個(gè)人的想法會(huì)有不同,對(duì)于同一個(gè)問(wèn)題的理解有一些差別,而這個(gè)意見(jiàn)統(tǒng)一過(guò)程花費(fèi)的時(shí)間顯然更多。但總的來(lái)說(shuō),這次的結(jié)對(duì)編程收獲頗豐。

    轉(zhuǎn)載于:https://www.cnblogs.com/SW-P-WY/p/10657136.html

    總結(jié)

    以上是生活随笔為你收集整理的第三次作业-结对编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。