截止時間:2016年10月2日24:00。html
在第一個做業中,咱們用各類語言實現了一個命令行的地鐵出行路線規劃小程序。接下來,咱們看看若是要把小程序升級爲能穩定運行,解決用戶問題的軟件,應該怎麼作。算法
在咱們作測試的過程當中,咱們能夠比較具體的地鐵站點的名字,以驗證算法的正確性, 可是咱們實際上並不在意這個具體名字是「知春路」, 仍是「惠新西街南口」,咱們只要知道它們相同就行了。可否給每一個地鐵站點一個數字的標識,這樣便於比較? sql
第一階段目標:抽象數據庫
請修改你的beijing-subway.txt地圖文件,給每一個地鐵站點一個惟一標識ID,使用ID來表示地鐵站點之間的鏈接關係,而後再修改程序中讀取文件的部分,讓它能處理ID,而不是僅僅車站名字。修改程序以後,請保證程序依然可以完成它原有的功能。以後再簽入代碼。編程
你們寫的代碼都各有特點,你們寫的 「軟件」 也有必定的用處。若是咱們要把這個功能放到不一樣的環境中去(例如,命令行,Windows 圖形界面程序,網頁程序,手機App),就會碰到困難,由於目前代碼的廣泛問題是代碼都散落在main()函數或者其餘子函數中,咱們很難把這些功能完整地剝離出來,做爲一個獨立的模塊知足不一樣的需求。小程序
咱們看到,不一樣的代碼解決不一樣層面的問題,有些是內部數據的計算(例如最短路徑的查找);有些是和用戶輸入相關的(例如scanf,cin,圖形界面的輸入字段),有些是和數據的展示相關的(例如 printf ,cout,println,DrawText),有些是和程序所在平臺的架構相關的(例如 main 函數,並非全部的程序都須要某個特定格式的main)。這就須要咱們對軟件的架構作一些整理和優化。數組
建議你們把路線規劃的計算功能包裝在一個模塊中(這個模塊能夠是一個類 Class, 一個DLL,等等), 爲了方便起見,咱們叫它 「計算核心」Core 模塊, 這個模塊至少在兩個地方可使用:架構
那麼這個Core模塊和使用它的其餘模塊之間是什麼關係呢?它們要經過必定的API (Application Programming Interface) 來和其餘模塊交流。這個API 接口應該怎麼設計呢?(這是一個給有必定經驗和實力的同窗的題目),爲了簡單,咱們能夠從下面的最簡單的接口開始:框架
Spath ( )函數
這個Spath函數接受兩個int型ID做爲輸入(ID是地鐵站點的惟一標識),這個模塊的返回值是一個int型數組,記錄了從一個站點出發到達另外一個站點的最短路徑的站點列表。
假設咱們用的是類,咱們的測試程序剛開始能夠是很是簡單的測試例子:(用僞代碼表示)
int[] result = Core.Spath(3, 5);
Assert(result == {3,4,5}); //咱們斷言從站點3到站點5的最短路徑必定是{3,4,5}.
而後同窗們實現本身Core 的這個功能。
第二階段目標:把計算兩個站點之間最短路徑的功能封裝起來,經過測試程序和API 接口測試其功能。
計算兩個站點之間最短路徑成功以後,而後咱們再把以前程序中實現的其餘功能也封裝成獨立的模塊,包括讀取地圖文件、返回地鐵線路的全部站點、計算兩個站點之間換乘最少的最短路徑、輸出打印等。因爲同窗們已經在本身之前的程序中實現了各類算法,這時候只要把實現的算法搬過來就行了。建議你們在每一步都只改一個方面,在每實現一個新的功能的時候,要保證之前運行正確的例子繼續是正確的,經過這樣的 「迴歸測試」, 來保證本身實現的函數一直是正確的。(請看書中關於單元測試,迴歸測試的內容)在確認修改的功能正確以後再簽入代碼。
第三階段目標:經過測試程序和API 接口測試對於異常處理的支持。並能看到代碼覆蓋率。
若是輸入是有錯誤的,怎麼告訴函數的調用者「你錯了」?建議這個時候,咱們要定義各類異常(Exception),讓Core在碰到各類異常狀況的時候,能告訴調用者——你錯了!固然,這個時候,咱們一樣要進行下面的增量修改:
第四階段目標:圖形界面的實現。
咱們前面的練習都是基於命令行的,可否作成圖形界面呢?首先咱們要給每一個站點一個座標信息。
1)請修改beijing-subway.txt文件,加入適當的信息,爲實現圖形界面作準備。 你要如何設計這些座標呢?
2)請改進subway.exe,加一個-g的命令行參數, 讓它根據你提供的座標畫出各個地鐵站,線路,以及換乘站。
咱們看到,全部要展示的信息都要存儲起來,存儲還要有必定的規則,這樣程序纔好正確地,高效地讀出來。存儲有下面三個方案:
a) 用文本文件,自定義的格式存放
b) 用XML格式存放
c) 還能夠用數據庫的方式來存放,例如sqlite
d) 還能夠用本身定義的二進制的格式來存放
請比較幾種方式的優缺點,特別是,這些方式如何應對變化的內部,外部因素。 例如,在d)方案中,若是要增長一個地鐵站,或者修改一個地鐵站的名字,咱們應該怎麼作呢?
3)擴展subway.exe,使其在處理-g參數時,程序在圖形界面中不只能顯示地鐵地圖 (各個站點的相對位置和官方地圖相似便可)還能
a) 支持用戶選擇的出發和到達站點計算出最短路徑
b) 支持用戶設置偏好,是計算最短路徑仍是換乘最少的最短路徑
c) 根據用戶選擇的出發和到達站點和用戶偏好計算出最短路徑(或換乘最少的最短路徑)
d) 支持動畫展現最短路徑,用一個小亮點表示乘客,乘客正在通過的車站就會閃亮,乘客走過的路用不一樣的顏色標識,同時在適當的地方有數字代表乘客已經通過車站的數目
[附加題]第五階段目標:使程序支持不一樣城市的地圖。
請讓程序能處理上海的地鐵地圖,或者其它城市的地圖。把程序由 「固定處理一個地圖」 升級爲 「能處理多個地圖」, 程序的什麼模塊須要變化?
博客做業要求:
做業 |
博客要求 (寫1個博客,附加題的解法寫另外一個博客) 博客註明結對編程人員的名字/或學號後3位。 |
|
看教科書和其它參考書, 網站中關於結對編程的章節。例如: |
照至少一張照片,展示兩人在一塊兒合做編程的狀況。 說明結對編程的優勢和缺點。 結對的每個人的優勢和缺點在哪裏 (要列出至少三個優勢和一個缺點)。 |
|
看教科書和其它資料中關於 Information Hiding, Interface Design, Loose Coupling的章節
|
說明怎樣利用這些好的設計方法。 |
|
看 Design by Contract, Code Contract 的內容: |
描述這些作法的優缺點, 說明你是如何把它們融入你的做業中的。 |
|
看教科書中,網上有關 unit test 的內容 http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html
|
經過截屏顯示你是如何用VS的unit test 來保證你寫的類的質量的。顯示unit test 對你的寫的類(class) 的覆蓋率 |
|
閱讀有關 UML 的內容 |
畫出UML 圖顯示各個實體之間的關係 (畫一個圖便可) |
|
實現你的算法 |
說明你的算法的關鍵(沒必要列出源代碼), 以及獨到之處。
把你的代碼簽入到Github |