Deadline: 2018-09-12 23:00pmhtml
實現一個可以對文本文件文件中的單詞的詞頻進行統計的控制檯程序。java
實現一個命令行程序,不妨稱之爲WordCount。git
輸入文件名以命令行參數傳入。例如咱們在命令行窗口(cmd)中輸入:github
//C語言類 WordCount.exe input.txt //Java語言 java WordCount input.txt
則會統計input.txt中的如下幾個指標算法
按照字典序輸出到文件result.txt:例如,windows95,windows98和windows2000同時出現時,則先輸出windows2000windows
輸出的格式爲架構
characters: number words: number lines: number <word1>: number <word2>: number ...
在寫了一些代碼開胃以後,你們都完成了一份知足WordCount基本功能的代碼。
你們的代碼都各有特點,若是如今咱們要把這個功能放到不一樣的環境中去(例如,命令行,Windows圖形界面程序,網頁程序,手機App),就會碰到困難:代碼散落在各個函數中,很難剝離出來做爲一個獨立的模塊運行以知足不一樣的需求。
同時咱們也看到,不一樣的代碼解決不一樣層面的問題:框架
這些代碼的種類不一樣,混雜在一塊兒對於後期的維護擴展很不友好,因此它們的組織結構就須要精心的整理和優化。
咱們但願把基本功能裏的:函數
這三個功能獨立出來,成爲一個獨立的模塊(class library, DLL, 或其它)。這樣的話,命令行和GUI的程序都能使用同一份代碼。爲了方便起見,咱們稱之爲計算核心"Core模塊",這個模塊至少能夠在幾個地方使用:工具
把計算核心在單元測試框架中作過完備的測試後,咱們就能夠在算法層級保證了這個模塊的正確性。
但咱們知道軟件並不是只有計算核心,實際的軟件是交付給最終用戶的軟件,除了計算核心外,還須要有必定的界面和必要的輔助功能。
這個Core模塊和使用它的其餘模塊之間則要經過必定的API來交流。
API應該怎麼設計呢?
爲了方便起見,咱們能夠從下面的最簡單的接口開始(僅舉例,你的代碼裏可能沒有這個函數):
int countChar(File *file)
這個函數表示輸出一個文件指針,返回這個文件的字符數。
假設咱們用Core封裝了這個接口,那麼咱們的測試程序能夠是這樣:
File *in = fopen("input.txt","r"); int count = 100; Assert(countChar(in) == count);
固然,這樣的測試程序並不充分,但願你們測試時不要像這樣偷懶。
助教在測試時,將運行自動測試程序編譯源文件並運行,進行批量測試,所以請保證項目的組織目錄符合要求.
對於使用Java語言的項目有如下兩點要求:
一個Java項目的示例組織目錄以下所示:
031602111 (文件夾名字爲學號) |- src |- Main.java(主程序,能夠從命令行接收參數) |- lib.java(包含其它自定義函數,能夠有多個,對名字不作要求)
對於使用C++ 語言的項目有如下兩點要求:
【以學號爲名的文件夾中】的目錄下必須有src文件夾,在src文件夾中是可在VS2017下編譯運行的解決方案,解決方案的名字必須爲 WordCount,一個C++工程示例組織目錄以下所示:
031602111 (文件夾名字爲學號) |- src |- WordCount.sln |- WordCount |- stdafx.cpp |- stdafx.h |- WordCount.cpp |- WordCount.vcxproj
助教在測試時,將自動按照指定編譯環境編譯源代碼,並利用命令行進行批量測試。
本次自動測試會加入各類各樣出錯狀況的測試,要求開發者程序不能崩潰,而且可以儘量精確報錯。你能夠有「容錯性」的出錯設計,但必須輸出必要的提示或說明。
PSP是卡耐基梅隆大學(CMU)的專家們針對軟件工程師所提出的一套模型:Personal Software Process (PSP, 我的開發流程,或稱個體軟件過程)。
PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘) Planning 計劃 · Estimate · 估計這個任務須要多少時間 Development 開發 · Analysis · 需求分析 (包括學習新技術) · Design Spec · 生成設計文檔 · Design Review · 設計複審 · Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) · Design · 具體設計 · Coding · 具體編碼 · Code Review · 代碼複審 · Test · 測試(自我測試,修改代碼,提交修改) Reporting 報告 · Test Repor · 測試報告 · Size Measurement · 計算工做量 · Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 合計
一個功能完備的程序不是一蹴而就的。經過將詞頻統計的需求劃分爲4個部分,可將一個大任務劃分爲可操做的小任務,同時最好按照任務難度或緊急程度指定各個任務的完成次序。所以,在動手開發以前,要先估計將在程序各模塊開發所需耗費的時間,以及完成整個項目所需的時間,將這個[估計值]記錄下來,寫成PSP 的形式。
PSP的目的是:記錄工程師如何實現需求的效率,和咱們使用項目管理工具(例如微軟的Project Professional,或者禪道等)進行項目進度規劃相似。
有關PSP的更多內容,請自行閱讀鄒欣老師的博客:現代軟件工程講義 2 工程師的能力評估和發展
請閱讀鄒欣老師的博客:源代碼管理,瞭解源代碼管理的10個實踐問題。
本次做業要求使用Github進行源代碼管理,代碼有進展即簽入Github。簽入記錄不合理的項目會被助教抽查詢問項目細節。
對代碼簽入的具體要求以下:根據需求劃分功能後,每作完一個功能,編譯成功後,應至少commit一次。本例中,至少應區分基本功能和擴展功能,即分別針對基本功能、擴展功能,編譯成功後,總共至少應commit兩次。具體的功能劃分,請自行定義,並在撰寫博客時體現出來,遵循本身對需求的功能劃分來提交代碼便可。
對Commit不是很熟悉的話,請閱讀阮一峯的博客:Commit message 和 Change log 編寫指南,瞭解更多細節。
請根據本身以往積累的測試經驗,在編碼完成以後,提交產品以前,設計測試用例,並編寫單元測試,對本身的項目進行測試。
首先,至少應採用白盒測試用例設計方法來設計測試用例,其餘測試方法不限。其次,要設計至少10個測試用例,確保你的程序可以正確處理各類狀況。最後,結合測試評估的要求,對本身的測試設計進行評價,這些測試用例能知足該程序測試的要求嗎?
另外一個重要的措施是要把單元測試自動化,這樣每一個人都能很容易地運行它,而且可使單元測試天天都運行。每一個人均可以隨時在本身的機器上運行。團隊通常是在每日構建中運行單元測試的,這樣每一個單元測試的錯誤就能及時被發現並獲得修改。
推薦閱讀鄒欣老師的博客:現代軟件工程講義 2 開發技術 - 單元測試 & 迴歸測試