OO第二單元總結

2022-06-24 15:00:16 字數 2874 閱讀 8601

第二單元總結

第一次作業

思路與反思

uml類圖

度量分析

耦合度

第二次作業

思路

第二次作業與第一次的迭代在於電梯增加、人數限制、樓層改變,我依舊用的look演算法,在第一次作業的基礎上修改細節即可,多部電梯要求實現執行緒安全,由於我使用的look演算法,電梯盲目執行,沒有更高階的排程,只需要在電梯開關門期間利用synchronized阻塞排程器,使用其中的共享變數來工作即可,五部電梯自由搶人。排程器中儲存了例如每層需要進入的人員、需要出電梯的人員、進入過電梯的人員等,使得電梯帶人方便自如。

uml類圖

度量分析

耦合度

第三次作業

思路

第三次作業的新內容主要為電梯型別的多樣和加入電梯的請求,電梯型別不同使得電梯可停靠樓層、轉移時間、最大載客量,根據可停靠樓層來分析直達與轉乘,依舊使用的是look演算法,將1樓作為換乘站,將電梯的特徵屬性作為電梯類的通用屬性,根據型別的不同給予不同的初值即可,與第二次作業類似,請求的完成時修改cnt必須是乘客到達目的地而非轉乘處,整個迭代過程並不困難,但是這種排程的效能極差,電梯一直在工作,十分費電。

uml類圖

度量分析

耦合度

程式bug分析

第一次作業強測bug是由於效能過低,將scan演算法改為look演算法即可

第二次作業強測bug是由於沒注意到16層,過於粗心

第三次作業強測wa兩個點,都是效能過低導致的,並且這些測試點都在極限時間邊緣瘋狂試探,有時這個點過了另外超時乙個新點,可能這就是多執行緒的魅力吧。互測被hack一次稍微修改排程提公升效能後直接修復了,這個bug我無法復現,感到十分迷惑......

前兩次作業都不小心使電梯在最初arrive時輸出了arrive1層,導致出現電梯原地tp的bug,在控制輸入請求時也經常出現問題,比如無法結束、兩個緩衝區、第三次作業兩種請求的分辨等。

尋找bug的策略

利用無時間戳的資料找bug,由於自己程式演算法十分簡單,bug多出現在條件控制跳出迴圈和細節處理上,我並沒有遇到很多多執行緒的執行緒安全問題,而對於這些能夠復現的bug,從輸出中很容易觀察出來問題所在。在尋找其他人的bug時,多用了自己曾經錯過的樣例。

可拓展性

第三次作業雖然在電梯型別上稍作考量,使電梯的屬性更加抽象,但是給每個電梯a、b、c都寫了乙個執行方法,並且根據type的不同在run方法中呼叫不同的電梯執行方法,這樣導致每次增加電梯的型別都需要新增執行方法。並且回頭看,這些方法的不同之處僅僅是根據不同的可停靠樓層來判斷到達樓層是否開門,絕大部分**是複製貼上的,因此這些方法完全可以封裝在run方法中。在迭代的過程中,沒有仔細思考程式的魯棒性,在排程器中有資訊的儲存,在電梯類中也有很多資訊的儲存,只考慮了程式設計過程的方便。電梯中一些陣列如儲存通過a類電梯可直達的請求也可以存在排程器中,這些不考慮設計的迭代將電梯本身也限制到排程器的一部分中。

心得體會

多執行緒是物件導向的全新版本,在接觸多執行緒初期遇到很多不可描述的問題,讓我感到十分灰心,但是自從我遇到了look演算法,讓我從谷底看見了翻身的機會,雖然我在這個單元的學習中幾乎在只追求正確性心理下完成了三次作業,但我覺得學習的過程還是很充實的。這個單元的遺憾就是處理多執行緒我居然只是使用了synchronized來阻塞和sleep來睡覺,乙個wait和notify都冇,效能分低的可憐,過程性的程式設計還隨處可見。這次通過討論區的學習以及向同學求助解決了輸入請求的兩個緩衝區的問題,在交流過程中談及我的離譜做法雖然低效能但是似乎很有趣,在交流過程中也體會到了一起學習的樂趣。這個單元我沒有重構,所以我沒有死亡,但是真的很鹹魚,希望我下個單元能翻一翻,但盡量別寫bug。求求了。

OO第二單元總結

本單元的作業總體來說比較愉快,畢竟不像上次一樣次次重構。本單元為電梯系列問題,涉及到多執行緒問題。簡單起見,我使用的是生產者 消費者模式。本次作業要求實現單部可稍帶電梯。看完題目後我認為生產者 消費者模式非常適合解決這個問題。本次電梯我採用的是look方法。本方法核心即在於電梯方向的判斷,這在dis...

OO第二單元總結

共享資料類 在總結後面的3.基於度量的程式結構分析部分,本人根據展示的uml類圖更加詳細的講解了具體的協同結構工作原理。通過對實現以上操作的共享資料類中的方法設定synchronized,從而實現執行緒對共享資料的訪問同步。ocplsp ispdip 根據以上類圖,分析本次作業設計思路如下 2 根據...

OO第二單元總結

第一次作業 1.設計策略 程式採用生產者 消費者模式,一共有兩個執行緒,乙個是主線程,主要負責輸入 另乙個是電梯執行緒,用來處理請求。此外,程式還有乙個核心 排程器,內建請求佇列和排程函式,相當於托盤。主線程不斷將請求輸入到排程器中,而電梯執行緒每完成 上樓 開門 出人 進人 關門 的一次迴圈就從呼...