2分鐘通俗理解迪米特法則,架構設計築基必看

ITPUB社群發表於2023-11-07

來源:mikechen的網際網路架構

迪米特法則是對軟體實體之間通訊的限制,它要求限制軟體實體之間通訊的寬度和深度。

迪米特法則提出,一個軟體實體,應儘可能少的與其它實體互動。當一個模組修改時,就會盡量少對其他模組產生影響,系統擴充套件也會更加容易。

本文主要介紹迪米特法則,力求透過圖文原始碼,一文徹底掌握它。

建議結合前幾篇看,更容易融會貫通:

  1. 微信面試:說說里氏替換原則

  2. 精通介面隔離原則

  3. 依賴倒置原則就看這篇

  4. 3 分鐘吃透開閉原則

  5. 單一職責原則讓程式碼質量提升100倍


01
  什麼是迪米特法則?

迪米特法則(LoD),又稱為最少知識原則,英文全稱 Least Knowledge Principle。

迪米特法則是指一個模組(類)只和與它高度相關的模組交流,儘量減少與其他模組(類)的直接交流。

大白話就是,模組之間的通訊應該簡單明瞭,每個模組只需要關心與它高度相關的模組,而不必瞭解整個系統的細節。

高度相關是指這些模組可能需要共同完成一項任務,或者相互依賴,以實現某個功能。

這有點像在現實生活中,你只與你的朋友直接交流,而不會與朋友的朋友(陌生人)交流。你的任何改變,都不會對朋友的朋友帶來影響。

2分鐘通俗理解迪米特法則,架構設計築基必看


02
  迪米特法則的由來?

低耦合、高內聚是軟體程式設計的總原則。

  • 耦合:指模組之間的聯絡程度。

  • 內聚:指模組內部元素的聯絡程度。

模組之間瞭解得越多,耦合就越緊。

任何一個模組的變化,都會影響到其他模組,系統就會變得很複雜。

2分鐘通俗理解迪米特法則,架構設計築基必看

無論是程式導向程式設計,還是物件導向程式設計,只有儘可能降低各個模組之間的耦合,才能提高程式碼的複用率。

低耦合的優點不言而喻,但是怎樣才能實現低耦合呢?

這正是迪米特法則要去實現的。


03
  迪米特法則的核心思想?

迪米特法則的核心思想模組之間最少依賴。

  • 不該有直接依賴關係的類之間,就不要有依賴;


  • 有依賴關係的類之間,儘量只依賴必要的介面。

如果模組 A 需要與模組 B 交流,它應該直接與模組 B 通訊,而不是透過模組 C、D、E ......

每個模組只與它高度相關的模組交流,減少了模組之間不必要的依賴。

使得每個模組都能更好地封裝自己的功能,只暴露必要的介面,提高了模組的封裝性和隔離性。


04
  迪米特法則的示例?

我們再來看具體示例,以便更好地理解迪米特法則及其應用。

假設:

公司要開發一款社交軟體,需要研發使用者釋出帖子和發表評論的功能。

不遵循迪米特法則:

我們設計一個模組,讓這個模組直接與使用者、帖子和評論之間進行復雜的通訊,以獲取資訊、建立帖子和評論。






















































// 使用者模組class User {    String username;
   public User(String username) {        this.username = username;    }
   public void createPost(String content, Post post) {        // 使用者建立帖子        post.setContent(content);    }
   public void addComment(String text, Post post) {        // 使用者新增評論        Comment comment = new Comment(text);        post.addComment(comment);    }}
// 帖子模組class Post {    String content;    List<Comment> comments = new ArrayList<>();
   public void setContent(String content) {        this.content = content;    }
   public void addComment(Comment comment) {        comments.add(comment);    }}
// 評論模組class Comment {    String text;
   public Comment(String text) {        this.text = text;    }}
public class SocialMediaApp {    public static void main(String[] args) {        User user1 = new User("Alice");        User user2 = new User("Bob");        Post post = new Post();
       user1.createPost("Hello, world!", post);        user2.addComment("Great post, Alice!", post);    }}

雖說這樣也能實現需求,但弊端很明顯。

使用者模組直接與帖子模組、評論模組進行通訊,使用者模組需要知道帖子和評論的細節,包括它們的方法和屬性,甚至需要直接訪問它們的資料庫。

模組之間的依賴關係很緊密,導致了緊耦合。

後續任何與使用者、帖子或評論相關的變化,都會影響到這個模組,系統會很複雜 。


遵循迪米特法則:

現在,我們應用迪米特法則來改進這個設計。

按照迪米特法則,一個模組應該只與它的“朋友”通訊。

在這種情況下,帖子可以被認為是使用者的“朋友”,評論也可以被認為是帖子的“朋友”。

  • 使用者模組只需要與帖子模組通訊,以釋出和管理帖子。


  • 帖子模組只需要與評論模組通訊,以允許使用者發表評論。


  • 使用者模組和評論模組之間沒有直接聯絡,它們不需要知道對方的全部細節。


















































class User {    String username;
   public User(String username) {        this.username = username;    }
   public void createPost(String content, Post post) {        post.setContent(content);    }
   public void addComment(String text, Post post) {        post.addComment(text);    }}
class Post {    String content;    List<Comment> comments = new ArrayList<>();
   public void setContent(String content) {        this.content = content;    }
   public void addComment(String text) {        Comment comment = new Comment(text);        comments.add(comment);    }}
class Comment {    String text;
   public Comment(String text) {        this.text = text;    }}
public class SocialMediaApp {    public static void main(String[] args) {        User user1 = new User("Alice");        User user2 = new User("Bob");        Post post = new Post();
       user1.createPost("Hello, world!", post);        user2.addComment("Great post, Alice!", post);    }}

使用者模組只與帖子模組互動,不直接與評論模組通訊,它不需要知道評論的具體細節。

評論的具體實現對使用者模組是透明的,使用者只需要知道與帖子相關的操作。

如果我們要對使用者模組進行修改,不會影響到評論模組,因為它們沒有直接聯絡。

這種設計減少了模組之間的依賴關係,系統更加靈活、容易擴充套件。


總結
  

迪米特法則的核心思想是:不該有直接依賴關係的類之間,就不要有依賴;有依賴關係的類之間,儘量只依賴必要的介面

迪米特法則避免與非直接的類通信,使模組與模組之間保持較低的耦合關係。

但是,要通訊,必然就要透過“中介”來聯絡。過分使用迪米特原則,系統中就會存在大量“中介”,這在一定程度上增加了系統的複雜度。

應用時需要綜合權衡,既要做到結構清晰,又要實現高內聚、低耦合。

建議收藏備用,架構設計築基必知必會,大廠面試也愛問。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2993272/,如需轉載,請註明出處,否則將追究法律責任。

相關文章