項目 | 內容 |
---|---|
這個做業屬於哪一個課程 | 2016級計算機科學與工程學院軟件工程(西北師範大學) |
這個做業的要求在哪裏 | 實驗四 軟件工程結對項目 |
課程學習目標 | 熟悉軟件開發總體流程,提高自身能力 |
本次做業在哪一個具體方面幫助咱們實現目標 | 第一次體驗一個完整的工程 |
博客地址html
github連接地址git
修改後源碼github
在博文結構方面,總體結構較爲完整,功能設計的內容詳細,對需求進行了認真的分析,方便以後的工做開展,測試運行部分能給出相應功能的實現結果,且運行界面對功能的說明清晰。在設計實現部分,沒有體現出清晰的功能調用和函數之間的邏輯關係,內容稍簡單。經過PSP表的數據,你在需求分析階段用了較多的時間,有意識到分析的重要性,在編碼和測試階段用時較計劃時間長,可能邏輯尚未清晰,處在一個試的過程。
在具體代碼方面,功能和菜單功能的實現能獨立編寫,有較好的模塊性,但能夠分的在細一些,代碼的規範性還有待提升,好比你的類名一個是Functions,另外一個是Function,這都表示功能,但我想要看相應功能的代碼,到底應該看哪一個呢,類中有些變量名的定義有些隨便。在功能實現方面,能和用戶進行必定的交互,詞頻統計和柱狀圖顯示作的很好,可是向文件寫入的順序是按字母表順序,不是按詞頻順序,但願經過第四次實驗咱們可以一塊兒完善這部分的代碼。編程
經過本次點評,瞭解告終對方的代碼書寫風格和功能邏輯,爲任務二的開展定下基礎,發現告終對方在博客書寫,代碼編寫上的優勢,經過學習注意到本身之後編寫時要改進的問題,經過發現不足起到自省和相互學習的目的,有些不足是咱們同時都存在的,那麼在接下來結對編程時更加註意,相互提醒,使得本次項目更加的完善和規範,功能不完善的地方也須要共同討論完成。框架
經過對項目要求的分析,本次結對項目的需求爲:
1.實驗2要求的功能,單詞頻數可視化柱狀圖用GUI顯示;
2.統計該文本行數及字符數;
3.各類統計功能均提供計時功能,顯示程序統計所消耗時間(單位:ms);
4.可處理任意用戶導入的任意英文文本;
5.人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
6.附加分功能1:統計文本中除冠詞、代詞、介詞以外的高頻詞;
附加分功能2:統計前10個兩個單詞組成的詞組頻率。ide
1.Main中主要是實現主界面和從文本中讀入單詞並統計詞頻,統計總行數和總單詞數的功能
2.WordCountStatistics實現查詢指定單詞詞頻的界面和功能
3.PrintToFile實現向文件按字典順序寫入詞頻單詞的功能
4.由於本次實驗中的附加功能1是實驗二的查看前N個高頻詞的擴展,進行合併後HighFrequencyWords實現輸出除介詞、代詞、冠詞的用戶指定查看的前N個高頻詞
5.WordCountHistogram實現單詞詞頻柱狀圖顯示
6.在全部功能中都有計時功能函數
1.輸出除介詞、代詞、冠詞的用戶指定查看的前N個高頻詞單元測試
String str = "above, over,in,of,at,on,behind,during,from,into, onto,inside,outside,to,without,throughout,out,she,he,its,we,them,your,i,you,my,myeself,a,an,the"; String s[] = str.split(","); ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet()); //按詞頻排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue() - o1.getValue(); } }); int j=0; int i=0; while (j<wordNum) { boolean flag = true ; String tmpString = list.get(i).getKey(); for (String string : s) { if(tmpString.equals(string)) { flag = false; } } if(flag) { print += list.get(i).getKey()+ ": " +list.get(i).getValue()+" "; j++; } i++; }
2.時間統計學習
long start = System.currentTimeMillis(); JOptionPane.showConfirmDialog(null,print+"\n"+"所用時間:"+(System.currentTimeMillis() - start)+"ms","結果",JOptionPane.DEFAULT_OPTION);
3.柱狀圖顯示測試
int Width = getWidth(); int Height = getHeight(); int leftMargin = 50;//柱形圖左邊界 int topMargin = 50;//柱形圖上邊界 Graphics2D g2 = (Graphics2D) g; int ruler = Height-topMargin; int rulerStep = ruler/20;//將當前的高度平分爲20個單位 g2.setColor(Color.WHITE);//繪製白色背景 g2.fillRect(0, 0, Width, Height);//繪製矩形圖 g2.setColor(Color.LIGHT_GRAY); for(int i=0;i<rulerStep;i++){ g2.drawString((30000-1500*i)+"個", 8, topMargin+rulerStep*i);//繪製Y軸上的數據 } g2.setColor(Color.PINK); int m=0; for (Entry<String, Integer> entry : map.entrySet()) { int value =entry.getValue(); int step = (m+1)*40;//設置每隔柱形圖的水平間隔爲40 g2.fillRoundRect(leftMargin+step*2,Height-value/50, 40, value, 40, 10);//繪製每一個柱狀條 g2.drawString(entry.getKey(), leftMargin+step*2, Height-value/50-5); //標識每一個柱狀條 m++; }
1.主界面
2.向文件按字典順序寫入單詞詞頻,並顯示所用時間
3.統計總行數和單詞數,並顯示所用時間
4.除介詞、代詞、冠詞的用戶指定查看的前N個高頻詞
5.查詢指定單詞詞頻並顯示柱狀圖
1.根據參考代碼規範共同列出本次結對實驗的代碼規範。
2.互相閱讀對方的代碼,瞭解對方代碼編寫習慣,並按照制定的代碼規範改進對方代碼。
3.一塊兒討論並填寫PSP計劃時間。
4.共同進行本次項目的需求分析和整體設計,尤爲在實驗二基礎上新增的功能的實現。
5.由我主導GUI框架的搭建、統計行數單詞數和運行時間顯示部分,趙燕霞主導柱狀圖和附加功能的實現,在主導位置的互換過程當中,另外一人則進行對代碼規範的監督和提醒,提供功能實現上的不一樣想法,以後選擇出更好的思路,在出現Bug時,一塊兒對代碼進行閱讀,找出邏輯錯誤。
6.整個項目完成後,兩人共同根據代碼規範進行復審,對多餘的語句進行簡化。
7.填寫PSP實際所用時間。
8.撰寫報告文檔。
任務內容 | 計劃完成時間(min) | 實際完成時間(min) |
---|---|---|
計劃 | 10 | 7 |
規劃工做步驟 | 10 | 7 |
開發 | 255 | 264 |
需求分析 | 10 | 9 |
生成文檔 | 5 | 10 |
設計複審 | 15 | 10 |
代碼規範 | 20 | 15 |
具體編碼 | 180 | 200 |
代碼複審 | 15 | 10 |
測試 | 10 | 10 |
報告 | 15 | 12 |
測試報告 | 5 | 7 |
計算報告量 | 5 | 2 |
過後總結 | 5 | 3 |
在本次結對編程的過程當中,體會了合做編程的過程,經過相互的討論和監督使得代碼更規範,功能更完善,邏輯較爲嚴謹,特別是在單元測試和代碼複審時,能更快的發現代碼的錯誤,結對編程的效率比較高,在代碼規範方面,意識到隨意編寫的危害,讀代碼改代碼都很費勁,在按編寫規範寫程序後,逐漸改善了這種狀況,但在結對編程中也遇到了問題,好比剛開始分工上打算一人主導一人輔助,但發現主導的人思惟有時會混亂,因此就交換充當主導者的角色;在編程的過程當中常常會出現都感受本身的想法是對的,這樣使得討論陷入僵局,這時咱們採用獨自編程的方法,最後誰的能較好實現功能就用哪一個。