哈工大软件构造Lab2
目錄
1 實驗目標概述··· 1
2 實驗環境配置··· 1
3 實驗過程··· 1
3.1 Poetic Walks· 1
3.1.1 Get the code and prepare Git repository· 2
3.1.2 Problem 1: Test Graph <String>· 2
3.1.3 Problem 2: Implement Graph <String>· 3
3.1.3.1 Implement ConcreteEdgesGraph· 3
3.1.3.2 Implement ConcreteVerticesGraph· 5
3.1.4 Problem 3: Implement generic Graph<L>· 7
3.1.4.1 Make the implementations generic· 7
3.1.4.2 Implement Graph.empty()· 7
3.1.5 Problem 4: Poetic walks· 9
3.1.5.1 Test GraphPoet· 9
3.1.5.2 Implement GraphPoet· 10
3.1.5.3 Graph poetry slam·· 10
3.1.6 使用Eclemma檢查測試的代碼覆蓋度··· 11
3.1.7 Before you’re done· 11
3.2 Re-implement the Social Network in Lab1· 12
3.2.1 FriendshipGraph類··· 13
3.2.2 Person類··· 13
3.2.3 客戶端main()· 13
3.2.4 測試用例··· 13
3.2.5 提交至Git倉庫··· 14
4 實驗進度記錄··· 15
5 實驗過程中遇到的困難與解決途徑··· 15
6 實驗過程中收獲的經驗、教訓、感想··· 15
6.1 實驗過程中收獲的經驗和教訓··· 15
6.2 針對以下方面的感受··· 15
本次實驗訓練抽象數據類型(ADT)的設計、規約、測試,并使用面向對象
編程(OOP)技術實現 ADT。具體來說:
針對給定的應用問題,從問題描述中識別所需的 ADT;
設計 ADT 規約(pre-condition、post-condition)并評估規約的質量;
根據 ADT 的規約設計測試用例;
ADT 的泛型化;
根據規約設計 ADT 的多種不同的實現;針對每種實現,設計其表示(representation)、表示不變性(rep invariant)、抽象過程(abstractionfunction)
使用 OOP 實現 ADT,并判定表示不變性是否違反、各實現是否存在表
示泄露(rep exposure);
測試 ADT 的實現并評估測試的覆蓋度;
使用 ADT 及其實現,為應用問題開發程序;
在測試代碼中,能夠寫出 testing strategy 并據此設計測試用例。
簡要陳述你配置本次實驗所需環境的過程,必要時可以給出屏幕截圖。
特別是要記錄配置過程中遇到的問題和困難,以及如何解決的。
實驗所需的環境在以前的學習中就已經配好。
在這里給出你的GitHub Lab2倉庫的URL地址(Lab2-學號)。
https://github.com/ComputerScienceHIT/HIT-Lab2-1190200704
請仔細對照實驗手冊,針對三個問題中的每一項任務,在下面各節中記錄你的實驗過程、闡述你的設計思路和問題求解思路,可輔之以示意圖或關鍵源代碼加以說明(但千萬不要把你的源代碼全部粘貼過來!)。
需要構造一個Graph,實現或完善規約要求的內容。以邊和點兩種方式實現接口,需要將String拓展為泛型L。實現ConcretEdgesGrap和ConcreteVertexGraph中接口中定義的各個函數。問題四中,根據文件輸入,如果相鄰兩個詞之間構成一條有向邊,從而構成一棵樹,再輸入給定的句子,若相鄰兩個詞之間有一個詞,則插入,有多個,則選取邊權重較大者。
從GitHub獲取該任務的代碼
在 powershell 下生成公私鑰, 復制生成的公鑰到 github
復制 github 倉庫的 ssh 地址, 在 intellij 中添加遠程到 github 倉庫
該部分就是將Graph.java接口中的empty函數修改為
如果想通過GraphStaticTest的話, 需要將ConcreteEdgesGraph.java中的vertices函數修改,我們將其補全,返回 Hashset()。
這一部分主要是要求我們分別基于邊為主和點為主來實現圖的存儲和基本操作。
首先設計edge類
edge類的成員變量如下所示
然后設計方法
方法如下:
Edge:利用傳入的參數創建一條新的邊
getSource:返回邊的源頂點
getTarget:返回邊的目標頂點
getWeight:返回邊的權值
checkRep:檢測edges里是否有重復元素
toString:按照指定格式打印邊
由于ConcreteEdgeGraph類需要實現接口Graph中的函數, 忽略empty函數,接下來便一一介紹并實現Graph接口中的函數:
1. add(L vertex) 函數
該函數的作用是向點集中加入一個點. 由于Set類型的性質, 如果向Set里加入重復的元素會返回false, 所以不需要查重, 直接返回set.add()的值即可
2. set(L source, L target, int weight) 函數
該函數規約很長, 作用也很多, 主要有四個作用:
(1) 如果輸入的點不存在且輸入的權值為正數, 則需要加點加邊并返回0
(2) 如果輸入的點存在邊不存在且輸入的權值為正數, 則需要加邊并返回0
(3) 如果輸入的點和邊存在且輸入的權值為正數, 則需要更新這條邊的權值并返回之前邊的權值
(4) 如果輸入的點和邊存在且輸入的權值為0, 則需要刪除該邊并返回之前邊的權值
3. remove(L vertex) 函數
該函數的作用是刪除該點以及以該點為起點或終點的邊, 具體思想就是遍歷edges, 如果edges里有邊以該點為起點或終點, 那么刪除該邊, 最后刪除該點
4. vertices() 函數
該函數會返回圖中的點集
5. sources(L target) 函數
該函數會返回圖中以target為終點的邊的起點source與邊的權值的映射關系(就是Map類型)
6. targets(L source) 函數
該函數會返回圖中以source為起點的邊的終點target與邊的權值的映射關系(就是Map類型)
對于Abstraction function:
由source,target,weight組成的抽象數據型表示從源頂點到目標頂點具有權重的有向邊
對于Representation invariant:
weight > 0 source和target不為空
對于Safety from rep exposure:
變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。
測試策略如下:
public String getSource() 返回邊的String類型的源節點
public String getTarget() 返回邊的String類型的目標節點
public int getWeight()? 返回邊的int類型的權值
public String toString() 返回一個字符串 格式如下:邊的源節點->邊的目標節點 權值為:x
進行測試:
運行測試全部通過
覆蓋率測試如上圖所示,覆蓋率為100%
如果想要用vertex來實現圖, 那么需要Java中的Map類型來存放與該點連接的點以及該邊對應的權值, 所以需要的參數不僅有點的標簽, 還需要有以該點為終點的邊的起點及邊的權值映射sources_map, 以及以該點為起點的邊的終點及邊的權值映射targets_map
首先設計vertex類
vertex類的成員變量如下所示
對于類的設計實際上與edge類似
Vertex:含參構造函數
checkRep:檢測頂點的name不為空或者””并且要求邊的權值>0
getName:獲取頂點名稱
getConnec:獲取頂點的邊集
remove:刪除某條邊
put:加邊或者修改權值
getWeight:獲取指定邊的權值
toString:按指定格式打印
對于Abstraction function:
代表有權值的有向邊中的源點
對于Representation invariant:
頂點名不為空或者””,邊的權值大于0
對于Safety from rep exposure:
變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象
測試策略如下:
public String getName(): 返回頂點的名字
public Map<String,Integer> getConnec():返回頂點的邊的情況(目標定點,權值)
public void remove(final String target): target頂點和該頂點間之前有邊相連 target頂點和該頂點間之前沒有邊相連
public void put(final String target, final int weight) 為頂點添加新的邊
public int getWeight(final String target) 獲得這條邊的權值,如果這條邊與該頂點相連就返回權值,如果邊不相連就返回0
public String toString() 返回一個字符串
進行測試:
運行測試全部通過
覆蓋率測試如上圖所示,覆蓋率為100%
將已有的兩個 Graph<String>的實現改為Graph<L>的泛型實現。
只需要將原本是String的地方改為L以及加即可
在ConcreteEdgesGraph和ConcreteVerticesGraph都用泛型實現后,重新跑測試
運行測試全部通過
覆蓋率測試如上圖所示,覆蓋率為100%
首先選擇ConcreteEdgesGraph 作為返回對象實現Graph.empty()函數:
然后進行測試,分別嘗試label為long的情況和label為double的情況
進行測試:
運行測試全部通過
覆蓋率測試如上圖所示,覆蓋率為100%
這個問題一部分是用給的語料生成圖,相鄰的單詞間用一條有向邊連接,另一部分是給定一個輸入字符串,通過在圖中判斷它們之間是否有bridge來對字符串進行擴充。
構建文本, 輸入一串文字, 如果兩個詞之間存在一個詞, 就會添加到其中,若存在多個, 選擇權值最高的. 但需要注意的是, 若兩個詞之間沒有這樣的路徑(即中間詞的sources(起點)不包含第一個詞或中間詞的targets(終點)不包含第二個詞)的話, 則不添加詞
測試策略如下:
對于構造函數:
1、傳入不存在的文件
2、傳入的文件為空
3、傳入的語料文件只有一行單詞
4、傳入具有多行的語料文件
對于poem函數:
1、傳入的字符串為null
2、傳入的字符串!=null,但只有一個單詞
??? 3、傳入的字符串!=null,不止一個單詞(還可以再設計根據權值選bridge的情形)
對于toString函數:
1、graph為空
2、graph不為空,但沒有邊
3、graph有頂點有邊
對于變量graph
對于構造函數
關于GraphPoet函數:
將文件輸入按行讀入,按空格分開,讀取每個字符串,調用Graph類建立一個有向帶權圖。
關于poem函數:
?????? 在輸入的字符串中添加bridge word,根據Graph類中的source和target函數進行判斷,若前者的target和后者的source有重合,讀取最大權重的邊作為bridgeWord加入。
對于Abstraction function:
將文本文件轉化成有向圖,圖的頂點就是文件中的單詞,相鄰單詞在圖中對應的頂點間有有向邊
對于Representation invariant:
圖中的頂點不為空或者"",邊的權值要大于0
對于Safety from rep exposure:
變量都由private和final關鍵字修飾,類中并沒有定義set方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象
進行測試:
運行測試全部通過
覆蓋率測試如上圖所示,覆蓋率為100%
節選均出自Edgar Allan Poe的Annabel Lee
輸入字符串為” angels heaven”,擴充后的結果為” angels in heaven”
進行測試:
運行測試通過
覆蓋度都是100%
請按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的說明,檢查你的程序。
如何通過Git提交當前版本到GitHub上你的Lab2倉庫。
git add *
git commit -u “”
git-push –u origin master
在這里給出你的項目的目錄結構樹狀示意圖。
這個任務主要是重新實現 Lab1 中的 Social Network,利用在P1中已經寫好的 Graph<L>接口來實現,盡量重用已有的函數。
成員變量Vertex:
用來保存圖中的各頂點。
對于addVertex方法:
使用 Graph<L>里面提供的函數 add,即可實現增加頂點的功能。如果頂點名重復,打印錯誤信息,程序直接退出。
對于addEdge方法:
利用 Graph<L>里面提供的函數 set,即可實現增加頂點的功能,不過要先判斷兩個頂點是否相同。如果頂點名重復,打印錯誤信息,程序直接退出。
對于getDistance方法:
利用BFS算法來求兩個頂點之間的最短距離。
對于Abstraction function:
代表圖中頂點
對于Representation invariant:
頂點之間不能有相同的name
對于Safety from rep exposure:
變量都由private和final關鍵字修飾,只使用了get方法,成員變量都不能從類外部獲取或者賦值,保證了數組不會外泄。函數返回時創建一個新的對象
利用 Lab1 中已有的 main 客戶端即可。
測試策略如下:
1.空圖的測試
2.僅有頂點的圖的測試
3.復雜圖的測試
開始測試:
測試全部通過
代碼覆蓋率為100%
如何通過Git提交當前版本到GitHub上你的Lab3倉庫。
git add *
git commit -u “”
git-push –u origin master
在這里給出你的項目的目錄結構樹狀示意圖。
總結
以上是生活随笔為你收集整理的哈工大软件构造Lab2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何转行产品经理
- 下一篇: 尔宾团队角色(Belbin Team R