OO_JAVA_四個單元的總結

總結本單元兩次做業的架構設計

設計目標

儘可能減小特殊容器的存在,能通用就通用,減小重複的類同代碼。java

基礎容器的存在,就是爲上述目標而服務的。數據結構

設計概要

  1. 底層:基礎的、類型無關、無依賴的容器以及對應的查詢方法
  2. 中間層:用來存全部的parent和association映射關係及對應的查詢方法
  3. 頂層:基於底層容器和中間層容器的業務邏輯處理方法

基礎層

private Map<String, UmlElement> elementMap;
    private MultiValueMap<ElementType, UmlElement> typeMap;
    private DuoMap<String, ElementType, UmlElement> nameMap;
    private DuoMap<String, ElementType, UmlElement> parentIdMap;

總結本身在四個單元中架構設計及OO方法理解的演進

原則

  1. 簡潔:思路到代碼都要簡潔。
  2. 解耦:能提取的共性通通提取。

演進過程

所謂演進,就是上述原則理解的不斷深化,和實際運用的不斷深化。多線程

第一單元:表達式:繼承與CAST

設計要求

處理表達式的輸入輸出,以及對錶達式求導。架構

提取共性

不管數字、加號、乘號、減號、指數符號、sin函數、cos函數,均可以稱之爲函數,都是由函數自己,以及參數構造而成,造成一種樹形結構,即表達式樹。框架

對其一視同仁能夠完成很是簡化的設計架構,全部的函數,這裏叫他函子。ide

共性

  1. 樹或者說函子(某些)能夠具備子樹即子函子
  2. 對樹或者說函子能夠求導,求其導函數
  3. 對樹或者說函子(某些)能夠反科裏化,將嵌套的同函子表達式展平
  4. 對數或者說函子(某些)能夠合併同類項,好比數字相加能夠合併

第二單元:多線程:層次分離

分離處理層次

分離層次的目的是爲了每一部分都足夠的簡單,並且相互解離,能夠獨立或者一步步的設計構建,減輕腦力負擔。函數

層次

  1. 頂層調度層,負責把乘客請求分配給電梯
  2. 電梯調度層,負責把乘客請求轉化成電梯運行指令
  3. 電梯執行層,負責運行電梯運行指令

第三單元:JML規格:stream的運用

從第一單元接觸到stream,學習運用,到第三單元,stream的運用已經在個人代碼裏到處都是,能夠減少代碼的複雜度。單元測試

第四單元:UML:容器的設計

從簡潔、通用的角度出發,不該該爲每一種UML元素的關係結構都設置對應的類或容器進行存儲與獲取學習

在這些元素與元素之間有不少關係直接從元素自己就能夠構建獲得,也即我所使用的4個類型無關Map,經過這4個Map,個人代碼中沒有大量的存儲容器,這就是共性的效果。測試

總結本身在四個單元中測試理解與實踐的演進

所謂面對對象,就是在抽離相似對象之間的共性,以這些共性組織代碼,提高代碼的抽象程度,減輕編寫的體力勞動。

在編寫代碼時,疏漏不可避免,這時就體現出分層與解離的好處了,當你的代碼分離的層次清晰時,就能夠快速地定位到發生錯誤的所在,這也是OO課程中我努力趨向的目標。

歷來自c語言、數據結構課程的單純經過輸入輸出數據來約束代碼的正確性,我又學到了單元測試這一利器,以及爲了解決正確性問題而發明的JML形式驗證語言,這些都是約束程序的正確性的辦法。

總結本身的課程收穫

我OO的歷程,就是不斷地提高本身的解耦代碼的能力,即提取共性的能力,第二單元時我以爲第一單元用接口以及實現接口能夠寫的複雜度下降一些,如今我回過頭看我第一單元的代碼,我發現,有不少操做均可以進一步提取共性,簡化代碼,這就是進步,不斷地掌握抽象的思惟方法。

每個單元,每一次project,最重要的是進步,所謂收穫,也就是從一次次的做業中,體會到的本身的思路、設計的進步。

立足於本身的體會給課程提三個具體改進建議

  1. 第一單元

    • 第一單元的難度能夠適當的下降,下降的方法能夠是提供官方的架構,而後讓學生填寫實現便可,好比表達式的求導,能夠設置以下簡易結構(四個接口):

      public interface Differentiable {
          Differentiable derivate();
      }
      
      public interface Recursive extends Differentiable {
          Collection<Differentiable> getChildren();
      }
      
      public interface Mergeable extends Recursive {
          Differentiable merge();
      }
      
      public interface Coryled extends Recursive {
          Differentiable uncoryled();
      }

      而後給出表達式項的模板(一種項的例子,省略初始化和構造):

      public class Plus implements Differentiable, Recursive, Mergeable, Coryled {
          private List<Differentiable> children;
      
          @Override
          public Collection<Differentiable> getChildren() {
              return children;
          }
      
          @Override
          public Differentiable derivate() {
              Plus plus = new Plus();
              for (Differentiable diff : getChildren) {
                  plus.addChild(diff.derivate());
              }
              return plus;
          }
      
          @Override
          public Differentiable uncoryled() {
              return this; // TO BE IMPLEMENTED
          }
      
          @Override
          public Differentiable merge() {
              return this; // TO BE IMPLEMENTED
          }
      
          public void addChild(Differentiable diff) {
              children.add(diff);
          }
      }

      設置結構與模板的目的,是爲了學生易於掌握面對對象的內涵,並快速地理解Java裏的類的繼承和接口的實現。

      面對對象,即解離出對象與對象之間的共性,上面四個接口,就是表達式項的四種特性:

      1. 可導:每一項都是可導的,因此其餘特性接口都繼承自該特性接口
      2. 遞歸:有些項具備子項,好比加法項,其子項即兩個相加的項,求導時須要進行一些相似遞歸的操做
      3. 可合併:有些具備子項的項,好比加法項,其子項能夠合併同類項,好比1+2能夠轉化成3
      4. 可反科裏化:嵌套的同種類項,能夠解除嵌套,好比1+(1+2)能夠轉化成1+1+2

      並且,第一單元夾雜的輸入處理部分,比重和難度較大,能夠予以改良,好比像上述框架通常,也提供相似的框架。

      對於大多數學生來講,剛剛學習面對對象的思惟,既然在對面對對象一無所知的狀況下你們寫出的代碼都是面向過程,不如官方提供一個或數個框架,讓學生按圖索驥,照貓畫虎,這樣,既減輕了第一單元的課業難度,又讓學生友好的接觸這一門課程,何樂而不爲?

  2. 評分:單元測試

    首先,像JML和UML這樣的單元,評分的方式和標準是否能夠改變呢?

    由於這兩個單元咱們寫代碼,都是按照官方的接口來實現,那麼評分是否能夠按照單元測試來給分呢,這樣也必定工程的須要,鍛鍊你們測試的能力。

  3. 評價:架構考察

    而後就是架構的考察,一個學期,如此多的project,我以爲,這個課程,學生最應該提高的能力,就是必定程度上,駕馭複雜架構的能力,而伴隨課程推動的,應該是學生的進步,對這一方面能力的進步與否,也應予以考察。

相關文章
相關標籤/搜索