越級上報不可行,各司其職才是王道---迪米特法則

語言: CN / TW / HK

前言

  • 迪米特法則要求類與類之間應該儘量減少互相的瞭解。別名又稱最少知識原則
  • 相信搞Java的同學一聽肯定會說這不就是低耦合嗎。
  • 只要兩個類有耦合關係,我們就稱兩個類為直接朋友關係。迪米特法則要求類只與直接朋友交流。那麼我們如何界定類與類之間的耦合關係呢

image-20220428182450248.png

  • 上述三種關係我們就稱之為耦合關係或者說是直接朋友關係。這裡需要注意的是僅出現在方法內部的類並不是直接朋友。

程式碼場景

  • 話不多說,我們直接上程式碼吧。

public class Demeter {      public static void main(String[] args) {          new SchoolManager().printAllEmployers(new CollegeManager());     }  }  class Employer{      private String id;  ​      public String getId() {          return id;     }  ​      public void setId(String id) {          this.id = id;     }  ​      @Override      public String toString() {          return "collge:"+this.id;     }  }  ​  class CollegeEmployer{      private String id;  ​      public String getId() {          return id;     }  ​      public void setId(String id) {          this.id = id;     }      @Override      public String toString() {          return "school:"+this.id;     }  }  ​  class SchoolManager{      public List<Employer> schoolAllEmployers() {          List<Employer> list = new ArrayList<>();          for (int i = 0; i < 10; i++) {              Employer employer = new Employer();              employer.setId(String.valueOf(i));              list.add(employer);         }          return list;     }  ​      public void printAllEmployers(CollegeManager manager) {          /*System.out.println(Arrays.toString(manager.collegeAllEmployers().toArray()));          System.out.println(Arrays.toString(schoolAllEmployers().toArray()));*/          for (CollegeEmployer collegeAllEmployer : manager.collegeAllEmployers()) {              System.out.println(collegeAllEmployer.getId());         }          for (Employer schoolAllEmployer : schoolAllEmployers()) {              System.out.println(schoolAllEmployer.getId());         }     }  }  ​  class CollegeManager{      public List<CollegeEmployer> collegeAllEmployers() {          List<CollegeEmployer> list = new ArrayList<>();          for (int i = 0; i < 10; i++) {              CollegeEmployer collegeEmployer = new CollegeEmployer();              collegeEmployer.setId(String.valueOf(i));              list.add(collegeEmployer);         }          return list;     }  }

  • 上面的功能就是列印兩個部門的成員資料。但是對於SchoolManager來說在列印成員變數的時候居然使用到CollegeEmployer這個非直接朋友。那麼他就直接打破了迪米特法則。
  • 但是不管我們怎麼消除耦合,耦合是肯定會存在的。我們只能從職責上將各個類的功能界定好。比如說上面的CollegeEmployer的列印邏輯就不應該放在SchoolManager中。
  • 就好比領兵打仗,皇帝只需要派大將軍過去指揮將士們。將士們是如何殺敵的過程不需要和皇帝溝通。皇帝只需要也只想看到結果。SchoolManager也是我只想列印成員,具體怎麼列印不要告訴我,也不要讓我操心。所以解決迪米特法則的衝突也很簡單。我們只需要將衝突點上提即可。

image-20220428193819675.png

總結

  • 無規矩不成方圓。仔細回想下我們之前的程式碼開發,肯定很多都是破壞了迪米特法則。設計模式的難點就在於你可以不尊從他的原則照樣可以開發出程式甚至可以穩定執行。但是無法面對後期的需求車輪戰。
  • 但是如果從一開始我們就儘量遵從設計原則的話,那麼在後期需求的擴張時,我們能夠將我們的程式碼有序的進行升級而不破壞已有的功能。或者說我們能夠一直按照一定的設計進行開發。

image-20220428194249424.png

\

「其他文章」