軟體構造 實驗回顧 Lab2

2021-09-24 16:37:58 字數 3103 閱讀 9808

第二部分:re-implement the social network in lab1

第三部分:playing chess

本次實驗訓練抽象資料型別( 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並據此設計測試用例。

這是mit的乙個實驗。

此處在實驗剛開始設計的時候測試,因為什麼方法都沒有編寫,所以測試裡邊的empty()方法即可。當時做這裡的時候,我和同學問了好久才明白。

1.在這裡,我們開始接觸各種注釋:af(抽象功能),ri(表示不變數),safety from rep exposure,mutable或者immutable。在編寫這些注釋的時候,要盡量清晰易懂,方便以後復用。

// abstraction function:

// vertices consists of all vertices in the graph; edges consists of all weighted edges in the graph.

// representation invariant:

// vertices != null; edges != null

// safety from rep exposure:

// use private final to prevent rep exposure

針對ri,編寫checkrep方法,使用斷言assert,在程式進行操作的時候時刻檢查ri的正確性。

public

void

checkrep()

2.在對某些物件進行修改或者刪除操作的時候,需要檢查這個物件是否有效。如果不檢查,可能會發生各種錯誤。而且當他們是存在list,set中的時候,如果找不到物件,集合本身不會返回「未找到」的資訊,使錯誤隱藏的更深。

if

(!vertices.

contains

(source)

||!vertices.

contains

(target)

)

// tostring()

@override

public string tostring()

4.設計測試用例的時候,盡量設計的簡單而又全面,測試到程式中各方法的各種分支,覆蓋絕大多數情況,這樣可以盡量觀察並定位adt內部錯誤,減少復用該adt的更大規模的程式在呼叫它的時候發生錯誤。

這裡邊沒什麼難點,把string都換成l就可以了。

但是有一點要注意,empty方法其實是後邊lab4編寫工廠方法的乙個伏筆(雖然這裡empty只有乙個選擇)。

這裡就是應用剛剛編寫的圖adt,進行乙個例項設計。思路還是很簡單的 :首先讀檔案,構造圖;然後根據有向圖,往句子裡插入單詞寫詩。整個檔案的核心,就是尋找被插入單詞的mid方法:

/**to find a two-edge-long path with maximum-weight weight among all 

* the two-edge-long paths from w1 to w2 in the affinity graph, use

* mid to find the midword.

* * @param str0 the source point's name

* @param str1 the target point's name

* @return the word to be inserted

*/public string mid

(string str0 , string str1)}if

(exist)}}

if(midwords.

size()

==0)return null;

else}}

return midwords.

get(0)

;}}

這次復用,person和main直接用就可以,只需修改friendshipgraph類,使其實現graph就可以了。而修改的重點,就是下面的計算舉例方法。

public

intgetdistance

(person a , person b)

dist++;}

if(q.

isempty()

)break

; i = personlist.

indexof

(q.remove()

);if(personlist.

get(i)

.equals

(b))

return dist;

}while

(true);

return-1

;}

設計board的時候,並不需要給圍棋和象棋分別設計兩個棋盤:對於圍棋和象棋,座標表示的分別是頂點和格仔;而且,只需設計乙個19x19的棋盤,然後將象棋對棋盤的訪問空間限制到0-7之間(在action中體現)就可以了。

測試檔案中,為了保證覆蓋度,只能插入手動測試(無奈),然而對於命令列程式來說,選單比較繁瑣,所以在測試的時候容易因為忘了進行到**而出錯,就只能重新來過,有時會有點小小的挫敗感。但是測試結果還是非常令人滿意的。

軟體構造 Lab2總結

af 抽象函式,代表值到其對應的抽象值的對映。ri 表示不變數,代表某個值必須滿足的條件。safety from rep expose 安全保證,描述adt如何防止表示暴露。checkrep 檢查表示不變數是否始終被滿足。可變型別 提供修改物件值的方法,存在表示暴露的風險,可採用防禦式複製保護可變型...

軟體構造 實驗總結2 Lab2

本次實驗訓練抽象資料型別 adt 的設計 規約 測試,並使用物件導向 程式設計 oop 技術實現 adt。具體來說 針對給定的應用問題,從問題描述中識別所需的 adt 設計 adt 規約 pre condition post condition 並評估規約的質量 根據 adt 的規約設計測試用例 a...

作業系統lab2實驗總結 Part2

沒有做出lab2 2 extra,後來發現其實是理論課的原題,甚至是我做過的。反思了一下,自己對於有些模糊的知識得過且過了,或者說只能夠做出一種題,沒有深刻明白它的原理,希望引以為戒。以前我對自對映的理解就是,有乙個4kb的頁目錄放進了4mb二級頁表中的乙個頁表中。現在發現有一些需要注意的問題 二級...