這個作業屬於哪個課程 | 2021春軟件工程實踐|W班 (福州大學) |
---|---|
這個作業要求在哪里 | 寒假作業2/2 |
這個作業的目標 | 1.閱讀《構建之法》並提問;2.完成詞頻統計個人作業 |
目錄:
1. 任務一
2. 任務二
1.任務一:閱讀構建之法並提問
1.關於兩人合作
我一直覺得代碼要自己一個人完成,因為只有自己的代碼自己才能看的懂,想到要開發大型項目時,那么多的命名,每個開發人員都要記住別人的命名方式,比如有些人喜歡全寫有些喜歡簡寫。雖說代碼規范是一定的,但是多人合作甚至是百人合作難免會出現類似的困難。這究竟是怎么解決的?
2.關於面向對象分析
自從上了這門課我就十分納悶,同樣是涉及多人方面。課堂上每個人畫的圖都是不一樣的,每個人都有自己的考量,但是卻要合作一起做項目的時候,難免會出現兩人之間的代碼沒辦法完美匹配。甚至是類的想法都有區別,特地弄這種容易出現分歧的構思方式並且還難想到特別是大項目究竟能不能起到加快開發等作用?
3.關於結隊
第四章講到兩人合作的不同階段,但是我想也是之前有想過的,兩個人一起編程會不會出現程序基本都由一個人完善的情況。實力比較弱的看不出來的往往都會被另一個大佬看出來,最后代碼的完善會不會直接把實力較差的人的代碼基本否決,從而編程“一個人編程”的情況。
4.還是結隊
第四章的不同階段中的磨合,讓我總結之前的又想到一個問題,自己的代碼和別人代碼的不同,在開發較小的項目時,會不會出現開發效率不如個人開發的情況。
5.關於PSP表格
第八章的計划和估計,在開始編程之前就計划好自己要在多長時間內完成,但事實上編程是偶爾遇到的小問題都可能拖延你甚至半天時間,在這種編程時間基本無法確定的情況下,編寫這個PSP表格究竟有什么作用?督促自己?
2.任務二:WordCount編程
項目地址
+ hear
PSp表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | 20 | 30 |
• Estimate | • 估計這個任務需要多少時間 | 20 | 30 |
Development | 開發 | 240 | 300 |
• Analysis | • 需求分析 (包括學習新技術) | 120 | 120 |
• Design Spec | • 生成設計文檔 | 30 | 40 |
• Coding Standard | • 代碼規范 (為目前的開發制定合適的規范) | 30 | 30 |
• Design | • 具體設計 | 60 | 90 |
• Coding | • 具體編碼 | 180 | 240 |
• Test | • 測試(自我測試,修改代碼,提交修改) | 120 | 180 |
Reporting | 報告 | 70 | 80 |
• Test Repor | • 測試報告 | 30 | 40 |
• Size Measurement | • 計算工作量 | 10 | 30 |
• Postmortem & Process Improvement Plan | • 事后總結, 並提出過程改進計划 | 10 | 20 |
合計 | 330 | 410 |
解題思路:
根據題目要求,每個模塊分開解決。一個操作對應一個方法放進一個類中。
分別為:打開文件、讀取文件、計算字符、計算行數、計算單詞數、保存單詞並排序、文件寫入。
- 關於文件操作沒什么值得注意的,在文件開啟失敗的時候加入了控制台的提醒。
- 計算字符:只要把文件字符讀取遍歷即可。因為中文不納入其中,因此加入了字符范圍在0~127的條件。
- 行數計算:用緩沖流按行讀取,去掉非有效行即可
- 計算單詞總數數:自己寫了一個判斷單詞的條件,用split分割空格,將分割出來的詞語變為小寫並存入數組中,計算數組大小。並在這一步操作創建map,將符合單詞條件的詞語存入map
- 單詞排序和計算:實現構造好了map。因為排序條件有兩個,單詞和數量,因此將map轉為列表list。重載比較器對列表list里的單詞進行排序,最后輸出前十個。
代碼編程規范
+ hear
設計與實現過程
- 文件操作:讀取文件output存在時切打開成功,在input不存在時自動創建input否者操作失敗。
if(operable&&!writefile.exists())
{
boolean temp=writefile.createNewFile();
if(temp) {
System.out.println("輸入文件不存在,已創建\n");
}
else {
System.out.println("輸入文件不存在,創建失敗\n");
operable=false;
}
}
- 字符讀取:事先把文件內容讀入緩沖流並保存到str中計算str的字符數。
public void CharsNumberCount()
{
charnum=0;
char[] ch = str.toString().toCharArray();
for(int i = 0; i < ch.length; i++) {
if(ch[i] >= 0 && ch[i] <= 127) {
charnum++;
}
}
}
- 行數讀取:用readline獲取所有行數,並減去無效行
public void LinesNumberCount() throws IOException {
reader = new BufferedReader(new FileReader(readfile));
String line;
while((line = reader.readLine()) != null)
{
if(!line.equals("") )
{
linenum++;
}
}
}
- 單詞判斷:判斷單詞由簡單的if語句組成,並且為了防止重復讀取在這一步中將單詞保存進map,不存在直接put,存在則key值加一
for(int i=0;i<str.length;i++)
{
if(str[i].length()>3&&str[i].charAt(0)>'9'&&str[i].charAt(0)>'0')
{
wordnum++;
if(map.get(str[i])==null){
map.put(str[i],1);
}
else{
map.put(str[i],map.get(str[i])+1);
}
}
}
- 單詞排序:重寫比較器compare,先判斷單詞出現頻率再比較單詞本身
list = new ArrayList<Map.Entry<String,Integer>>((Collection<? extends Map.Entry<String, Integer>>) map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2) {
if(o1.getValue()-o2.getValue()!=0)
{
return o2.getValue()-o1.getValue();
}
else {
return o1.getKey().compareTo(o2.getKey());
}
}
});
優化改進思路:
運用緩沖流,盡量減少讀取文件的次數。
計算單詞的方法中混入了將單詞存入數組的步驟,雖說這是為了防止重復執行讀取操作。或者也可以引入一個判斷的參數,可選擇是否執行保存單詞到map的操作。但似乎由不規范。。。
單元測試:代碼如下
static public void main(String arg[]) throws IOException {
Lib wc=new Lib();
wc.SetPath("output.txt","input.txt");
wc.Open();
wc.Read();
wc.CumberCount();
wc.WordsNumberCount();
wc.linesNumberCount();
wc.WordSort();
wc.show();
}
- 整體測試幾個空缺的部分分別是判斷語句跳過和另一個開發過程中用於在控制台輸出的show方法沒有執行
異常
在打開文件操作中加入了文件是否存在的判斷,並在控制台中輸出異常。
心得總結
- 第一次使用git因為自己英語水平很差,所以對使用git十分抵觸。導致一度拖拉最終無法在deadline前提交。盡管如此在學會使用git之后心里還是挺高興的。
- 久違的又用java寫了一次程序,本來打算用數組存儲並排序單詞列表,但在參考了別人的作業后,自己上網學習,掌握了map和map相關的排序重載。這是我一開始沒想到的。
- 在寫這個作業之前重來沒有接觸過代碼覆蓋率,也不知道這東西是干嘛的。如今清楚了。
- 以前從來沒有特別注意過自己代碼的書寫風格,此次作業完成后,自己的代碼風格也確定了,后續的程序編寫也會保持下去。