OO第4次博客做業

OO第4次博客做業正則表達式

1、第4單元設計算法

 

      第四單元主要圍繞UML圖的結構進行JAVA代碼編寫,對JAVA的層次結構進行更多的認識。我的認爲編程操做在實質上與上一章的PathContainer有許多的相同之處,難度也較上一章下降的不少。與此同時有許多新的新的概念須要理解,對我提出了編程以外的要求。編程

第十三次做業多線程

    此次做業主要解決UML中的類圖。主要包括2點內容,即類圖的構建以及相應的查找函數。架構

一、課程預先寫好的接口給出的是一種鏈式存儲結構,經過ParentId找到所屬的上層結構。在實際的編程中爲了方便操做和查找,我採起的作法時本身編寫了各個類儲存下層結構和上層結構的Id,實現有序的層次結構。模塊化

二、因爲在構造函數傳入的Element元素沒法確保合理的順序性。所以須要分別對不一樣元素進行排序,分層處理。個人處理方式將CLASS和INTERFACE放在第一層, UML_INTERFACE_REALIZATION UML_ATTRIBUTE UML_OPERATION UML_ASSOCIATION UML_GENERALIZATION放在第二層,UML_PARAMETER UML_ASSOCIATION_END放在第三層,分別進行處理。函數

三、此次的測試彷佛並無對性能有任何要求,所以在查詢函數中我爲了確保正確性,使用了普通的順序遍歷就成功經過了全部測試案例。工具

第十三次做業類圖:性能

第14次做業學習

      14次做業在第13次做業基礎上增長了順序圖和狀態圖。而且在開源LAVA代碼中增長了大量Element子類。表面上難度彷佛大幅增長,實質上此次順序圖和狀態圖考的內容都很是簡單而且和第13次做業很是類似,只是簡單的計數和遍歷問題。同時助教也將細節部分大幅簡化了,少了不少重名、合併等邊界問題。給出的Element子類最後也用到的很少。我的認爲此次做業在難度上徹底能夠更上一個臺階。

      此次做業的難點很少,其中之一是UML003規則的斷定,即類和接口的重複實現。須要判斷的狀況相對較多,包括只包含接口的重複實現,只包含1個類和接口的重複實現。類重複實現了父類已經實現的接口以及父類重複實現致使的子類也重複實現的狀況。種類較多,比較容易遺漏。

      另外一個難點在於代碼量的控制。因爲這一次做業概念較多致使代碼量較大,想在500行以內搞定是不可能的,每一個方法也很是容易超過60行的限制。我將UMLINTERACTION拆分紅了3個類,1個類包括構造函數,第二個類負責上一次做業的查找函數,而第三個類負責這一次做業的函數。三個類之間有繼承關係,從而使得最終類的代碼量只有原來的三分之一。

 第十四次做業類圖: 

      能夠看見因爲將每一個元素都本身寫一個獨立的類,同時將最終類分紅三層分別實現,致使個人代碼和結構都比較複雜。優勢則是將全部的實現都獨立開來,方便代碼複用。第十四次做業實現時徹底照着上一次做業的模板在其之上添加而成。

第十3、十四次做業BUG修復

這二次做業共產生了3類BUG。第一是很是廣泛的BUG:空指針異常。產生緣由是對順序圖理解不夠徹底。例如第二次做業中出現了發送給endpoint的消息,但個人程序則忽略了對其的處理。

第二個BUG是類型轉換錯誤。這一次的JAVA包中包括大量枚舉、繼承以及接口實現關係。我不慎將兩個沒有繼承關係的類進行了強制轉換,致使了BUG出現。

第三個BUG是對循環繼承處理的錯誤。我在該項檢查時使用了很是簡單的方法,讓一個類不斷getfather,當最終回到本身是則最終出現循環繼承。BUG在於若它的父類存在循環繼承而其自己並不存在會致使循環判斷最終步入死循環。

2、架構演進

一、第一單元做業

      第一次做業是針對簡單表達式的求導過程,對於JAVA語法以及正則表達式都是第一次接觸和學習。因爲第一次進行JAVA編寫,所以在實現上大體採用的是面向過程的寫法,並無考慮代碼重用方面的構造,致使下一次做業徹底重寫。

      第二次做業在第一次的基礎上增長了三角函數。吸收了第一次做業的教訓,我將第二次做業的多項式結構層次化分爲2個類,多項式和項,經過正則表達式匹配項的種類進行求導。此次做業我沿用了上一次的空格判斷函數,同時對JAVA的模塊化設計有了更多的理解。

      第三次做業結構較上一次做業更爲複雜多變。我沿用了第二次做業的結構,並在其上增長了因子類,經過遞歸方式進行求導,順利經過了此次的做業。

      在測試方面第一單元因爲經驗不足,大部分測試樣例都是本身腦補出來的,主要聚焦於邊界條件等方面,所以在互測以及本身對BUG的發現方面有許多不足之處。

  二、第二單元做業

       第一次做業是簡單的單電梯且無換乘,所以沒有BUG出現,代碼量也很是少。在這一次做業中肯定了電梯程序的3個基本類,包括輸入線程,調度類以及電梯線程。在兩個線程中使用了同步鎖,初步感覺到了線程協同的過程。

       第二次做業在上一次的基礎上增長了電梯的捎帶以及對於CPU時間的檢查。我在第一次做業的基礎上增長了電梯線程對於每一層對於捎帶的判斷,同時使得電梯線程和輸入線程互相通訊,防止電梯線程的輪詢查詢。

      第三次做業在第二次做業的基礎上增長了多電梯運行的狀況,以及每一個電梯對於停靠樓層的限制。多電梯運行不難解決,爲每個線程增長等待和運行隊列以及考慮電梯協同便可。關鍵在於對於每一個電梯任務的拆分和合理調度,這也是此次做業我思考最多的地方。

      這一次做業的BUG測試沒法採用上一次做業的自我腦補方式。個人作法是經過編寫C程序隨機生成測試樣例,同時經過本身編寫的檢測程序判斷測試樣例的合理性,同時經過一些本身編寫的代碼量較小的針對邊界條件的測試程序進行BUG檢查。整體上效率明顯高於上一次的做業。

三、第三單元做業

       第一次做業針對的是簡單的 PathContainer,所要執行的任務也只是增刪查而已。在圖的構造方面,因爲此次做業對性能有很是嚴格的要求,所以我採用HASHMAP存儲PATH。同時針對getDinstinctCount指令的複雜性,在每一次增減指令的時候更新DINSTINCTCOUNT,減小調用該函數的負擔。

      第二次做業在第一次做業的基礎上增長了最短路徑以及連通性的查詢。解決方法經過BFS替代DJ算法,下降複雜度,保證了性能。

      第三次做業增長了很是多的概念,包括不一樣的權重圖,最大連通塊的存儲以及對於換乘的處理。在沿用第二次做業整體構造的基礎上,我增長了對於連通塊並查集的存儲以及權重圖的存儲。同時經過拆點法解決換乘問題。這一次做業最大的難點就是對於DJ算法的處理。我使用了堆排序優化了算法,可是沒有找到好的方法緩衝中間查詢結果,致使超時狀況的大量出現。

    針對BUG的尋找以及互測,個人方法沿用上一次的內容,經過大量構造隨機數據進行壓力測試,並本身編寫程序測試邊界狀況。不一樣的是這一次做業網上提供了大量JML工具,我也利用了JML UnintNG和Junit進行測試。

四、第四單元做業

(即本博客前部份內容)

3、課程回顧

      在面向對象課程中我充分感覺到了不一樣於C語言的面向對象編程方法,模塊化設計以及對於測試的各種方法。學習了多線程編程,JML,UML等各類JAVA編程的特性方法,同時也學習掌握了JAVA編程大量的輔助工具鏈。此外鍛鍊了咱們的自我學習能力,許多關於JAVA構造函數,HASHMAP等各種JAVA特性方法的使用都是經過本身的不斷嘗試實踐以後纔可以徹底掌握的,而不是老師的一味教學。最後,此次的課程也鍛鍊了咱們對於大量程序代碼的構造以及長時間編程能力,以及對於代碼一步步構造和分析的能力,這也將爲咱們將來工做打下必定的基礎。

4、對於課程的建議

一、最後一次關於UML的做業第一、2次做業幾乎沒有什麼跨度,同時關於UMLENDPOINT等大量新增概念都沒有用上,函數也是很是基本的函數。能夠適當提升該部份內容的難度。

二、適當增長中測的難度,同時增長強測測試點的梯度。經常出現有人一個小點忽視致使強測爆光而另一我的構造自己有問題卻能安然無恙的狀況。

三、感受能夠增長一單元的綜合內容,將現實中企業可能遇到的編程問題交給咱們來編程而不是簡單的給一些抽象問題,感受這樣可以獲得更大的鍛鍊。

四、能夠增長對於經常使用工具鏈的介紹。僅僅介紹UML和JML感受比較有限,能夠增長對於自學其餘經常使用工具的要求。

相關文章
相關標籤/搜索