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

GIT地址 GITHUB克隆地址
結對夥伴 餘睿哲
夥伴學號 201831061417
夥伴博客地址 地址

1、PSP表格


2、接口的設計與實現過程

設計:

共五大類,其中計算方法類和命令行翻譯類兩個類須要設計對應的接口。html

詳細內容見下面思惟導圖(若是圖片看不清能夠適當放大網頁觀看
java

各種之間的關係

CountMethodImpl類 爲Main類提供各類算法git

TranslateCommandImpl類 則翻譯Main類傳過去的命令行指令,並返回須要的參數github

WriteFile類 主要用於文件讀寫算法

Test類 用於測試各類類中的方法可否正確實現編程

Main類 中執行主函數,集成全部功能。ide

關鍵函數及實現方法(見思惟導圖)

程序運行結果

注:有效行數與看到的行數不一樣的緣由:文檔窗口的大小不一樣,會致使顯示的行數不一樣,若是文檔窗口足夠長,則該文章(測試文章)可顯示爲一行
函數

用到的幾種設計理念

Interface Design工具

爲兩個比較重要,且內部函數較多的類設計了接口
性能

Loose Coupling

設計了五大類,將各個部分分開,想要加減功能能夠在對應的類中進行更新,對總體影響較小

Information Hiding

使用一些常量將ASCII碼、條件語句以及循環的參數保存起來,即隱藏了數據也提升了代碼的可讀性。


3、代碼複審

編碼規範

參考《阿里巴巴JAVA開發手冊》

開始閱讀

IDEA編譯器能夠下載審查插件

插件掃描結果,即還存在的問題:

改正後:

還存在必定的問題是由於:

一、有一個類爲最先寫的測試類,裏面有較多直接使用的數字(之後會多加註意)。

二、有變量定義爲numberM和numberN,是符合小寫駝峯命名法的,是插件掃描判斷錯誤。


4、性能改進

性能改進

接口實現的函數中,大多數都須要用到循環,循環的時間複雜度不算多,但也不算少。因此在循環中減小沒必要要的循環,不如在須要跳出循環時跳出循環,減小循環次數等等,便可減小必定的時間消耗,從而提升性能。

性能工具:JProfiler(IDEA的性能測試插件)

安裝方法

性能分析圖

主函數由於集成了全部工具類的方法,因此消耗最大

主函數代碼以下

public static void main(String[] args) {
    //輸入命令行
    Scanner scanner = new Scanner(System.in);
    String cmd = scanner.nextLine();
    //建立須要的對象
    TranslateCommandImpl translate = new TranslateCommandImpl();
    CountMethodImpl method = new CountMethodImpl();
    WriteFile writeFile = new WriteFile();
    //獲得須要的參數
    String inFile = translate.returnInFile(cmd);
    String outFile = translate.returnOutFile(cmd);
    int numberM = translate.returnNumberM(cmd);
    int numberN = translate.returnNumberN(cmd);
    //可否讀到文件,不能則中止
    try {
        InputStream in = new FileInputStream(inFile);
    }catch (IOException e) {
        System.out.println("文件位置有誤!");
        return;
    }
    //用於保存各類數據
    int characters, words, lines;
    //詞頻Map中的長度
    int length;
    //判斷有無-i, -o指令
    String noFile = "null";
    if(noFile.equals(inFile) || noFile.equals(outFile)) {
        System.out.println("輸入或者輸出不能爲空!");
        return;
    }
    //用於保存單詞集
    List<String> strings;
    //定長單詞集
    List<String> lengthWords;
    characters = method.countCharacterNumber(inFile);
    strings = method.countWordNumber(inFile);
    words = strings.size();
    lines = method.countLine(inFile);
    lengthWords = method.statisticsWord(strings, numberM);
    //獲得詞頻的Map
    List<Map.Entry<String, Integer>> frequency = method.countWordsFrequency(strings);
    //保存定長詞頻
    List<Map.Entry<String, Integer>> neededFrequency = new ArrayList<>();
    //獲得其長度,方便遍歷
    int maxLength = 10;
    length = frequency.size();
    //若是長度大於10,則把長度變成10
    if(length > maxLength) {
        length = 10;
    }
    //打印結果
    System.out.println("字符總數是:"+characters);
    System.out.println("有效單詞數是:"+words);
    System.out.println("有效行數是:"+lines);
    System.out.println("單詞的出現頻率從高到低依次是:");
    for(int i=0; i<length; i++) {
        System.out.println(frequency.get(i));
    }
    if(numberM > 0) {
        System.out.println("定長爲 "+numberM+" 的單詞是:"+lengthWords);
    }
    //若是參數n大於Map中的大小,則打印有效個。
    if(numberN > length) {
        numberN = length;
    }
    if(numberN > 0) {
        System.out.println("出現評率最高的前"+numberN+"個單詞依次是:");
        for(int i=0; i<numberN; i++) {
            System.out.println(frequency.get(i));
            neededFrequency.add(frequency.get(i));
        }
    }
    //寫入文件
    writeFile.writeFile(outFile, characters, words, lines, lengthWords, neededFrequency);
}

5、單元測試及其覆蓋率展現

測試有效行的計算

函數構造思路:獲得數據後,打印文章行數

數據構造思路:文章中有空行,看程序可否正確判斷

測試有效單詞的讀取

函數構造思路:獲得數據後,統計有效單詞數後打印

數據構造思路:文章中有部分非有效單詞,看程序可否成功判斷並存入單詞集合中。

測試命令行參數的獲取

函數構造思路:給定一條命令行指令,看可否正確地得到參數

數據構造思路:給定各類形式的命令行進行測試,看可否正確得到參數;以及命令行有問題時可否正確報錯。


6、異常處理說明

注:異常處理都在主函數中直接進行測試

異常一:命令行沒有 -i 或 -o指令

異常二:沒法讀取到文件


7、結對過程

描述:

此次很幸運可以找到也一樣是寫JAVA的同窗餘睿哲。分工明確,由於我在一開始就對這個程序的編寫有比較明確的思路,全部完成了大部分代碼的編寫;相應的他完成了不少代碼的審計工做。結對編程讓我感到一個複雜程序的編寫,由於兩我的的合做與努力變得簡單了。結對期間沒有發生任何矛盾,每一個人都把本身的作的那部分任務作到了最好。代碼的編寫期間也有過阻礙,經過兩我的的共同思考解決了問題。讓我真切的感覺到1+1>2。

照片以下:

相關文章
相關標籤/搜索