第一次我的編程做業

1.Github項目地址

2.PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 30 35
· Estimate · 估計這個任務須要多少時間 30 35
Development 開發 1000 1710
· Analysis · 需求分析 (包括學習新技術) 240 360
· Design Spec · 生成設計文檔 20 30
· Design Review · 設計複審 10 10
· Coding Standard · 代碼規範 (爲目前的開發制定或選擇合適的規範) 20 30
· Design · 具體設計 260 280
· Coding · 具體編碼 240 700
· Code Review · 代碼複審 90 150
· Test · 測試(自我測試,修改代碼,提交修改) 120 150
Test Report 報告 105 120
· Test Report · 測試報告 60 60
· Size Measurement ·計算工做量 20 25
· Postmortem & Process Improvement Plan · 過後總結, 並提出改進計劃 25 35
  合計 1135 1765

3.解題思路描述

①看到題目後,首先想弄清楚什麼是json文件,百度了一下發現JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。再通過仔細觀察題目後,能夠看出數據主要分爲姓名、電話和地址三個劃分,其中地址格式比較複雜,又分爲了幾級,一級是省,二級是市,三級是縣/區,四級是街道/鎮,五級是詳細地址。也就是題中所說的["直轄市/省","直轄市/市","區/縣/縣級市","街道/鎮/鄉","詳細地址"]。
②接着發現能夠用正則表達式把手機號從地址中提取出來,因而去搜索了相關函數用法;同時也發現姓名後都跟着一個「,」,所以可使用逗號做爲標誌將姓名也劃分出來。
③最後是地址,首先考慮有省市區關鍵字的狀況,一樣也能夠用正則表達式,經過匹配省市區將地址劃分爲五級;可是也存在沒有省市區的狀況的劃分,這時就想到能夠經過傳入包含全國省市區劃分的文件來與字符串進行掃描匹配,從而劃分出省市區。git


4.計算模塊接口的設計與實現過程

設計包括代碼如何組織,好比會有幾個類,幾個函數,他們之間關係如何,關鍵函數是否須要畫出流程圖?單元測試是怎麼設計的?

  • 總共設計了三個類,一個是放主函數的類,一個是用來提取出手機號碼的類,另外一個是對地址進行分類的類。
  • 在最主要的類中,我放了一個主函數,主要實現的功能是讀取文件。接着把文件中內容賦值給一個字符串並調用傳入getFile()函數。在getFile()函數中,我先判斷文件是否存在,若是存在則把字符串的其中字符轉爲UTF-8的格式;而後創建一個緩存並把傳入的字符串存入一個新的字符串中,循環讀取每一行,運用substring()函數先將姓名提取並輸出;最後把姓名和姓名逗號後的字符串傳入了CheckIfIsPhoneNumber類,也就是我主要實現用來提取手機號碼功能的類,同時調用了其中的getPhoneNumFromStrIntoSet()函數。
  • 在這個新的類的函數中,我用了正則表達式來判斷手機號碼,以此來尋找與該模式匹配的輸入序列的下一個子序列。接着我利用循環獲取到以前匹配成功的表明手機號的字符串,而後用replace()函數把手機號也去除掉,最後轉向了用來分割地址的CheckAddress類。在CheckAddress類中,我設立了一個addressResolution()函數,也是利用正則函數匹配以省市區等爲關鍵詞的字符串並進行劃分輸出。

5.計算模塊接口部分的性能改進

記錄在改進程序性能上所花費的時間,描述你改進的思路,並展現一張性能分析圖(由VS 2017的性能分析工具自動生成),並展現你程序中消耗最大的函數。

在改進程序性能的過程當中,由於主要程序並不完善,因此所花的改進時間主要使代碼正確,大概用了120分鐘。
主要觀察瞭如何才能更好的匹配並劃分地址。github

  • 性能分析圖


6.代碼說明

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

  • 在用來提取出手機號碼的類中,使用正則表達式來判斷手機號碼的關鍵代碼爲
String regexp = "1\\d{10}";

由於手機號必然爲1開頭,並且手機號是連續的11位數字,而題目中有說不會出現地址中的數字與手機號相連的狀況,所以只要先匹配到開頭的數字1後若是後面跟着10位數字則能夠找出手機號。正則表達式

  • 在對地址進行分類的類中,使用正則表達式來判斷省市區的關鍵代碼爲
String regex = "(?<province>[^省]+自治區|.*?省|.*?行政區|.*?市)?(?<city>[^市]+自治州|.*?地區|.*?行政單位|.+盟|市轄區|.*?市|.*?縣)(?<dist>[^縣]+縣|.+區|.+市|.+旗|.+海域|.+島)?(?<distttt>[^區]+區|.+鎮|.+街道)?(?<village>.*)";

劃分省市區我是依照關鍵字進行,因此用了正則表達式,雖然也有把全國省市區劃分文件讀入而後遍歷進行匹配字符串的想法,可是沒有實現成功,所以採用了這種方法匹配出地址中的省市區關鍵字,匹配後成功後進行輸出。json


7.計算模塊部分單元測試展現

展現出項目部分單元測試代碼,並說明測試的函數,構造測試數據的思路。並將單元測試獲得的測試覆蓋率截圖,發表在博客中。

測試是使用eclemma來執行。緩存

  • 經過單元測試獲得的覆蓋率:

8.計算模塊部分異常處理說明

在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發佈在博客中,並指明錯誤對應的場景。

錯誤樣例:函數

[{"���":"C���","���":"13756899511","���":["���","���","���","����","����110�����"]}
  • 異常:出現了亂碼
  • 緣由:輸入文件未把把編碼改爲UTF-8

9.結合在構建之法中學習到的相關內容與我的項目的實踐經歷,撰寫解決項目的心路歷程與收穫。

經過不斷的搜索學習,我知道了在解決一個題目的時候要學會堅持,有時候當一個地方想不出來的時候,要有刻苦專研的精神,不輕易放棄,極可能就能終於想出方法;但同時也要學會靈活應對,面對一種方法不管如何也沒法取得進展時,能夠換種思路,變換思惟方式,說不定柳暗花明又一村,找到了更快捷更合適的解決方案。
    一開始學習的時候,我感到很困難,雖然有些想要放棄,但仍是從最基本的開始學習,慢慢了解到如何使用函數,如何對字符串進行分割,終於一點一點地打出了代碼。可是代碼還有不少不完善的地方,仍需大量的時間去學習和改善,在這個過程當中雖然很辛苦,可是也學到了很多的知識。在學習構建之法的過程當中,我學到了一些基礎知識和概念,瞭解瞭如何分析和測試,知道了當實現一個項目時不該該僅僅只是打代碼,而是應該先分析用戶使用功能的需求,接着列出相關設計和說明來進行開發。
    另外構建之法也讓咱們咱們瞭解到一些基本技術,好比單元測試和效能分析工具等,感受仍有不少地方須要去學習。同時我也學會了在打代碼前能夠先填PSP表格,先規劃好我的開發的流程,在實際操做中才更有條理。
相關文章
相關標籤/搜索