軟件構造Lab2筆記+心得

**

軟件構造Lab2筆記+心得

**
Lab2主要訓練ADT的設計、規約以及測試。

ADT中的幾個基本概念:
**表示不變量(representation invariant)😗*指的是該ADT的表示永遠應該具備的性質,就比如說設計一個三角形的ADT,三條邊、內角和180度都應該成爲該ADT的表示不變量。這個概念在衡量該ADT的固有屬性。

**抽象函數AF(Abstraction Function):**ADT應當實現一種功能,完成由計算機取值所組成的表示空間到ADT的外部表示間的映射,即設計某個ADT的目的是爲了表達現實中的某個客觀物質(可以是某個物體,可以是某種種概念,可以是某種邏輯),也就是說ADT是爲了表示現實,但是期望表達的現實的和計算機內部表達空間並不一致,ADT的設計者應當在ADT的內部完成由計算機空間到現實空間的映射,可以不是單射,但務必是滿射。

**表示泄露(rep exposure):**ADT內部設計的數據域和方法應當具有某種權限,某種角度上來說,我們只希望通過該ADT的方法來修改該ADT內部的數據,使用不可變類型是良好的選擇,設置訪問權限也是良好的選擇,使用防禦式拷貝也是良好的設計,總之,我們不希望類的外部可以直接修改數據,如果外部可以直接修改數據,那麼就發生了表示泄露。良好的ADT的設計不應該發生表示泄露。
由於這三個概念非常重要,我們需要在ADT內部顯示的文檔化這三個概念。

再來看看一點點小心得。
1.儘量不要將可變類型置於Set集合中,這會使得Set的行爲不可控。
2.在ADT的設計時,儘量重寫equals()和hashCode()方法,避免比較相等出錯和使用其它數據結構出錯。
3.繼承雖然很有用,但是我們需要注意,不要處處繼承,相比於繼承,組合也是一種很好的設計ADT的方法。
4.在設計類的時候儘可能設計成不可變類。

最後再結合我的設計分析一下具體的任務。

P1.Poetic Walks
這個部分我覺得有如下難點:
1.理解MIT的實驗要求
2.忠實於設計規約的實現:
在規約中說,實現有向的、帶權的、帶標籤的可變圖,可能我們會不自主的忽略有從自身到自身的邊的圖,可規約沒說不要有這樣的圖啊,事實證明,在GraphPoet .java中確實需要這樣的圖。
3.實現對接口的測試:
我覺得這個更多的是心理上的障礙,不要覺得這是一個新的技術,這樣的測試也同樣是基於規約的測試。
P2.FriendShipGraph
這個任務我覺得是P1的延續,應用P1的圖數據結構實現。
P3.Playing Chess
1.面對大規模任務,會有無從下手的感覺
別慌 淡定 喝口茶 吃包辣條
分析底層ADT,自底向上一步步實現設計
比如Position應該是最基本類,然後是Piece等等
2.對於每個ADT,彆着急實現,先寫規約,寫測試,再實現,測試驅動編程很有好處的。
3.分析表示和實現間的差異,棋盤和用數組表示的棋盤間存在着映射關係,要找到客戶端棋盤和內部棋盤間的這種對應關係,這也更提醒我們,要站在不同的角度考慮問題。
具體的映射關係如下:(不同設計可能不同)
外部座標:(x1,y1),內部座標(x2,y2)
y2 = x1;x2+y1=size(數組大小-1)
4.如何確保玩家交互操作
可以利用略帶隊列思想的做法,玩家1玩完,玩家2入隊;玩家2玩完,玩家1入隊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章