本單元作業由於設計架構已經基本規定好,只需要實現部分介面的功能即可,所以歷次作業的實現幾乎相同,都遵循以下幾個步驟:
閱讀指導書,先大體梳理一遍需要實現的是哪些部分
閱讀jml整體規格,關注當前介面對應的類需要維護哪些屬性以及該類的規格大小,並大體閱讀一下有哪些方法以選擇適當的容器
細讀jml規格,先實現一些容易實現的類,如person
,message
和異常類,再實現group
,network
等相對較難實現的類
由於筆者個人對於junit測試方法的理解與使用並不到位,難以寫出十分合理的單元測試框架。
因此筆者只根據jml規格對個別相對重要的方法編寫了相應的測試方法進行了功能性弱測,測試了queryblocksum
,iscircle
,querygroupagevar
,deletecoldemoji
和sendindirectmessage
這幾個方法。
筆者本次單元測試主要採用了黑盒測試方法。
一是通過隨機生成樣例然後對拍以進行測試,將自己程式的輸出與他人程式輸出進行對比以確保沒有出現功能性錯誤。
二是有針對性地構造了一部分極端資料,用以驗證自己的程式不會出現ctle的情況。
本次作業中筆者主要使用了arraylist
和hashmap
這兩種容器,在實現並查集的堆優化時,還使用了優先佇列priorityqueue
。
該方法用於查詢兩節點之間是否聯通。如果採用深度遍歷或廣度遍歷演算法,在處理當前圖為一條長鏈,且查詢節點為最兩端的結點時,執行時間則會比較漫長。
故此處採用並查集,在加關係時將兩不同塊進行合併,且內建find
方法用於查詢當前節點所對應的根節點,且在查詢過程中實現路徑壓縮優化。使用時直接返回find(id1) == find(id2)
即可。
該方法用於查詢當前圖中的連通塊的數量,如果採用普通的遍歷演算法,則執行時間會更加漫長。
優化方法同上,採用並查集實現。查詢時只需查詢當前圖中並查集的數量即可,複雜度可降低到o(n)(也可以在類中快取block,將複雜度降低至o(1))。
求乙個區域性圖中所有邊的權重之和。
該方法如果直接按照規格中所採用的二重迴圈的方式,複雜度則會上公升至o(n^2),當輸入資料中包含很多q**s
指令時就會出現ctle。
優化方法即內建屬性valuesum
,在加人刪人時進行單次迴圈對valuesum
進行修改。同時,也要注意在加關係時要對valuesum
進行修改,故可以提供public
方法addvalue
,當network
中加關係時便可呼叫addvalue
方法對valuesum
進行修改。
求乙個群內所有人的年齡的平均值與方差。
這兩個方法可以直接按照規格中所採用的一重迴圈的方式,經本地測試應該也不會出現ctle
的情況。
當然也可以進行一些優化提公升執行速度,可以內建屬性儲存年齡和與年齡的平方和。當在group
內進行加人或刪人操作時可以直接對這兩個屬性進行修改。返回時利用數學公式稍加計算即可。
該方法內部需要查詢兩節點之間的最短路徑。
經本地測試,直接採用常規的dijkstra
演算法在強測資料規模下有一定概率會出現ctle的情況。
優化方法即使用堆優化的dijkstra
演算法。
在儲存方面,新建node
類繼承comparable
介面,用於儲存某節點與其他結點之間的距離以及該節點的編號,並重寫其中的compareto
方法。使用priorityqueue
來儲存其中的結點。
大部分的操作與常規的dijkstra
演算法相同,在獲取當前最短路徑對應的節點時只需要取出priorityqueue
的頭節點即可,同時在儲存新的路徑時只需要將其直接壓進優先佇列中,並不需要判斷新節點的編號是否已經在堆中存在。
由於本次作業已經給出了總體架構,且對於所需要實現的類有及其清晰易懂的jml規格描述,因此在類的設計與實現上並不需要過多考慮。
圖的構建與維護在實現規格所提供的方法的基礎上,額外增加了並查集,用於實現對qci和qbs這兩條指令的效能優化。
在個人實現**中物件導向思想的體現,似乎只在於實現了乙個並未在要求中的node
類,其次就是各個具體的message
的實現是通過繼承自己實現的mymessage
類,利用super
方法來簡化子類實現。
BUAA OO 第三單元總結
一句話概括一下就是 先理解再動手,先實現再優化。首先肯定是要仔細閱讀所提供的jml規格,充分理解規格的作用和其需要完成的任務,在動手之前也先想好要用到什麼內容 選用什麼容器啦,要用什麼資料啦,需不需要修改原本的資料等等 這一點無可厚非。第二步就是先試著動動手,暫不考慮效能以及該規格與原有內容之間的內...
BUAA OO 第三單元總結
本單元主要學習根據課程組提供的介面中的jml規格,實現自己的方法。jml是一種形式化的 面向j a的行為介面規格語言,起初會比較陌生,但是在熟悉後還是比較直白易懂的,而且比較直接也非常詳細地給出了思路,當然了,本次作業中有許多處的容器和資料結構是需要自己設計和優化的。這也是三次作業主要的工作量。不過...
BUAA OO 第三單元總結
本次作業中的規格實現我採取了巨集觀到具體 增量修改 改不了就重構 的策略,大致進行以下幾個步驟。1.首先瀏覽整體某個類中所儲存的資料和需要實現的方法,梳理方法的大致含義以及方法與資料儲存之間的關係。2.找到幾個比較複雜 一般是jml很長 的方法,現根據規格給出的方法大體實現一遍,計算複雜度。3.若複...