結對項目-地鐵出行路線規劃程序(續)

截止時間: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 模塊, 這個模塊至少在兩個地方可使用:架構

 

  1. 測試程序,這個能夠是一個命令行的程序,或者是JUnit 的框架,或者是Visual Studio單元測試的框架等。這樣,咱們在算法層級保證了這個模塊的正確性。
  2. 實際的軟件,這是交付給最終用戶的軟件,有必定的界面和必要的輔助功能。

 

那麼這個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在碰到各類異常狀況的時候,能告訴調用者——你錯了!固然,這個時候,咱們一樣要進行下面的增量修改:

  • 定義要增長什麼功能 - 例如:支持 「地圖格式錯誤」異常
  • 寫好測試用例,傳進去一個錯誤的輸入,指望能捕獲這個異常。 若是沒有,那測試就報錯。
  • 在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位。

 

看教科書和其它參考書, 網站中關於結對編程的章節。例如:

http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

照至少一張照片,展示兩人在一塊兒合做編程的狀況。

說明結對編程的優勢和缺點。

結對的每個人的優勢和缺點在哪裏 (要列出至少三個優勢和一個缺點)。

看教科書和其它資料中關於 Information Hiding, Interface Design, Loose Coupling的章節

 

說明怎樣利用這些好的設計方法。

看 Design by Contract, Code Contract 的內容:

http://en.wikipedia.org/wiki/Design_by_contract

http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

描述這些作法的優缺點, 說明你是如何把它們融入你的做業中的。

看教科書中,網上有關 unit test 的內容

http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html

 

經過截屏顯示你是如何用VS的unit test 來保證你寫的類的質量的。顯示unit test 對你的寫的類(class) 的覆蓋率

閱讀有關 UML 的內容

畫出UML 圖顯示各個實體之間的關係 (畫一個圖便可)

實現你的算法

說明你的算法的關鍵(沒必要列出源代碼), 以及獨到之處。

 

把你的代碼簽入到Github

相關文章
相關標籤/搜索