1. 程式人生 > 其它 >軟體構造Lab2實驗總結

軟體構造Lab2實驗總結

       本次實驗訓練抽象資料型別(ADT)的設計、規約、測試,並使用面向物件程式設計(OOP)技術實現ADT。具體來說內容如下:

針對給定的應用問題,從問題描述中識別所需的ADT;

設計ADT規約(pre-condition、post-condition)並評估規約的質量;

根據ADT的規約設計測試用例;

ADT的泛型化;

根據規約設計ADT的多種不同的實現;針對每種實現,設計其表示(representation)、表示不變性(rep invariant)、抽象過程(abstraction function)

使用OOP實現ADT,並判定表示不變性是否違反、各實現是否存在表示洩露(rep exposure);

測試ADT的實現並評估測試的覆蓋度;

使用ADT及其實現,為應用問題開發程式;

在測試程式碼中,能夠寫出testing strategy並據此設計測試用例。

       本實驗分為兩個部分,每部分的難點以及要點如下:

       1.第一個實驗是從頭設計一個Graph,重難點在於對每種實現的表示,不變性以及抽象過程。另一個需要注意的點是在實現方法之前需要先寫測試用例和測試策略,這樣在具體實現不同方法的時候就可以對各種可能的輸入空間進行劃分,從而使程式碼實現更加具有可擴充套件性以及模組化。測試用例和測試策略注意要對所有可能的輸入進行覆蓋,用笛卡爾覆蓋的方法劃分輸入空間可以保證輸出樣例全覆蓋。然後根據測試策略寫能夠覆蓋每種情況的最小集合的測試。

       然後實現以邊為主的圖形和以點為主的圖形,其中重點在於對兩種不同的實現方法,我們對資料結構和方法的設計也不同。以邊為主的方式是每個邊用起點,終點,權重表示,然後和點集一起構成圖形的實現。至於方法的具體設計如下:

ConcreteEdgesGraph需要實現Graph的6個函式,還要完成一個toString函式。

add函式:set集合中的add方法剛好可以保證加入不重複的點,所以直接使用即可。加入成功返回true,不成功返回false。

set函式:以權重大於0,小於0,等於0分別進行討論。小於0直接輸出錯誤資訊;等於0看點存不存在,不存在就不用管,都存在且有邊的話就刪掉邊;大於0的話就加點加邊,邊存在的話就改值。但Edge類是immutable的,所以只能刪掉原來的edge,再新建一個edge。

remove函式:點集裡刪除點,邊集裡把相關邊也刪掉。

vertices函式:返回set集合vertices即可,但為了外面的人不能呼叫,新建一個集合返回即可。

sources函式:找所有target是輸入的邊,然後把source和weight加到新建的map裡返回即可。

targets函式:找所有source是輸入的邊,然後把target和weight加到新建的map裡返回即可。

toString函式:把圖的所有點和邊按順序輸出即可,格式規範就好。

       以點為主的圖形設計類似,只是點的實現關鍵在以點為主,所以存邊的方式可以用Map,當然這兩個量為了防止洩露,還是使用private final格式。以點為主的話,我們需要做的就是存點的標記(現在是String),然後邊的話就是用Map,存target和權重。

       然後用泛型L代替String,只要對每個相關函式和方法加個標籤就可以了。然後實現Graph也很簡單,用以邊為主的圖形和以點為主的其中一個新建就可以了。經過測試,覆蓋率很高,結果也都是正確的。

       2.第二個實驗是重新實現Lab1的FriendshipGraph函式,用這次的Graph來實現。改程式碼的難度很小,因為方法是固定的,主要難點在於對FriendshipGraph函式的每種實現的表示,不變性以及抽象過程。還有測試用例也要補充測試策略,並根據測試策略的結果進行測試樣例的編寫。其他都不算特別難,所以總的難度不算很大。

       以上就是我總結的本實驗的要點,希望對大家有所幫助。