軟工第四次做業——結對編程

項目地址 https://github.com/Misizu-star/WordCount.git
結對夥伴 賈青虎
夥伴學號 201831061129
夥伴博客地址 https://www.cnblogs.com/wobuhuiqiao/

1、PSP表格

2、模塊設計與實現

1.代碼結構:

程序由一個 wordsCount 類, main() 主函數和 Getop(string cmd) 獲取命令參數函數構成。其中 wordCount 類成員中含 Char_num()Lines_num() 等函數。思惟導圖以下:
c++

2.關鍵函數實現:

  • int wordsCount::Char_num() :獲取ascii數git

    獲取輸入文件路徑後,經過對文件內容逐個讀取,並只對ASCII碼進行計數。github

  • int wordsCount::Lines_num() :獲取文件行數編程

    使用 getline() 函數獲取文件的每一行對行數進行計數。ide

  • void wordsCount::GetWords()、int wordsCount::Words_num() 、void wordsCount::Sort_words_rate()svn

    因爲對單詞時有額外的要求:單詞計數,按照出現頻率和字典排序,以小寫輸出。因此使用多個函數實現:
    • (1) void wordsCount::GetWords() :逐個讀取文件字符,將全部符合要求的「單詞」提取出來,轉爲小寫形式後(使用 algorithm 頭文件中的 transform() 函數 ),存放在一個 vector< string > 容器中。
    • (2) void wordsCount::Sort_words_rate() :對於統計詞頻首先想到的是用 pair<string , int> 記錄詞頻,排序則使用algorithm頭文件下的 sort() 函數。因而乎爲了方便統計詞頻,先排序,使相同的單詞在一起,再統計詞頻,統計好的詞頻存放在 vector<pair<string , int>> 中,再對其詞頻進行排序。(sort()函數中第三個參數提供了自定義排序標準)
  • __main(int argc, char *argv[])__ :主函數函數

    main()函數主要接受用戶從操做系統傳入的參數,參數經過Getop()函數解析後執行不一樣的輸出。工具

3.編程思想體現

  • Interface Design:性能

    對於接口的設計,咱們將wordCount這個類中全部屬性和成員函數的定義與實現分開單元測試

  • Information Hiding:

    信息隱藏,簡單地說就是是否可見與是否可用。
    • 不可見不可用:
      咱們將類的屬性和成員定義放在wordCount.h的頭文件中,實現部分放在wordCount.cpp中,使類中內容對外部而全然隱藏。
    • 可見不可用:
      經過使用privateprotect對類中成員和屬性進行修飾。包含頭文件後,即便能看到這些屬性,卻沒法使用它們。

具體效果如圖:

4.程序運行結果


3、代碼複審

1.編碼規範:

我與個人夥伴採用的是google的 c++ 編碼規範。
中文版
英文版
google c++ 編碼規範

2.複審過程:

複審過程當中因爲vs2017可以進行基本的規範檢查,若編碼不規範則會有各類提示。並且可以智能縮進,大大提升了咱們的編碼規範性。如圖:

同時在複審中也發現咱們對函數的命名比較隨意,如出現「int num」這些指意不明的變量,以及對「駝峯命名法」意識不強。(之後會注意並在編碼中逐步改進)

4、性能分析

Visual Studio 內置了很是棒的效能工具——性能探查器。點擊 IDE 頂部菜單欄中的 分析 ,便可看到 性能探查器

從分析圖中ShowWords_rate()函數的消耗佔用了43%之多,這是因爲此函數須要依賴類中的另外兩個個函數,爲了可以直接調用,在此函數中內嵌了其餘函數的調用。

因此使用這一個函數實則是這三個函數的消耗總和。若把這三個函數拆開,三個函數總消耗減小不明顯,但這樣卻破壞了封裝性。

5、單元測試

單元測試採用「白盒測試」,分別對各個模塊和函數進行測試。
因爲某些函數修改了對象的狀態,模擬對象真的...太困難了,因此只測試了Char_num(),int Lines_num(),int Words_num();這些函數中有調用未測試的函數,因此經過測試這些函數的正確性從而檢驗未測試函數的正確性。

開始測試時發現文件存在,可是文件老是打不開。屢次試驗後發現測試中的待打開的文件不能與代碼放在一塊兒,須要放在與後綴爲「.exe」相同的路徑下。


  • 初步測試:

  • 代碼修改後:

6、異常處理

1.拋出異常:

對異常這塊瞭解很少,目前只考慮到如下幾種可能會出現的異常:

  • 文件打開失敗:
  • 用戶未輸入參數、參數個數錯誤、參數不包含「-i」和「-o」:

  • 檢查「-n」和「-m」後面的參數是否爲數字:
    在程序中使用了stoi()函數實現字符串轉整型,若轉換失敗則會自動拋出異常。

2.捕獲異常:

使用try-catch對異常進行捕獲。

3.測試結果:

錯誤輸入:

正確輸入:

7、結對過程

  • 照片:

  • 感覺:

    此次結對編程在項目上,我學到了不少東西如:理解了 __int main(int argc, char *argv[])__ 中參數的含義,能對參數進行處理;對vectorpair的使用更加的熟練;瞭解並掌握了迭代器的基本用法;可以對常見的異常進行拋出和捕獲處理。在結對上,這是我和賈青虎的第一次結對編程,還處在磨合期,不管是對於任務分工,仍是我的編碼習慣上配合得都不夠好,對各類問題會出現了不一樣的見解。咱們此次花了許多時間在知識的學習上,結對編碼過程不連續。並且兩人水平不想當,某些能力上不能互補,因此此次結對編程的效率沒有作到「1+1>2」。

相關文章
相關標籤/搜索