一、實現規格的設計策略:
1. 基於規格,設計方法
大部分需要我們寫的方法,都可以根據規格直接寫出來,這些方法一般都是比較簡單的,比如查詢有沒有這個元素、返回某個元素、增加或刪除某個元素。
2. 根據規格,了解方法功能,自行設計方法
規格怎麼描述,方法怎麼寫也是可行的,但是了解了方法功能,自行設計會更快,比如
iscircle
這個方法,就是查詢兩者是否能通過有限次查詢找到對方,如果按照規格描述實現該方法,就會每次查詢都逐個尋找,方法本身非常的慢,而了解該方法功能後,設計乙個並查集就會很快實現。
3. 選擇容器
我容器選擇了
arraylist
(主要是就會用這個),這個在增加刪除的時候很方便,其實還可以用
hashmap
,查詢的時候會很方便。
4. 使用演算法
我在這裡就使用了並查集和
spfa
,並查集的話要注意壓縮路徑,
spfa
沒想到什麼好的優化。
5. 異常處理
建立相應的異常類,按照後置條件丟擲相應的異常。
二、基於
jml規格來設計測試的方法和策略
這邊沒有什麼太好的測試方法和策略,主要是根據
jml規格的描述去寫**,照貓畫虎還是比較容易實現的,然後比較難的就是理解後自行設計的**,這部分容易出問題,大都是強測出問題後,根據出問題的指令去尋找
bug。
三、容器的使用和選擇
個人使用陣列和
arraylist
,主要是比較熟悉,
arraylist
在特定位置插入、特定元素刪除非常方便,而這三次作業都很經常用到插入刪除,我就選擇了
arraylist
,但是看別人的實現,貌似
hashmap
更方便……,然後陣列使用那邊就與我個人習慣密不可分了,之前學習演算法的時候一直使用陣列,然後寫並查集和
spfa
都習慣性的選擇了陣列。
所以我的容器使用與選擇的方法比較直觀,就是個人熟練度和一丟丟的方便。
四、效能問題
1. 容器使用問題
使用的是
arraylist
,每次都是通過遍歷實現查詢,當資料變多,這種查詢就會顯得很慢。
2. 演算法問題
比如iscircle
沒有想到用並查集,而是使用搜尋,就會很慢。
然後就是求年齡平均值、方差等,可以先存一下之前的和,每次有變化的時候再改變這個和,就會快一些。
五、作業架構
以第三次作業為例,我的異常以及類完成如上,類中的方法就是按照規格中有的實現的。
在設計的時候,我是按照
person->message->group->network
設計實現的,就是從容易到複雜,先實現基礎的,後續設計
network
的時候就能使用之前設計好的方法了,會相對容易一點。
我的圖模型設計設計比較簡單,就是根據人與人之間認識與否來連線建立聯絡,由線連在一起的一群人構成乙個塊(使用並查集實現),查詢是否認識時,看有沒有線,查詢是否能通過有限的人認識時就看在不在乙個塊。維護也比較簡單,線的維護就是建立關係的時候連線,通過
acquaintance
陣列新增新元素實現,塊的維護就是並查集的常規維護。
OO第三單元總結
理論基礎 jml是用於對j a程式進行規格化設計的一種表示語言 注釋結構 jml以j adoc注釋的方式來表示規格,每行都以 起頭。有兩種注釋方式,行注釋和塊注釋。其中行注釋的表示方式 為 annotation,塊注釋的方式為 annotation 按照j adoc習慣,jml注釋一般放在被注釋成分...
OO第三單元作業總結
在起初剛學習完jml規格語法的時候,由於對jml規格不夠熟練,我選擇了讓自己的 與規格 基本保持一致來完成作業。意思是,jml使用陣列實現,我也會使用陣列實現 jml使用兩層for迴圈實現,我也會使用兩層for迴圈實現。並且,我選擇了每讀乙個方法的jml,就完成乙個方法。顯然,這樣的策略不會讓我產生...
北航OO第三單元總結
本單元作業為jml規格的學習與應用,要求我們在閱讀jml規格之後實現出完全符合規格要求的方法。當然在完成作業之前我又需要從0開始學習jml規格,但好在jml的入門難度並不大,短短幾個小時後就可以讀懂作業中的jml規格了。而其實規格就像是乙個指導你具體實現方法的說明書,它會為你指定這個方法的前置後置條...