af:抽象函式,代表值到其對應的抽象值的對映。
ri:表示不變數,代表某個值必須滿足的條件。
safety from rep expose:安全保證,描述adt如何防止表示暴露。
checkrep():檢查表示不變數是否始終被滿足。
可變型別:提供修改物件值的方法,存在表示暴露的風險,可採用防禦式複製保護可變型別。
不可變型別:指定引用位置後不可改變。
final宣告的類不可被繼承;
final宣告的變數,其值和引用不可被修改;
final宣告的方法不能被子類重寫。
在物件導向程式設計中,封裝是不可缺少的一部分。
所謂封裝,就是盡可能隱藏物件內部細節,僅保留有限的介面和方法與外界進行互動,從而減少表示暴露的可能性,而方法規約則充當了該防火牆的功能。
封裝原則:使物件以外的部分不能隨意訪問和修改物件的內部屬性,從而避免了外界對物件內部屬性的破壞。
可以通過對類的成員設定一定的訪問許可權,實現資訊隱藏,比如將類的字段設定成private和final等。
雖然本次試驗未要求**覆蓋度,但是為了測試的全面性也考慮了這方面的影響。
在checkrep()中直接使用assert會導致測試**覆蓋度較低,因為assert相當於分支語句,如果滿足表示不變數,則繼續執行測試,如果不滿足,則直接結束程式,因此為了保證測試通過,只能測試符合表示不變數的情況,也就不可避免地導致分支中有一半情況是未被測試到的。
解決這個問題可以將斷言改為在checkrep()中丟擲異常,在測試中捕捉異常,從而大大地提高了**測試覆蓋度。
例:
public
player
(string name)
catch
(exception e)
}
修改後測試結果:
鑑於實驗報告中已給出基本類的名稱,在此不再贅述。
position為乙個不可變類,僅實現封裝座標的功能。
piece為乙個可變類,將所屬棋手與棋子位置相關聯。
由於可以設定棋子位置,因此在獲得棋子位置時採用防禦式複製。
player為乙個可變類,設定棋手資訊,管理棋子的所屬情況,並且記錄該棋手操作歷史。
由於可以設定棋子所屬情況,因此在獲得棋子集合時採用防禦式複製。
board為乙個可變類,初始化特定n*n棋盤,並且管理棋盤上的棋子。
由於可以管理棋盤上的棋子,因此在獲得棋盤時採用防禦式複製。
action為乙個不可變類,主要實現四種下棋方式,分別為落子、提子、移子、吃子,同時涉及前四個adt,管理棋盤上棋子情況和棋手擁有的棋子情況。
game為乙個可變類,是對上述五個adt的綜合,負責初始化棋盤、棋手,實現四種下棋方式以及檢視棋盤占用情況。
由於可以設定棋盤和棋手,因此在獲得該三類資訊時使用防禦式複製。
主程式主要功能有兩方面:
顯示互動介面;
依據使用者輸入選擇功能。
選單如下:
軟體構造 實驗回顧 Lab2
第二部分 re implement the social network in lab1 第三部分 playing chess 本次實驗訓練抽象資料型別 adt 的設計 規約測試,並使用物件導向 程式設計 oop 技術實現 adt。具體來說 針對給定的 應用問題,從描述中識別所需adt 設計 adt...
軟體構造 實驗總結2 Lab2
本次實驗訓練抽象資料型別 adt 的設計 規約 測試,並使用物件導向 程式設計 oop 技術實現 adt。具體來說 針對給定的應用問題,從問題描述中識別所需的 adt 設計 adt 規約 pre condition post condition 並評估規約的質量 根據 adt 的規約設計測試用例 a...
作業系統lab2實驗總結 Part2
沒有做出lab2 2 extra,後來發現其實是理論課的原題,甚至是我做過的。反思了一下,自己對於有些模糊的知識得過且過了,或者說只能夠做出一種題,沒有深刻明白它的原理,希望引以為戒。以前我對自對映的理解就是,有乙個4kb的頁目錄放進了4mb二級頁表中的乙個頁表中。現在發現有一些需要注意的問題 二級...