【面向對象】學期總結

【面向對象】學期總結

第四單元做業架構設計

第一次做業

  • 架構設計:java

    ​ uml 類圖提供了一個描述類及其關係的視圖。 頂層爲 UMLClassUMLInterfaceUMLAssociationUMLGeneralization
    UMLInterfaceRealization 。下一層爲UMLAttributeUMLOperation, UMLParameterUMLAssociationEnd算法

    ​ 根據uml類圖的層次結構,將模型抽象爲MyAssociation , MyClass , MyInterface 幾個類 。MyUmlInteraction 做爲外部方法接口類,將不一樣的指令都分放到具體的類中去查詢處理。編程

    • 類圖:

第二次做業

  • 架構設計:安全

    ​ 除了順序圖以外,第二次做業加入了對uml順序圖和狀態圖的模型處理。順序圖描述了基於消息機制的對象協做關係,具備明確的協做主題。
    頂層爲協做對象UMLAttribute和交互模型UMLInteraction 。下一層爲UMLLifelineUMLMessageUMLCombinedFragment數據結構

    ​ 由順序圖的層次結構,設計了MyUmlInteraction類來管理單個模型的圖層創建及指令查詢處理。在MyUmlInteraction中,多線程

    private UmlInteraction interaction;
        private ArrayList<UmlLifeline> lifelines =  new ArrayList<UmlLifeline>();
        private HashMap<String, UmlLifeline> name2Lifeline = new 
                HashMap<String, UmlLifeline>();
        private HashMap<String, Integer> same2Lifeline = 
                new HashMap<String, Integer>();
        private ArrayList<UmlMessage> messages = new ArrayList<UmlMessage>();
        private HashMap<String, Integer> target2SourceNum = 
                new HashMap<String, Integer>();

    創建了name2Lifeline , same2Lifeline , target2SourceNum 映射名字和對象,消息傳遞的發送方和接收方關係的映射。架構

    ​ 設計MyUmlInteractionContainer 類來管理狀態圖,做爲狀態圖的指令查詢接口。框架

    ​ uml狀態圖描述了狀態及其關係,通常用來描述一個特定類/組件的行
    爲。頂層結構爲UMLStateMachineUMLRegion 。 下一層爲UMLState , UMLTransition, UMLEvent , UMLOpaqueBehavior單元測試

    ​ 根據狀態圖的層次結構,我設計了 MyStateMachine 做爲狀態圖的 「 畫布 」。學習

    private UmlStateMachine stateMachine;
        private HashMap<String, UmlState> name2state = 
                new HashMap<String, UmlState>();
        private HashMap<String, Integer> sameName2state = 
                new HashMap<String, Integer>();
        private UmlRegion region;
        private HashSet<String> idHashSet = new HashSet<String>();
        private HashMap<String, ArrayList<String>> source2target = 
                new HashMap<String, ArrayList<String>>();

    MyStateMachine中設計了 name2state , sameName2state , source2target 幾個映射關係,便於根據名字查詢狀態和前繼狀態及後繼狀態的關係。

    ​ 設計MyStateMacheContainer類來管理順序圖,做爲順序圖查詢指令的接口。

    ​ 創建了MyUmlStandardPreCheck 類進行三條規則的預檢查。設定三個不符合規則的集合來拋異常。

    private Set<AttributeClassInformation> ruleTwo = new HashSet();
        private Set<UmlClassOrInterface> ruleEight = new HashSet();
        private Set<UmlClassOrInterface> ruleNine = new HashSet();

    類圖:

    做業架構設計及OO方法理解的演進

做業架構設計

  • 第一單元

    從純c選手走向java小白,前兩次做業都是按照c的方式,面向過程來寫。到了第三次做業,漸漸的有了一些java的基本思想,學了用基本的面向對象的方式抽象類,使得層次架構更清晰。

    • 第一次做業

    • 第二次做業

    • 第三次做業

  • 第二單元

    參考了生產者和消費者的交互模型,使用Tray類來進行電梯和請求隊列的數據交互,也使得我後續一直在糾結所謂的調度器究竟是用來幹什麼的。第二次做業增長了一些需求,考慮到人員id的惟一性,我使用了一個隊列來肯定人員的進出狀況,做爲確認人員是否進出的標準,和第一次做業差異不大。

    相比前兩次做業,第三次做業更讓人頭疼,也是我思考程序設計最長的一次做業,基本ddl前一夜纔開始寫。將需求一再簡化,我使用了初始時就已經確認換乘路線的方式,直接複製了三個電梯類來模擬三部電梯的運行狀況。更好的設計應當是抽象出一個統一的電梯類來繼承,擴展性更好。

    • 第一次做業

    • 第二次做業

    • 第三次做業

  • 第三單元

    這一單元主要是對規格的理解,按照jml註釋寫代碼。難點在於圖的數據結構算法的考察,如何才能不TLE是我最頭疼的問題(第一次做業用了死亡for循環直接爆炸)。前兩次做業都抽象出了具體的類來模擬圖,還有容器類來進行對圖的管理。最後一次做業就比較亂,因爲我全部的查詢處理方法都放在了圖中,致使代碼行數嚴重超標,不得不提一個類來存放這些方法,擴展性較差。

    • 第一次做業

    • 第二次做業

    • 第三次做業

  • 第四單元

    前文已介紹。

    OO方法理解

​ 經歷了數次做業的(折磨)歷練,我終於對於面向對象的思想有了必定的理解。面向對象的三大特性是封裝,繼承,多態。

  • 封裝: 一個類封裝了數據以及操做數據的代碼邏輯體。定義了數據的可訪問屬性(私有、公有)。
  • 繼承 : 可讓一個類型獲取另一個類型的屬性的方式。分爲實現繼承和接口繼承。
  • 多態 :類實例的一個方法在不一樣情形下有不一樣的表現形式,即不一樣的外在行爲。使具備不一樣的內部結構的對象能夠共享相同的外部接口。

    以前的博客也分析過面向對象的SOLID五大基本原則,即

  • 單一責任原則 : 每一個類型(包括接口和抽象)功能要求單一,只負責一件事情。
  • 開放封閉原則:一個軟件實體應該對擴展開發,對修改關閉。可擴展可是不可更改。用抽象構建框架,用實現類實現擴展。
  • 里氏替換原則 :子類可以替換父類,出如今父類可以出現的任何地方。當使用繼承時,儘可能遵循歷史替換原則,儘可能不要去重寫或者重載父類的方法,以避免破壞整個繼承體系的 。由於父類在定義或者實現某些方法時,規定了必須遵照的規則和契約。
  • 依賴倒置原則:具體依賴抽象,上層依賴下層。核心思想是面向接口編程。兩個模塊之間依賴的應該是抽象(接口或抽象類)而不是細節。細節(實現類)依賴於抽象。
  • 接口分離原則:模塊間要經過具體接口分離開,而不是經過類強耦合。

​ 咱們在設計程序的架構的時候應該儘量的遵循面向對象設計的基本原則,使得程序儘量的低耦合,高內聚。同一個模塊內的各個元素之間的聯繫高度緊密,下降各個模塊之間的相互依存度。

測試理解與實踐的演進

  • 第一單元——論求導的終極方式
    測試主要分爲WRONG FORMAT 數據格式判斷和計算正確性兩大部分。經過構建儘量的覆蓋性的測試數據,檢查程序的正確性。因爲時間有限,不可能徹底讀完全部同窗的代碼,經過看代碼查找bug。我基本是將本身用到的測試數據集對同組全部代碼進行測試,隨緣hack。
  • 第二單元——電梯有本身的想法
    如題,多線程測試最大的難點在於測試的不可復現性。對於線程不安全的程序,只有通過大量的重複性測試才能復現偶然出現的bug。debug也很難,因爲bug難以復現從而不肯定是否改正。
  • 第三單元——圖之TLE警告
    到了這個單元,咱們擁有了最大的神器,jml語言!「只要徹底按照jml註釋寫,你就不會有bug。」
    這一單元,介紹了新的測試方式——junit單元測試。利用junit,能夠輕易的對代碼段進行覆蓋性的測試,更加直觀和便捷。
  • 第四單元——uml模型構建
    這一單元主要是構建不一樣指令對應的測試模型,進行鍼對性測試。

課程收穫

​ 「OO竟然出了假期預習做業!」當時聽到這個消息的我只以爲好不容易盼來的假期莫得了。固然我仍是徹底沒有好好預習窩窩,買了本java的教材看了幾頁就拋之腦後,開學前幾天惡補了點基礎知識,草草的交了假期做業。就這樣,開始了從零開始的OO與OS生活。
回顧過去的做業,我開始寫代碼的時間愈來愈晚,思考程序的架構設計和實現算法比起寫代碼的時間要多的多。不知不覺,我已經能夠短期內手擼近千行代碼,比起以前的我至少碼力提高了不少,也掌握了java 的基本思想,學會了面向對象的思惟,掌握了測試代碼的方法,爲學習更深層次的知識打下基礎。
這一學期,窩窩佔據了我很大一部分時間,也帶給了我很多的精神壓力。比起往屆,這屆窩窩體驗更好一些,儘管有些不足,但確實讓我受益良多,祝窩窩越辦越好!

改進建議

  • 提升中測強度。中測的測試強度和強測差距過大,中測一次過,強測火葬場的狀況時有發生。(建議增長弱測環節保證有效做業。)
  • 實驗課課程安排略着急。理論課教完後當即上機,致使上機難度增大。
  • 指導書更明確一些會更好。固然不少細節的東西可能助教也沒想到,致使後續需求的改變。
相關文章
相關標籤/搜索