一、github地址:https://github.com/Moyjing/Moy
二、psp表格
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鍾) |
實際耗時(分鍾) |
Planning |
計划 |
30 | 30 |
· Estimate |
· 估計這個任務需要多少時間 |
30 | 20 |
Development |
開發 |
2010 | 1985 |
· Analysis |
· 需求分析 (包括學習新技術) |
90 | 110 |
· Design Spec |
· 生成設計文檔 |
60 | 75 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
30 | 30 |
· Coding Standard |
· 代碼規范 (為目前的開發制定合適的規范) |
30 | 20 |
· Design |
· 具體設計 |
120 | 100 |
· Coding |
· 具體編碼 |
1500 | 1440 |
· Code Review |
· 代碼復審 |
60 | 80 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
120 | 130 |
Reporting |
報告 |
120 | 140 |
· Test Report |
· 測試報告 |
60 | 50 |
· Size Measurement |
· 計算工作量 |
30 | 40 |
· Postmortem & Process Improvement Plan |
· 事后總結, 並提出過程改進計划 |
30 | 50 |
合計 |
2160 | 2155 |
三、解題思路分析
首先說明代碼運行的環境:eclipse,JRE System Library[J2SE-1.5]
看到題目,先把三個功能的每一點要求弄清楚,其次就是有疑問:這三個功能之間是否有依賴關系,如果要實現圖形界面,各個功能之間應該如何調用?
1)基本功能:
-c統計程序代碼的字符數,一個可行方法是利用緩沖流來一行一行讀取(readLine)文件內容,字符串有求長度的方法;
-w統計詞數,詞,何為一個詞,漢字算,英文單詞算,還有其他?參考了網上一篇博客對詞的定義:漢字+不以數字開頭(允許以下划線開頭)的連續的詞字符組成的詞,具體實現則利用java的正則表達式進行匹配,其中漢字([\u4e00-\u9fa5]),其他詞([a-zA-Z_][\\w]{0,});
-l統計行數,這里行數的定義是光標所移動到的最大的行所在的行號,實現起來也比較簡單:readLine方法可以統計所有的行包括空格行。
2)擴展功能:
-s遞歸處理多個文件,只要得到用戶要求的目錄下的所有文件路徑就好辦了,所以思路就是遞歸得到一個目錄下的所有子目錄的所有文件,首先定義一個裝文件路徑的List容器,再寫一個遞歸函數(List容器和指定目錄路徑作為參數傳進)自己調用自己,有了指定目錄下所有的文件路徑,就可以從中挑選符合指定后綴的文件,我這里分了三種情況:*.java(用戶沒有指定目錄只指定了文件后綴,此時目錄設為當前目錄);C:\java\test\*.java(用戶既指定了目錄又指定了文件后綴);C:\java(用戶只指定了目錄),采用substring和lastIndexOf這兩個方法,可以分別得到文件所在的目錄和文件的后綴,能夠靈活處理*和?等通配符,挑選出符合條件的路徑后就將其作為其他功能的參數傳進,輸出相應的統計數據;
-a處理更加程序代碼中更加復雜的行,這里的空行,注釋行,代碼行,我自己定義為互斥的三種不同類型的行(加起來為總的行數),也就是即使注釋行中有空行,也不當作空行了,只統計為注釋行,空行按照項目要求的定義,要求中的可顯示字符我理解為任意的一個能打印出來的字符。由於代碼行的注釋不被當作注釋行,因而也無需考慮雙引號里面出現// , /* , */的情況,這里仍是用正則表達式來統計。
3)高級功能:
-x圖形界面我直接布局了五個按鈕和一個文本輸出框,在選擇了文件后,文本輸出框可以將代碼顯示出來,點擊按鈕就有消息窗顯示對應統計信息。
4)總體的框架就是Counter類(計數器),繼承了JFrame,類里面定義圖形界面需要的各種組件,以及分別寫-c,-w,-l,-a,-s的函數來實現統計功能,-x命令則將已經創建好的Counter實例可視化,函數與函數之間互相調用,輸出各自的統計結果。
四、設計實現
一個Counter類,函數有countchar,countword,countline,countcomplex_line,dealwith_multifile,multi_file,一個構造方法(初始化圖形界面的組件)以及事件監聽函數,main函數用Scanner從命令行接收用戶輸入的命令,-c,-w,-l,-a,-s分別調用countchar,countword,countline,countcomplex_line,dealwith_multifile函數,-x命令使Counter的一個實例可視化,以-s開頭的命令處理多個文件,這個命令的第二個參數可以是-c,-w,-l,-a,也能調用其他函數輸出統計結果,multi_file是一個遞歸函數,dealwith_multifile調用multi_file獲得文件路徑,事件監聽函數里面也可以根據用戶點擊圖形界面的相應的button顯示結果。
五、運行測試
用戶輸入命令的格式:命令參數(-c,-w,-l,-s,-a,-x) 文件路徑
測試文件目錄
1、空文件(-c,-w,-l,-a)
2、只有一個字符的文件(-c,-w,-l,-a)
3、只有一個詞的文件(-c,-w,-l,-a)
4、只有一行的文件(-c,-w,-l,-a)
5、一個典型的文件
6、處理多個文件(支持通配符)
7、圖形界面
六、項目總結
這次寫軟工作業有幾點不足之處,其一:java基礎不扎實,分析完需求之后,差不多是邊查資料邊打代碼,降低了開發的效率,所以這次的項目我在開發階段用的時間最多;其二:並沒有以一種鍛煉個人能力的態度去做這次的項目,特別是測試方面沒有做到單元測試,回歸測試,效能測試等要求,這也是我后期的其他項目需要改進的地方。總體來說收獲是蠻大的,從軟件開發的一個比較全面的流程中學到了如何用PSP表記錄開發各階段的花費時間,以及如何細致全面的分析需求,還有如何用各種測試來保證代碼的質量。