Lab5總結
- 3.1 Static Program Analysis
-
- 3.1.1 人工代碼走查(walk through)
- 3.1.2 使用CheckStyle和SpotBugs進行靜态代碼分析
- 3.2 Java I/O Optimization
-
- 3.2.1 新功能:持久化存儲
- 3.2.2 多種I/O實作方式
- 3.2.3 多種I/O實作方式的效率對比分析
3.1 Static Program Analysis
針對 Lab4 中送出的最新版本代碼,進行靜态代碼分析。
3.1.1 人工代碼走查(walk through)
列出你所發現的問題和所做的修改。每種類型的問題隻需列出一個示例即可。
之前寫條件判斷if和else時,如果隻有一條語句,沒有加花括号,例如:

checkRep、構造方法和main方法沒有寫javadoc,有點想當然了。
對于泛型類的equals重寫:一開始注明了具體的泛型類,會産生unchecked cast的warning。修改如下:
3.1.2 使用CheckStyle和SpotBugs進行靜态代碼分析
列出你所發現的問題和所做的修改。每種類型的問題隻需列出一個示例即可。
對比分析兩種工具發現問題的能力和發現問題的類型上有何差異。
CheckStyle很好地發現了不符合google規範的代碼(人工走查時沒有發現),例如将多個變量定義在一起:
SpotBugs找出代碼邏輯上存在的bug,例如我在使用bufferedreader的readline方法時沒有考慮讀入為空的情況:
SpotBugs會給出對于該bug的可能性(目前隻見過high confidence和normal confidence)
兩種工具都是旨在找出代碼中的問題,不同之處在于:CheckStyle關注的是代碼的結構問題,不修改不會影響程式的運作,但會降低代碼的可讀性;而SpotBugs旨在找出代碼中的漏洞,不修改可能會引起程式的崩潰。
3.2 Java I/O Optimization
3.2.1 新功能:持久化存儲
首先在TrackGame添加方法save,然後在用戶端Main.java中增加一個功能:将目前的circularOrbit修改過後存入新的檔案client.output中。目錄結構如下:
3.2.2 多種I/O實作方式
實作了哪些I/O方式來讀寫檔案,具體如何實作的。
讀檔案采用的三種分别是BufferedReader、FileInputStream和Scanner;寫檔案采用的三種分别是BufferedWriter、FileOutputStream和FileWriter。具體時間大體相同,目錄結構如下:
如何用strategy設計模式實作在多種I/O政策之間的切換。
為三種政策定義相同的interface,在具體應用中的readFileAndBuild方法中添加了一個參數InputStrategy,根據不同的參數切換不同的政策(同理OutputStrategy)。
p.s. 在三個具體應用中分别使用了三種不同的InputStrategy和OutputStrategy以證明其正确性。
3.2.3 多種I/O實作方式的效率對比分析
采用的測試檔案為老師提供的50萬行左右的TrackGame.txt和90萬行左右的SocialNetworkCircle.txt。為了測試友善沒有在用戶端Main中測試,而是編寫了兩個測試檔案:TrackGameTest和SocialNetworkCircleTest。剛開始設計時沒有建立軌道系統對象,隻是根據幾個Strategy單純測量了一下IO時間;後來又按行讀入解析檔案,是以讀檔案的時間變成了讀取檔案+構造系統的時間。
如何收集你的程式I/O文法檔案的時間。
在調用readFileAndBuild和save方法前後通過system.currentTimeMillis方法擷取時間并作內插補點,得到IO所消耗的時間。
表格方式對比不同I/O的性能。
圖形對比不同I/O的性能。
純IO:
通過軌道系統對象測量的IO: