第四周作业wcPro
github地址:https://github.com/muzhailong/wcPro.git
PSP2.1表格
| PSP2.1 | PSP階段 | 預(yù)估耗時(shí) (分鐘) | 實(shí)際耗時(shí) (分鐘) |
| Planning | 計(jì)劃 | ?40 | ?20 |
| · Estimate | · 估計(jì)這個(gè)任務(wù)需要多少時(shí)間 | ?30 | ?20 |
| Development | 開發(fā) | ?300 | ? |
| · Analysis | · 需求分析 (包括學(xué)習(xí)新技術(shù)) | ?60 | ?40 |
| · Design Spec | · 生成設(shè)計(jì)文檔 | ?10 | ?10 |
| · Design Review | · 設(shè)計(jì)復(fù)審 (和同事審核設(shè)計(jì)文檔) | ?10 | ?10 |
| · Coding Standard | · 代碼規(guī)范 (為目前的開發(fā)制定合適的規(guī)范) | ?20 | ?10 |
| · Design | · 具體設(shè)計(jì) | ?40 | ?30 |
| · Coding | · 具體編碼 | ?120 | ?100 |
| · Code Review | · 代碼復(fù)審 | ?10 | ?10 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | ?40 | ?50 |
| Reporting | 報(bào)告 | ?20 | ?20 |
| · Test Report | · 測試報(bào)告 | ?10 | ?10 |
| · Size Measurement | · 計(jì)算工作量 | ?10 | ?10 |
| · Postmortem & Process Improvement Plan | · 事后總結(jié), 并提出過程改進(jìn)計(jì)劃 | ?10 | ?10 |
?
??
?接口實(shí)現(xiàn):
我們小組講這個(gè)工程分成類7大模塊:
? ? ? ? ? ? param:參數(shù)解析模塊
? ? ? ? ? ? ? ?in? ? ?:輸入模塊
? ? ? ? ? ? ? ?core? :核心處理模塊
? ? ? ? ? ? ? ?out? ? ?:輸出模塊
? ? ? ? ? ? ? ? ui? ? :圖形界面模塊
? ? ? ? ? ? ? ? util? :工具類模塊
? ? ? ? ? ? ? ? start: 模塊集成模塊
? ? 我主要負(fù)責(zé)的是輸出模塊,各個(gè)模塊如下圖所示:
????
輸出控制模塊:
public class WordPrinter {
private List<Entry<String, Integer>> res;
private PrintWriter writer;
public WordPrinter(List<Entry<String, Integer>> res,PrintWriter writer) {
this.res = res;
this.writer=writer;
}
public void print() {
int sz=res.size();
Entry<String, Integer> tmp=null;
for(int i=0;i<sz-1;++i) {
tmp=res.get(i);
writer.write(tmp.getKey()+" "+tmp.getValue()+"\r\n");
}
tmp=res.get(sz-1);
writer.write(tmp.getKey()+" "+tmp.getValue());
writer.flush();//刷新緩沖
}
}
為了方便輸出,使用Map.Entry類來保存字符的名稱,以及出現(xiàn)的頻率。
使用Print Writer將要輸出的數(shù)據(jù)寫入文件中。
?
測試用例:
?
測試用例的設(shè)計(jì)主要分模塊內(nèi)測試和模塊間測試(集成測試)可以點(diǎn)擊查看。
? ? ? ?
?
單元測試截圖:
start:
in:
core:
評(píng)價(jià)單元測試用例效果:
感覺我做的單元測試用例挺好的大部分都符合單元測試的集合要素(貌似是:自動(dòng)化,靈活,數(shù)據(jù)集合,報(bào)告記錄)。start模塊主要采用的是黑盒測試,因?yàn)閟tart模塊集成了所有的模塊,白盒測試部分只是做了一部分的判斷邏輯等。in模塊應(yīng)該來說是測試最為復(fù)雜的模塊,內(nèi)部方法比較多,針對(duì)每一個(gè)方法進(jìn)行測試然后使用套包的方法測試,效率還是挺不錯(cuò)的。core模塊相應(yīng)的邏輯比較少,因?yàn)閏ore模塊的很多東西都依賴與in模塊,所以就對(duì)接口的相關(guān)地方進(jìn)行的白盒測試。
?評(píng)價(jià)被評(píng)測模塊的質(zhì)量水平:
start模塊:中
in模塊:高
core模塊:高
開發(fā)規(guī)范說明:
開發(fā)規(guī)范采用的是《阿里巴巴Java開發(fā)手冊(cè)終極版v1.3.0.pdf》
選定的開發(fā)規(guī)范以及理解(我用以下的規(guī)范檢查我的代碼):
? ? ? ?常量定義
1. 【強(qiáng)制】不允許任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中。
理解:就是說常量不能使用變量拼接而成的。
反例:int c;static int A=c;
?
2. 【強(qiáng)制】long 或者 Long 初始賦值時(shí),使用大寫的 L,不能是小寫的 l,小寫容易跟數(shù)字 1 混 淆,造成誤解。
理解:很簡單不解釋
舉例:long k=123L;
3. 【推薦】不要使用一個(gè)常量類維護(hù)所有常量,按常量功能進(jìn)行歸類,分開維護(hù)。 說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利于理解和維護(hù)。
理解:有時(shí)候我們會(huì)專門寫一個(gè)類來維持常量,這樣是不好的因?yàn)閷⑺械某A糠旁谝黄鹁拖褚粋€(gè)大雜燴一樣。應(yīng)該根據(jù)功能進(jìn)行放置,比如說和單詞容量有關(guān)的常量可以放在單詞的工廠類中。
代碼格式
1. 【強(qiáng)制】大括號(hào)的使用約定。如果是大括號(hào)內(nèi)為空,則簡潔地寫成{}即可,不需要換行;如果 是非空代碼塊則:
1) 左大括號(hào)前不換行。
2) 左大括號(hào)后換行。
3) 右大括號(hào)前換行。
4) 右大括號(hào)后還有 else 等代碼則不換行;表示終止的右大括號(hào)后必須換行。
理解:就是字面意思,不用解釋。
舉例:while(i){
......
}
2. 【強(qiáng)制】 左小括號(hào)和字符之間不出現(xiàn)空格;同樣,右小括號(hào)和字符之間也不出現(xiàn)空格。
舉例:void king();
3. 【強(qiáng)制】if/for/while/switch/do 等保留字與括號(hào)之間都必須加空格。
說明:格式上看的清晰一點(diǎn)。
反例:if(t<0){
.......
}
4. 【強(qiáng)制】任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格。
舉例:k = i + j;
5. 【強(qiáng)制】采用 4 個(gè)空格縮進(jìn),禁止使用 tab 字符。
說明:很多IDE都可以講tab設(shè)置為4個(gè)空格。
6. 【強(qiáng)制】注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。
舉例:// fjei
7. 【強(qiáng)制】方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號(hào)后邊必須加空格。
舉例:void f(int a, int b, int c)
??OOP 規(guī)約
1. 【強(qiáng)制】避免通過一個(gè)類的對(duì)象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成 本,直接用類名來訪問即可。
理解:靜態(tài)方法屬于類,和類是綁定的,通過對(duì)象還要先找到類,在從類找到方法。
舉例:
public class Test{
public static int a;
}
使用Test.a即可。不需在定義一個(gè)引用。
2. 【強(qiáng)制】所有的覆寫方法,必須加@Override 注解。
理解:Override注解貌似是編譯時(shí)檢查,如果重載出現(xiàn)問題編譯時(shí)不會(huì)通過的。
舉例:
public class Animal{
public void voice(){}
}
public class Duck extends Animal{
@Override
public void voice(){}
}
3. 【強(qiáng)制】不能使用過時(shí)的類或方法。
理解:一般來說過時(shí)的方法都會(huì)有風(fēng)險(xiǎn),或者效率問題。
舉例:acm中最喜歡用的StreamTokenizer
4. 【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請(qǐng)放在 init 方法中。
理解:講邏輯放在構(gòu)造方法中會(huì)造成構(gòu)造對(duì)象浪費(fèi)大量的時(shí)間,有些對(duì)象構(gòu)造了但不一定會(huì)使用。
舉例:略。
5. 【推薦】循環(huán)體內(nèi),字符串的連接方式,使用 StringBuilder 的 append 方法進(jìn)行擴(kuò)展。
理解:+相當(dāng)于使用多個(gè)StringBuilder對(duì)象,效率很低下。
舉例:String a="asd";
a=a+"few"+"few";
正例:StringBuilder a=new StringBuilder();
a.append("fewf");
a.append("dsfew");
6. 【推薦】類成員與方法訪問控制從嚴(yán):
1) 如果不允許外部直接通過 new 來創(chuàng)建對(duì)象,那么構(gòu)造方法必須是 private。
?2) 工具類不允許有 public 或 default 構(gòu)造方法。
3) 類非 static 成員變量并且與子類共享,必須是 protected。
4) 類非 static 成員變量并且僅在本類使用,必須是 private。
5) 類 static 成員變量如果僅在本類使用,必須是 private。
6) 若是 static 成員變量,必須考慮是否為 final。
7) 類成員方法只供類內(nèi)部調(diào)用,必須是 private。
8) 類成員方法只對(duì)繼承類公開,那么限制為 protected。
理解:這個(gè)符合最小訪問原則。
1. 【推薦】集合初始化時(shí),指定集合初始值大小。
理解:ArrayList默認(rèn)大小是10 Map的默認(rèn)大小是16,他們一般都會(huì)在容量達(dá)到75%的時(shí)候進(jìn)行擴(kuò)容處理,所以如果初始時(shí)候知道了容量可以避免擴(kuò)容的開銷,提升效率。
舉例:
List<String> a = new ArrayList<String>(100);?
2. 【推薦】使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進(jìn)行遍歷。
理解:看過Map源碼就知道,HashMap在內(nèi)部維持了一個(gè)Entry的數(shù)組,使用entrySet遍歷其實(shí)就是遍歷數(shù)組,如果使用keySet就行遍歷,是講所有的key打包成一個(gè)set然后再通過遍歷key從map中獲取相應(yīng)的value,效率低下。
舉例:
for(Map.Entry<String,Integer>e : map.entrySet()){
.....
}
?
存在的問題:
代碼的注釋比較少,讓人摸不著頭腦。
變量命名意義不是很明顯。
優(yōu)化環(huán)境:
文件大小:40M
默認(rèn)時(shí)間:3.911
優(yōu)化策略:
in模塊
1.改變緩沖區(qū)大小,減少讀文件次數(shù) 默認(rèn)是1個(gè)字節(jié) 改變?yōu)?k
CACHE_CAPACITY=4*1024;
時(shí)間:2.178
2.StringBuilder對(duì)象設(shè)置為靜態(tài)的 實(shí)現(xiàn)重用
時(shí)間:2.124
3.設(shè)置StringBuilder對(duì)象較大的容量,從而避免頻繁的擴(kuò)展容量:
WORD_LENGTH=10
時(shí)間:2.156
WORD_LENGTH=10
時(shí)間:2.113
影響不是很大
core模塊
1.設(shè)置Map較大的容量,從而減少?zèng)_突;
默認(rèn)是16
MP_CAPACITY=1M 時(shí)間:2.012 最優(yōu)
MP_CAPACITY=40M 時(shí)間:3.296
MP_CAPACITY=20M 時(shí)間:2.581
MP_CAPACITY=16M 時(shí)間:2.473
MP_CAPACITY=4M 時(shí)間:2.427
MP_CAPACITY=1K 時(shí)間:2.241
2.改變排序方法
默認(rèn)采用堆排序 最優(yōu)
使用快速排序:慢
總結(jié):
沒有軟件開發(fā)就沒有測試,軟件開發(fā)提供軟件測試的對(duì)象。
軟件開發(fā)和軟件測試都是軟件生命周期中的重要部分。
軟件開發(fā)和軟件測試都是軟件過程的重要活動(dòng)。
軟件測試是保證軟件開發(fā)產(chǎn)物質(zhì)量的重要手段。
參考:
PrintWriter用法:https://www.cnblogs.com/xiaotiaosi/p/6394147.html
博客排版:http://www.cnblogs.com/kangzhishi0203/p/8691939.html
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/liqia/p/8747829.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的第四周作业wcPro的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EnvironmentError: my
- 下一篇: kvm虚拟化网卡、virbr0、网段修改