更多參考:http://www.javashuo.com/article/p-fgcthskj-da.html
http://www.javashuo.com/article/p-ovmgsvmj-cq.htmlhtmlUML順序圖http://www.javashuo.com/article/p-xnhtilmq-cb.html
UML狀態圖https://blog.csdn.net/w36680130/article/details/81014032java
經過StarUML和notepad++工具查看並總結程序員
UML將類(class)、接口(interface)、方法操做(operation)、屬性(attribute)等都視爲對象元素(UMLelement),UMLModel容器管理着模型的全部元素算法
UMLModel描述各類<UML***>類型元素及其關係(一種圖數據結構)……圖片來自同窗大佬編程
UML:接口能夠繼承接口,也能夠實現接口;
Java:接口能夠繼承接口,但不能夠實現接口。設計模式
B.attriCount = A.attriCount + B.self.attriCount (rule 1)
B.operaCount = A.operaCount + B.self.operaCount (rule 2)
關聯正常狀況下會有兩個end元素,都是AssociationEnd類別
navigable(關聯方向),reference同上,navigable爲false(未打勾)的時候表明指向類,爲true(打勾)時表明可被指向類
答案是確定的,子類擁有父類的全部關聯關係,類能夠自關聯,自關聯至關於兩次關聯
F.assoCount = D.assoCount + F.self.assoCount (rule 3)
緩存
實質上,UML層次已經顯示出來了,經過ref(隱式指針)和_parentId來鏈接各個樹結構造成森林安全
collaboration和Model同層次,Role與interaction(交互行爲)爲該順序圖的上層,擁有如下的交互對象,sequence,participant 參與交互的對象數據結構
功能:獲取參與對象數,獲取消息數,獲取對象的進入消息數多線程
每條生命線對應一個對象
UMLMessage的數量
接收到的消息數量
StateMachine和Model同層次
狀態圖表示一個類的行爲,功能:獲取狀態數,獲取狀態機轉移數,獲取後繼狀態數
UMLState元素,可直接得到狀態名稱
又是一個遞歸建圖的問題,經過該狀態UMLTransition元素查找
只要可達的狀態都算後繼狀態,注意處理同名同類型的狀態(有可能同名但不一樣類型)
UMLTransition元素,source&target
- triggers中的UMLEvent 表明轉移觸發條件,可從UMLEvent元素中得到轉移標誌名稱
具備UML檢查規則,即應當知足狀態圖自身、順序圖自身、類圖自身、三個圖之間的對應規則
UML基本標準預檢查功能
- UML002:不能含有重名的成員。針對類圖中的類(UMLClass),其成員屬性(UMLAttribute)和關聯對端所鏈接的UMLAssociationEnd不能有重名
- UML008:不能有循環繼承。該規則只考慮類的繼承關係、類和接口之間實現關係,以及接口之間的繼承關係。
- UML009:任何一個類或接口不能重複繼承另一個接口。該規則考慮類之間的繼承關係、接口之間的繼承關係,以及類對接口的實現關係,包括直接繼承或間接繼承。
實現一個UML類圖解析器UmlInteraction,能夠經過輸入各類指令來進行類圖有關信息的查詢。
查詢指令:模型中一共有多少個類、獲取類中指定類型的操做(本類本身定義的)數量、類中的屬性有多少個、類有幾個關聯、類的關聯的對端是哪些類、類的操做可見性、類的屬性可見性、類的頂級父類、類實現的所有接口、類是否違背信息隱藏原則。
UML交互接口的實現類MyUmlInteraction
* 經過className創建樹結構,每一個class對本身類進行相應的計算
* 經過className映射類元素
* 經過元素自身id映射元素(id不會重複的原則)
* 一個項目有一個Model容器,容器內有多個類、接口等
* 每一個class下有孩子元素,其中Operation元素下還有Parameter元素
* 每一個元素都有成員_parentId, _id, _type, name, type, visibility, direction, source(源),
* target(目標), reference(相關的兩個類,正常狀況分兩個end元素), navigable(關聯 方向)等property
本次做業的bug:並不保證輸入元素具備順序性,id是惟一區分元素的標誌,類和接口會同名(java中不一樣包內容許),父類和子類的屬性可同名不一樣可見性。
容易出錯:類實現的全部接口,包括接口的多繼承接口,包括同名不一樣id的接口也要列出來;繼承父類的關聯(父類也可能有繼承)。
大多數問題是對類圖層次分析不夠明確和完全,對mdj代碼和UML圖型的對應關係沒有理解透徹,形成不少考慮沒到位,或者理解錯誤的地方。
自己實現接口的類很少,只有一個實現接口的類,知足用戶查詢需求。但須要創建數據結構的類很是多,也是本次做業的重點,查詢功能的代碼不難寫,難在創建數據結構和UML層次關係的解析。只要創建好了數據結構,計算結果很容易得出。
經過樹和圖創建數據結構,經過遞歸或者dfs搜索計算,代碼深度和類圖層次關係較爲複雜。
在第一次做業基礎上,實現一個UML類圖、狀態圖、順序圖解析器UmlGeneralInteraction,能夠經過輸入各類指令來進行類圖有關信息的查詢,並可以支持幾個基本規則的驗證。
查詢指令:除第一次外還有:給定狀態機模型中一共有多少個狀態、給定狀態機模型中一共有多少個遷移、給定狀態機模型和其中的一個狀態,有多少個不一樣的後繼狀態、給定UML順序圖,一共有多少個參與對象、給定UML順序圖,一共有多少個交互消息、給定UML順序圖和參與對象,有多少個incoming消息、模型有效性檢查(針對下面給定的模型元素容器,不能含有重名的成員(UML002)、不能有循環繼承(UML008)、任何一個類或接口不能重複繼承另一個接口(UML009))。
UML交互接口的實現類MyGeneralInteraction
* 經過className等信息創建樹結構,每一個class對本身類進行相應的計算
* 經過className映射類元素
* 經過元素自身id映射元素(id不會重複的原則)
實質上,UML層次已經顯示出來了,經過ref(隱式指針)和_parentId來鏈接各個樹結構造成森林。
* 一個項目有一個Model容器,容器內有多個類、接口等
* 每一個class下有孩子元素,其中Operation元素下還有Parameter元素
* 每一個元素都有成員_parentId, _id, _type, name, type, visibility, direction, source(源),
* target(目標), reference(相關的兩個類,正常狀況分兩個end元素), navigable(關聯 方向)等property
1.計算狀態數量的時候初始和結尾狀態只算一個
2.一個StateMachine下保證只出現一個Region,且final和pre狀態都只做爲一個,且一個Machine中狀態不重名
3.若是初始或者結尾狀態是後繼狀態算
4.每一個State Machine中,從某個狀態到另外一個狀態的直接遷移均具備不一樣的Event或Guard,即從某個狀態到另外一個狀態的直接遷移如有多個,則這些遷移必定互不相同。
5.transition的parentid爲region,所以用source。
6.容易爆空指針以及遞歸棧溢出,沒有處理好遞歸邊界(循環繼承的例子)。
大多數問題是對類圖、狀態圖、順序圖層次以及規則分析不夠明確和完全,對mdj代碼和UML圖型的對應關係沒有理解透徹,形成不少考慮沒到位,或者理解錯誤的地方。
自己實現接口的類很少,有實現4個接口的類,在第一次做業上增長狀態圖、順序圖交互、規則檢查接口,知足用戶查詢需求。但須要創建數據結構的類仍然很是多,總共達到13個類,也是本次做業的重點,查詢功能的代碼不難寫,難在創建數據結構和UML層次關係的解析。只要創建好了數據結構,計算結果很容易得出。
模型圖增長了狀態圖和順序圖,範圍廣了,但創建數據結構的方法相似第一次。
面向對象設計的初步,剛開始還不太會運用面向對象思想編程,對於求導問題仍是很直接地寫面向過程的代碼。架構設計幾乎也沒有,很亂,沒有交互層面。一次做業僅僅3-4個類:表達式、主函數、求導、數據結構類。
多線程程序不只有數據結構類、輸入輸出類,還增長了與需求交互的類,還有多個線程併發的狀況——線程類,還有管理(調度)類。第二次做業逐步體現出抽象的過程,將需求和功能分別對應。
JML設計,在這次做業中主要是實現功能接口,也學習到了部分軟件工程設計模式(工廠化模式)。這個單元對類的抽象和封裝有更高的層次,咱們根據官方接口,實現本身的容器,用於用戶查詢等操做。在架構設計上,還增長了緩存計算層,將數據層與應用層獨立開來。
同第三單元相似,只是在數據結構層上增長了深度和難度,結構觀察視角和行爲觀察視角。設計模式和第三單元差很少,都有緩存計算層,實現接口功能的應用層則更好地體現了用戶需求與數據的交互,但不會影響數據結構層。
做業採用了迭代增量的方式每一個單元的三次代碼做業,都是基於本來功能進行擴展,增長更多需求和操做。
測試沒有太多技巧,主要是經過肉眼觀察表達式匹配的字符串,以及碰撞邊界特殊表達式的狀況,同時,手寫評測器瘋狂對代碼進行測試,雖然效率增長了,但很難保證測試範圍和測試質量。
本單元加入多線程,調試難度加大,甚至沒法用斷點調試以及找出死鎖問題。做業的調度算法增長了難度,須要考慮時間優化,因此邏輯上、優化上出現了不少問題。線程調度、線程安全是測試的重點,但測試方法沒有找到很合適的。對於輸出結果能夠利用對拍器自動比較。
經過學習JML語言後,運用jmlunitNG等工具編寫測試類進行代碼測試。這個單元的bug主要是第三次做業,需求增長到四個計算,顯然不少Bug,中測倒數第二個最後關頭都沒找出來,因此沒進互測,而後時間複雜度特別高,對於強側的數據,簡直爆炸了。
修復過程當中,改進了求最短路的算法,修復了超時的問題。對於最低票價和不滿意度是最容易存在Bug的,而對於並查集求解基本沒有問題。最低票價我採用上文的思路,仍會出現問題,有這幾種:單條路徑存在環路須要更新權值;每條路徑都須要求最短路;新增路徑與原有路徑存在相同節點也須要更新。
學習了UML模型圖以及運用starUml工具進行模型圖構建、生成mdj代碼,方便觀察和測試,同時可使用前幾回做業的測試方法和測試類。
學期剛開始,甚至還沒開學(還在家裏)的時候咱們就接收到本學期面向對象課程預習做業的通知,我也是本學期才接觸到Java編程及其面向對象編程思想,整體上的感受就是,這門課程讓我從一無所知變成學會了不少編程思想、測試、調試、架構設計、多線程、軟件工程設計模式等方法(不過我依然是一個菜雞)。那麼具體來講一下這門課程中個人收穫,以下:
一、熟練掌握Java語言及其IDEA編譯器的使用。雖然一個學期的時間很短,可是課程任務不是通常的重,而是超乎常人的重。每週都有相似於大做業、大工程的代碼項目,那就是必須在每週前三天較好、較快地完成代碼編寫、調試和經過基礎測試,在經過基礎測試後,接着兩天內進行同窗之間的匿名互測(互相hack,我學會如何作一名hacker哈哈),最後官方評測系統再根據較強測試進行評分,最後還有幾天的bug修復環節。除此以外,每兩週有一節上機實驗課和一節研討課,每一單元做業完成後對單元做業進行總結的博客編寫(例如如今寫的就是)。對於咱們來講,每週都是緊張的狀態,每週的代碼量也都充足,因此短短地一學期,可以熟練運用IDEA和Java面向對象設計是一大收穫。
二、我的的自學能力和思惟能力獲得提升。我我的(或者說大多數人)在這門課程的做業上花費的時間應該是最多的了,這門課程也是最燒腦、最磨時間的課程了。每一個人對程序、工程都有本身的獨立思考和轉化,能完成這些代碼量的程序說難不難,說易也不易,也挺佩服你們的毅力。
三、課程帶來了面向對象編程思想和軟件設計模式這些新編程方法。這些思想方法更貼近軟件的設計和用戶的需求,掌握多種設計方法,可以讓咱們(程序員)更好地應對客戶需求。一開始從面向過程編程到面向對象編程不免會有不適應,沒法理解類的封裝與獨立,熟練以後,以爲每一個功能、每一個類別的東西獨立開來,還能夠互相交互更方便設計。之間加入多線程則更是符合實際生活需求,生活中多線程的例子不少,滴滴打車,銀行排隊等,這些也在實驗課中完成過,多電梯多調度做業也編寫過。
四、掌握多種程序測試方法及其本身編寫評測器還有bug修復方法。寫程序固然少不了測試,誰的程序都避免不了出現bug,bug修復也是一個難題,甚至連bug在哪都有可能找不到。課程增長了同窗之間的hack,不只須要找本身代碼的bug也要構造測試用例找別人的bug,在此過程當中也學會了編寫基本的對拍器,自動評測器,加快hack效率和質量。在學會jml以後,還運用jmlunit等測試類工具進行測試代碼。bug修復不比寫代碼花的時間少,其實寫完代碼後發現連基礎數據都過不了很正常,如今的程序代碼複雜度高,肉眼沒法再觀察獲得了,只能經過調試、結果輸出、猜測斷定等方法找出bug。
五、如何在短期內寫出上千行代碼(哈哈哈,這多是程序員最驕傲的收穫了,一週內寫了上千行代碼,是又想吐槽又驕傲又禿頭~警告)。
我對本課程滿意度仍是挺高的,雖然確實折磨人,不事後來稍微下降了一點難度,內心暢快多了,以前的多線程單元確實頭疼,基礎測試都沒過。高強度、高難度才能訓練出好的工程師,這句話實測無錯。
提點建議: