軟件工程實踐2020_寒假作業(2/2)—— 疫情統計


這個作業屬於哪個課程 <2020春W班 (福州大學)>
這個作業要求在哪里 <作業要求>
這個作業的目標 <建立博客、回顧、簡歷、繪制學習路線>
作業正文 <作業正文>
其他參考文獻 <csdn,github,《碼出高效_阿里巴巴Java開發手冊》,《W3CSchool Junit使用教程》>

Part.01 我的Github倉庫地址

在文章開頭給出Github倉庫地址


Part.02 PSP表格

閱讀《構建之法》第一章至第三章的內容,並在下方作業里體現出閱讀后的成果。特別是第2章中的效能分析及個人軟件開發流程(PSP)。之后給出此次作業的PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鍾) 實際耗時(分鍾)
Planning 計划 30 40
Estimate 估計這個任務需要多少時間 30 40
Development 開發 960 1415
Analysis 需求分析 (包括學習新技術) 60 60
Design Spec 生成設計文檔 30 45
Design Review 設計復審 30 60
Coding Standard 代碼規范 (為目前的開發制定合適的規范) 60 90
Design 具體設計 240 300
Coding 具體編碼 480 720
Code Review 代碼復審 60 60
Test 測試(自我測試,修改代碼,提交修改) 80 80
Reporting 報告 120 165
Test Report 測試報告 60 60
Size Measurement 計算工作量 30 45
Postmortem & Process Improvement Plan 事后總結, 並提出過程改進計划 30 60
合計 1110 1620

Part.03 思路描述

解題思路描述。即剛開始拿到題目后,如何思考,如何找資料的過程

  • 關於思考

流程圖

其實一拿到本次作業基本思路就有了,腦袋里第一浮現的思路就是這是個命令行(因為以前有用向jvm這么玩過,大一學的c也對命令行有將過一些),要解析它,文件讀寫,然后有八種類型的文本,因為自己也寫過好幾個爬蟲了,所以第一反應便是用正則表達式匹配+提取參數,於是在作業當天就fork了倉庫,后來定睛一看,“這次作業重點考察需求的分析”、“請在正式編寫程序之前先理清需求文檔”、“請在理清需求文檔后先設計好程序模塊、類圖、數據結構、算法流程等部分”,原來這次不是僅僅要求只實現功能什么的,把首先要做的代碼規范制定也看漏了,ok,乖乖關了編譯器,github啟動乖乖讀文檔。在后來的開發階段,我覺得把本次作業分為五個內部類,在對需求文檔進行分析后分為五個內部類完成本次作業(在后續實際開發中分為六個內部類):

        class CommandLine//命令行對應的實體類、  
        class CommandLineAnalytic//命令行解析類、  
        class RegexUtil//正則表達式工具類、    
        class LogUtil//Log文件工具類、   
        class LogDao//Log文件控制類、   
        class CommandLineApplication//啟動類,

畢竟咱java程序員還是要面向對象一點點的,這樣分模塊開發自己覺得也更適合維護和后續拓展,然后對於怎么開發,自己是按class CommandLine->class CommandLineAnalytic->class RegexUtil //正則工具類(在后續開發中獨立封裝出來的)->class LogUti->class LogDao->class CommandLineApplication的順序開發,包括GitHub的commit也是按照這個來的。

Commit記錄

  • 關於找資料

    • 資料的話首先參考了《碼出高效_阿里巴巴Java開發手冊》,學到了不少東西還是,在一邊學習大廠的代碼規范的同時,也慢慢的把自己代碼的coolstyle制定了,學着在每個方法和類添加了自動的注解方便閱讀,在開發中重新看了正則表達式的教程。

Part.04 設計實現過程

設計實現過程。設計包括代碼如何組織,關鍵函數的流程圖

  • 在設計本次疫情統計系統時,為了提高程序的可維護性與拓展性,在程序的內部划分了六個內部類:

    • class CommandLine 命令行對應的實體類:因命令行組成為 命令 + 命令行參數,具體分為了兩部分,class Command 命令對應的實體類、class Arguments 命令行參數對應的實體類(其中type類型因固定四種,故使用枚舉類型),有對應的get、set方法,成員變量使用布爾型,表示命令行的激活狀態,如命令$ java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt對應的命令行對象即為new Commandline{list: true; date: true; date_content: 2020-01-22; log: true; log_content:D:/log/; out: true; out_content: D:/output.txt; type: false; province: false}.

    • class CommandLineAnalytic 命令行解析類: 獲得main函數的命令行args拼成的List 進行解析,構造對應解析結果的命令行的對象。

    命令行解析

    • class RegexUtil 正則表達式工具類:存入了對應八種類型的正則表達式,eg:String type1 = "\W+ 新增 感染患者 \d+人";先匹配對應類型,再提取參數。

    正則

    • class LogUtil Log文件工具類:首先構建了文件結構對應的實體類class InfectResult,有對應的get、set方法,覆寫了toString方法 -> 以* province + " " + ip + " " + sp + " " + cure + " " + dead的格式方便按行存入結果文件;有一個處理list的class ListUtil list工具類,在解析文件時采用先列后合並的方法如文件2020-01-22.log.txt中“福建 新增 感染患者 2人”與“湖北 感染患者 流入 福建 2人“這兩行就構造為“福建 2 0 0”、“湖北 -2 0 0”、“福建 2 0 0”最后再合並同類項,這樣效率更高;class ResultUtil 結果工具類:封裝了正則匹配后的結果。

    • class LogDao 文件控制類:initLog初始化方法為本類所有方法的起點,讀入文件解析返回List<LogUtil.InfectResult>,當路徑為文件時進行解析,當路徑為一個目錄時遞歸調用自身讀入整個目錄;outLog寫入結果文件outLog(String fileName, String out_path, String commandline, List province, List type, String date)傳入多個參數控制寫入;sortResultByProvince方法調用Comparator接口進行中文排序。

    init

    • class CommandLineApplication 啟動類:程序的起點,Application方法實例化前幾個類,進行命令行解析、文件正則匹配讀寫。

Part.05 代碼說明

代碼說明。展示出項目關鍵代碼,並解釋思路


  • 項目總結構

all


  • class CommandLine//命令行對應的實體類

感覺注釋描述都寫的差不多,就不過多描述了(.😀

命令行對應的實體類:因命令行組成為 命令 + 命令行參數
成員變量使用布爾型,表示命令行的激活狀態,如命令$ java InfectStatistic list -date 2020-01-22 -log D:/log/ -out D:/output.txt對應的命令行對象即為new Commandline{list: true; date: true; date_content: 2020-01-22; log: true; log_content:D:/log/; out: true; out_content: D:/output.txt; type: false; province: false}.

Cmdline


命令對應的實體類

Cmd


命令行參數對應的實體類(其中type類型因固定四種,故使用枚舉類型)

Arg


枚舉type的四種類型

Enum


封裝枚舉的類

Dto


實例化的枚舉選項

Option


  • class CommandLineAnalytic//命令行解析類

Option


  • class CommandLineAnalytic//命令行解析類

解析命令行生成對應實例
Analytic


  • class RegexUtil//正則表達式工具類

定義了對應八種類型的正則表達式以進行匹配
Reg


正則提取參數
Reg


  • class LogUtil//Log文件工具類

文件結構對應的實體類class InfectResult,有對應的get、set方法,覆寫了toString方法 -> 以* province + " " + ip + " " + sp + " " + cure + " " + dead的格式方便按行存入結果文件
Util


處理list的class ListUtil list工具類,在解析文件時采用先列后合並的方法如文件2020-01-22.log.txt中“福建 新增 感染患者 2人”與“湖北 感染患者 流入 福建 2人“這兩行就構造為“福建 2 0 0”、“湖北 -2 0 0”、“福建 2 0 0”最后再合並同類項,這樣效率更高
Util


結果工具類:封裝了正則匹配后的結果
Util


  • class LogDao//Log文件控制類

initLog初始化方法為本類所有方法的起點,讀入文件解析返回List<LogUtil.InfectResult>,當路徑為文件時進行解析,當路徑為一個目錄時遞歸調用自身讀入整個目錄
Init


outLog寫入結果文件outLog(String fileName, String out_path, String commandline, List province, List type, String date)傳入多個參數控制寫入
out


sortResultByProvince方法調用Comparator接口進行中文排序
sort


  • class CommandLineApplication//啟動類

啟動類:程序的起點,Application方法實例化前幾個類,進行命令行解析、文件正則匹配讀寫
Application


Part.06 單元測試截圖和描述

單元測試截圖和描述

因有六個大的內部類,於是分為五部分進行單元測試(啟動類都是實例化前幾個類沒啥好測的),使用maven倉庫管理插件junit
pom


  • 命令行類單元測試

命令行類單元測試
TestCMDL

測試構造函數:測試了構造命令行中每個成員的狀態情況,着重測試對於type:ArrayList typeOption測試 與 province:ArrayList province_content測試
TestCMDL

測試結果
TestCMDL


  • 命令行解析類單元測試

命令行解析類單元測試
TestCMDL

測試解析函數:構建測試(測試命令行:$ java InfectStatistic list -log D:\log\ -out D:\ListOut2.txt -date 2020-01-22 -province 福建 河北),測試返回的布爾型及內容是否解析正確
TestCMDL

測試結果
TestCMDL


  • 正則工具類單元測試

正則工具類單元測試
TestRegex

測試正則提取參數:構建測試(測試了四種類型的正則提取),測試返回的封裝的參數是否正確
TestRegex
TestRegex

測試結果
TestRegex


  • Log工具類單元測試

Log工具類單元測試
TestLog

測試合並list:測試合並list 中的同省項
TestLog

測試結果
TestRegex


  • Log控制類單元測試

Log控制類單元測試
TestLog

測試合並log文件的讀入初始化、排序、寫入
TestLog

測試結果
TestRegex


Part.07 單元測試覆蓋率優化和性能測試

單元測試覆蓋率優化和性能測試,性能優化截圖和描述

  • 代碼覆蓋率

TestRegex


TestRegex

  • 性能測試
    使用Jprofiler 11.0進行性能分析

TestRegex

TestRegex

優化策略

  • 字符串的String調用次數最多,可能不少圖方便被寫到了循環體中的定義的局部變量,導致多次不必要調用,把能提的提出來

  • I/O流操作時,在使用完畢后,沒有及時關閉以釋放資源,對這些大對象的操作會造成系統大的開銷

  • 采用懶加載的策略,即在需要的時候才創建

  • 不要在循環中使用try…catch…,應該把其放在最外層

  • 本次的文件處理,使用帶緩沖的輸入輸出流進行I/O操作

  • 減少類型強轉的使用,尤其是向下的強轉

  • 不要讓public方法中有太多的形參

  • 字符串變量和字符串常量equals的時候將字符串常量寫在前面


Part.08 代碼規范

給出你的代碼規范的鏈接,即你的倉庫中的codestyle.md


Part.09 心路歷程與收獲

結合在構建之法中學習到的相關內容,撰寫解決項目的心路歷程與收獲

在這次的作業里學到了不少東西,在代碼的開發階段主要還是相當於把java的一些基礎的知識溫習了一遍,正則表達式還需要不斷學習,還不算精通。反而在開發之外的東西學到了不少,比如PSP表格這是自己第一次給自己定一個開發標准進行開發,由於是第一次這樣制定,也有很多不合理的地方,導致比預期多了500min,在下次的開發中會適當增加編碼和設計的時間;受益匪淺的是單元測試,膚淺的學習了一點點Junit框架的使用,發現以前自己覺得單元測試在浪費時間的想法大錯特錯,(以前覺得測試就是隨便實例一下方法分塊跑一下,沒報錯就好了),也有助於debug不少,不然自己以前覺得一手斷點打天下;使用了Jprofiler進行了性能分析,說實話自己對代碼的性能優化還不是很懂,就憑自己的理解胡謅了一點。


Part.10 5個倉庫

在github上尋找你在第一次作業中技術路線圖相關的5個倉庫,star並fork,在博客中提供名稱、鏈接、簡介(簡介30字左右)

spring cloud + vue + oAuth2.0全家桶實戰,前后端分離模擬商城,完整的購物流程、后端運營平台,可以實現快速搭建企業級微服務項目,支持微信登錄等三方登錄。

Netty是一個廣泛使用Java網絡編程框架,Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。

這是一份Java學習指南,涵蓋大部分Java程序員所需要掌握的核心知識。

Design patterns是程序員在設計應用程序或系統時可用來解決常見問題的最佳實踐手冊。它可以幫助你加快開發進程,有效防止一些可能導致重大失誤的細節問題,不過深入了解java-design-patterns之前,你應提前熟悉各種編程/軟件設計原則。

該項目基於 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前后端分離的后台管理系統,項目采用分模塊開發方式, 權限控制采用RBAC,支持數據字典與數據權限管理,支持一鍵生成前后端代碼,支持動態路由。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM