隨着第四單元UML第二次做業的結束,本學期的OO學習也宣告結束了(但還得寫博客),下面就對本單元和本次做業作一個總結。python
第四單元兩次做業的架構設計算法
本單元是對UML的結構進行解析,第一次做業是對UML類圖的解析,主要的難度是UML各類元素之間較爲複雜的從屬以及其餘關係。個人類圖設計以下:編程
我本身建立了ClassModel類來統領兩個子類ClassClass和InterfaceClass,分別表明類和接口,其中實現了添加、儲存、處理類和接口的各類下設參數的方法和變量,讓類和接口的類繼承同一個父類很是重要,由於類和接口有不少類似的地方,再進行輸入處理時也有不少不易區分也不用區分是類仍是接口的狀況,因此這樣處理極大地方便了程序對這兩個類地儲存和管理。對於方法我建立了OperationClass來添加儲存和管理方法的各類屬性,而後ClassClass和InterfaceClass就只用儲存和管理OperationClass便可,對於其餘的屬性因爲沒有更多的層次,因此就直接使用接口提供的UML類來進行儲存和管理便可。安全
在進行輸入處理的過程當中,因爲其結構的層次性,應該將各類屬性的UML_ELEMENT分批來處理,我首先識別處理了UML_CLASS,UML_INTERFACE,UML_OPERATION, UML_ASSSOCIATION_END, 以後再將剩餘的其餘屬性進行識別處理,這樣再識別時就能夠直接創建起各類元素之間的邏輯結構。在儲存中我主要使用了HashMap結構,進行從id到類,從name到類等的映射。bash
對於各類指令的處理方法,有難度的主要分爲兩類,一個是須要考慮關聯關係的指令,對它的處理比較直接,在每一個ClassModel類中均有其關聯的類或接口的引用,直接訪問便可獲得所須要的信息。更復雜的是須要考慮繼承關係和實現關係的指令,對於繼承關係須要考慮多重的繼承,因此咱們使用遞歸來處理,其中Information類就是建立用來在遞歸時在類與類、接口與接口之間傳遞信息的,咱們任意從某一個類開始,逐層向上,利用遞歸來實現與繼承和實現有關信息的統計,儲存在information裏,再逐層向下傳遞。一次遞歸結束後,再找一個沒有經歷過遞歸的類開始遞歸,直到全部地類和接口都經歷過一次遞歸爲止。多線程
第二次做業在第一次做業的基礎上增長了狀態圖和順序圖的解析,以及對類圖合法性的判斷。在這裏要感謝老師和助教們手下留情,最後一次做業的難度要比我想象中簡單不少,特別是最後加了不少數據限制之後,整個問題變得很簡單。架構
總體架構如上,對於順序圖創建一個Interation類來儲存和管理對應的信息,對於狀態圖類創建一個StateMachine類來儲存和管理對應的信息,相比類圖簡單不少,想法也很天然。單元測試
那麼本次的難點主要在於類圖合法性的檢查,相似對類圖的處理,咱們按照層次順序依次識別和創建各元素之間的關係,但不須要用到其餘的類,只須要根據要求按照id和name創建關係便可。第一個檢查較爲簡單,只須要遍歷查看attribute和Association End有沒有重複便可。對於第二三個檢查,先將類繼承,類實現接口,接口繼承造成一張id爲結點的有向圖,那麼第二個檢查就是在有向圖中找圈,具體地可使用強連通份量等算法,但因爲這裏點比較少,因此咱們對每一個點跑一遍較爲樸素的每一個點只可到達一次的dfs便可,若能夠回到本點,則將該點加入異常結果中。對於第三個檢查,在第二個檢查檢查已經無圈的狀況下,找任意兩點之間有沒有多於一條路經能夠到達的狀況,如有,那麼起始的點就重複繼承,具體地一樣也是對每一個點使用較爲樸素地dfs,若在dfs中訪問了某個點兩次,那麼這個起始點就加入到異常結果中。學習
四個單元中架構設計及OO方法理解的演進測試
在最開始的第一個單元,明顯地本身仍然是面向過程的思惟,當時應用熟練的只是Java的語法,而不是Java面向對象的思想,第一單元的第一次做業好像就只使用了一個類來完成了全部的事情,在第二次做業中讓本身多分出了幾個類,但仍然不夠靈活和天然,更多的是爲了劃分而劃分。
到了第二個單元,有了前面一個單元三次做業的練習,本身有所進步,開始從面向對象的思路開始思考,本身所處理的問題有哪些對象可使用,他們之間又有哪些關係,但第二單元的重點我認爲是在線程的設計和處理上,根據線程的理論,類的劃分也就比較天然,但也是讓我感覺到了面向對象的便利。
在第三單元之中,是根據JML來寫代碼,更多地是在助教們設計好的架構下來補充代碼,雖然沒有太多的本身的設計,但這也是一個學習的過程。到了第四單元,對面向對象的理解應該已經有了比較高的進步了,能夠從問題涉及的對象入手來分析問題,能夠很天然地想到一個比較好的架構,並實現它。
四個單元中測試理解與實踐的演進
第一個單元最開始本身測試的方法仍是比較原始,主要是本身手動構造一些邊際數據來進行測試,肉眼來看結果的正確性。在後面因爲表達式難度的加大,肉眼很難分辨正確與否,因此我和幾位同窗一塊兒用python來對拍,答案相同則認爲正確。
第二個單元是多線程,在第一次做業中我吃了手動輸入的虧,因爲本身手動輸入的速度太慢,因此基本上不會形成線程安全問題,因此隱藏了不少問題。因此以後我使用了bash批處理和Python來實現了自動生成輸入,自動按時輸入和檢查輸出的合法性,大大加快了檢查效率,也使得在互測中方便了不少。
第三個單元中引入了JML,開始我仍是使用自動數據生成和多個程序對拍的方法,以後也嘗試了利用JML自動生成數據並自動測試,但總有一些bug,因此最後嘗試使用了樸素的Junit單元測試,仍是比較方便的。
第四個單元是UML的解析,因爲數據不易生成,因此測試主要是利用starUML來生成一些邊界性的數據進行測試,也因爲UML的結構相對比較固定,因此還較爲方便。
總的來講,測試是程序設計過程當中一個很是重要的環節。通過四個單元,我認爲測試最好的方法就是使用Junit對沒個小單元進行功能測試,但實踐中因爲本身類和方法的設計問題以及時間問題,比較難以實施。同時自動化測試尤爲是壓力測試對測試也是一個必須的過程。
課程收穫
最大的收穫固然是面向程序的設計思想,面向對象提供給了咱們一個程序設計的高效思路,使得咱們的程序層次化架構更加清晰,代碼重用更加便利,加快了程序設計速度,提升了程序設計效率。豐富了我以前單一的面向過程的變成思想,展示了編程更多的可能性。
在這個過程當中本身的代碼能力也有了很大的提高,也是第一次擁有了工程性的想法和思惟。還學習到了多線程的程序設計,瞭解了Java較爲底層的實現,對Java有了更深的理解。也學習到了規格化的設計,JML語言,UML建模語言等。
另外,在這個過程當中,本身分析問題的能力,測試的能力,debug的能力也有很大的提高,也是對本身的抗壓能力,面對較大規模編碼的能力的提高。
課程改進建議
- 但願改進一下課上測試的形式和方法,至少找時間講解一下課上的題目或給出參考性答案,不然咱們在課上測試中獲得的收穫不多。- JML部分課程組或許能夠再進行一些探索和優化,刪去一些難以實現的部分,增添一些更爲實際的要求。- 但願能夠改進一下課堂使用的ppt,我的認爲課堂ppt的邏輯廣泛有一些混亂,結構不是很是的清晰,經常有一些重複等。另外,截圖也常常看不清楚。