我的第四次做業:結對編程

項目地址 https://github.com/F0urty-Tw0/WordCount.git
結對夥伴學號 201831061110
結對夥伴博客連接 https://www.cnblogs.com/chenxiansheng/

1、PSP表格

uLqa4S.png


2、模塊設計與實現

1.代碼結構

uOCuSx.png

  • 程序將處理單詞的函數,如計算字符數charsCount()、行數linesCount()、單詞數及詞頻wordsCount()、打印對應詞組數wordgroup()封裝爲一個類word_operate(),並在main()函數中使用getopt()方法來實現命令行參數"-m"、"-n"、"-i"、"-o"的獲取,經過判斷getopt獲取的命令行參數opt來實現word_operate()類中方法的運行與用戶輸入不一樣參數值的交互。

2.關鍵函數實現

  • charsCount():html

    在獲取用戶指定的文件內容contents後,傳入len()函數便可直接求出字符數,其中分隔符如空格,非字母數字符號也會計入在內。
  • linesCount():python

    獲取文件內容contents後使用字符串方法.readlines便可將文件中的每一行存入列表,遍歷該列表並設定計數遍歷count便可求出文件行數。git

  • wordsCount():github

    • 計算單詞數:題目要求單詞至少要以4個英文字母開頭,引入python的re模塊,利用正則匹配re.findall(r'\w{4}',contents)來將四個字母以上的單詞存入列表,在經過len()求出列表長度即爲單詞數。
    • 計算單詞出現詞頻:先定義一個字典counts,將單詞做爲鍵,並經過字典特有的get()方法來判斷字典中是否已有對應鍵,若做爲鍵的單詞第一次出現,則直接將值賦值爲0,不然沿用鍵值。
      對應代碼:編程

      counts = {}
      for word in txtArr:
        counts[word] = counts.get(word, 0) + 1
  • wordgroup():小程序

    利用列表能夠連續讀取的特性,利用循環將每次讀取的區間進行更新。在利用join函數將列表讀取出來的詞組轉化爲字符串作爲關鍵字。再利用字典的get方法獲取詞組出現的頻率ide

  • main():函數

    main()函數主要用於獲取命令行參數,python中提供了getopt模塊來實現按輸入不一樣的命令行選項來實現不一樣功能,本程序經過定義若干個全局變量來做爲getopt()方法返回的opts列表對中的value,經過判斷用戶輸入的不一樣option來控制函數不一樣的輸出結果。工具

3.編程思想體現

- Interface Design:

程序在命令行中運行時,若用戶未輸入任何參數則會打印輸入參數示例,提示用戶添加參數以正確運行程序:性能

uLd9JJ.png

- Loose Coupling:

在一開始寫這個程序的時候,我與結對夥伴也只是將實現程序的函數單獨實現而且函數與函數之間相互獨立,並無將其封裝爲一個類,後續經過查閱資料得知將其封裝爲類後能夠保證內部的內聚性與外部的低耦合性。

封裝前:
uL0e8H.png
封裝後:
uL0JPg.png

4.程序運行結果

uOCd6f.png

uOCr7Q.png

uOCWcV.png


3、代碼複審

1.編碼規範制定

我與結對夥伴決定採用《Google Python Style Guide》中的編碼規範:

中文連接

官方原版

2.複審過程

一開始我與結對夥伴都只進行了自我複審,因爲自我感受良好,也都未發現須要改善的地方,但在後續的同伴複審過程當中纔開始發現代碼編寫中不規範的狀況,由此,代碼複審首先便要端正態度,要以一個旁觀者的心態去發現錯誤,改正錯誤,讓自我複審流程真正行之有效。

同伴複審過程運用pycharm即可便捷地進行,在源代碼界面中,編碼不規範地狀況會被直接標註並提示,如:

uLrzo6.png
提示該行過長,解決這一問題能夠運用圓括號實現行的隱式鏈接:
uLsJwq.png

uLsgk6.png

提示函數與函數之間的空行不足,添加至少兩個空行便可


4、性能分析及改進

1.性能分析

Pycharm Professional版本中提供了Profile工具來對程序進行方便的性能分析,給出Static統計結果與GUI界面。

在編寫好性能測試測程序後,點擊Run==>Profile test.py便可開始進行性能測試:

uLybr9.png

Statics統計結果:

uL6nxg.md.png

Call Graph:

uLc01S.png

2.性能改進

經過Statcis統計結果得知wordgroup()函數消耗最大,佔總程序的80%,
改進前:

uL6ves.png

打印詞組在詞組頻率前,沒必要要循環打印出來,因此改成先儲存在字典裏,而後直接輸出詞典的關鍵字,減小循環:

uLcLh6.png

改進後wordgroup()佔用:

uLgE38.png


5、單元測試

Pycharm中選中對應方法便可選擇unitest進行單元測試

1.測試程序設計思路

在選擇unittest後,會生成一個測試類,從unittest.TestCase中即成,分別編寫函數測試word_operate()類中的方法,以test開頭的就是測試方法,測試時會自動執行。

具體測試對應函數時,利用斷言self.assertEqual(test_func(1), 1)來判斷測試函數的返回值是否與指望值相同。

2.單元測試部分代碼

from unittest import TestCase
from word_operate import word_operate


class TestWord(TestCase):
    def test_charsCount(self):
        filename = '111.txt'
        file = open(filename, 'r')
        contents = file.read()
        d = word_operate(file, contents, filename)
        self.assertEqual(d.charsCount(contents), 13)
        file.close()

    def test_linesCount(self):
        filename = '111.txt'
        file = open(filename, 'r')
        contents = file.read()
        d = word_operate(file, contents, filename)
        self.assertEqual(d.linesCount(filename), 1)
        file.close()

    def test_wordsCount(self):

        filename = '111.txt'
        file = open(filename, 'r')
        contents = file.read()
        d = word_operate(file, contents, filename)
        self.assertEqual(d.wordsCount(contents), 1)
        file.close()

    def wordgroup(self):
        filename = '111.txt'
        file = open(filename, 'r')
        contents = file.read()
        d = word_operate(file, contents, filename)
        self.assertEqual(d.wordgroup(contents), 1)

3.單元測試覆蓋率

這裏要用到Coverage插件,選擇對應版本下載便可:

uL5eJA.png

覆蓋率測試結果:

uL5QL8.png


6、異常處理說明

1.用戶運行時未輸入任何參數:

uL7UNF.png

2.用戶運行時「-i」參數後輸入不存在的文件名:

uLqChF.png

2.用戶運行時「-m」與「-n」參數後輸入非數字:

uLql1H.png


7、結對過程

1.照片:

uLLUq1.jpg

2.結對過程:

考慮到和室友結對能夠方便的交流和討論,就決定和陳俊舟同窗結對,咱們兩個python都有些基礎,但都沒有面向對象編程的經歷,以前雖然寫過寫小腳本小程序,但都是一個個獨立的函數,經過此次結對完成項目,初步掌握了面向對象編程的方法;在程序編寫過程當中雖然有較多困難,但因爲結對編程能夠互相鼓勵,並及時糾正對方錯誤,在觀察夥伴編寫程序時能夠互相學習技巧,作到能力上的互補,由此,出現的問題被一個個順利克服,順利完成這次程序的編寫,由衷地體會到告終對編程地「1+1>2」。

相關文章
相關標籤/搜索