2分鐘通俗理解迪米特法則,架構設計築基必看
來源:mikechen的網際網路架構
迪米特法則是對軟體實體之間通訊的限制,它要求限制軟體實體之間通訊的寬度和深度。
迪米特法則提出,一個軟體實體,應儘可能少的與其它實體互動。當一個模組修改時,就會盡量少對其他模組產生影響,系統擴充套件也會更加容易。
本文主要介紹迪米特法則,力求透過圖文原始碼,一文徹底掌握它。
建議結合前幾篇看,更容易融會貫通:
微信面試:說說里氏替換原則
精通介面隔離原則
依賴倒置原則就看這篇
3 分鐘吃透開閉原則
單一職責原則讓程式碼質量提升100倍
迪米特法則(LoD),又稱為最少知識原則,英文全稱 Least Knowledge Principle。
迪米特法則是指一個模組(類)只和與它高度相關的模組交流,儘量減少與其他模組(類)的直接交流。
大白話就是,模組之間的通訊應該簡單明瞭,每個模組只需要關心與它高度相關的模組,而不必瞭解整個系統的細節。
高度相關是指這些模組可能需要共同完成一項任務,或者相互依賴,以實現某個功能。
這有點像在現實生活中,你只與你的朋友直接交流,而不會與朋友的朋友(陌生人)交流。你的任何改變,都不會對朋友的朋友帶來影響。
低耦合、高內聚是軟體程式設計的總原則。
耦合:指模組之間的聯絡程度。
內聚:指模組內部元素的聯絡程度。
模組之間瞭解得越多,耦合就越緊。
任何一個模組的變化,都會影響到其他模組,系統就會變得很複雜。
無論是程式導向程式設計,還是物件導向程式設計,只有儘可能降低各個模組之間的耦合,才能提高程式碼的複用率。
低耦合的優點不言而喻,但是怎樣才能實現低耦合呢?
這正是迪米特法則要去實現的。
迪米特法則的核心思想:模組之間最少依賴。
不該有直接依賴關係的類之間,就不要有依賴;
有依賴關係的類之間,儘量只依賴必要的介面。
如果模組 A 需要與模組 B 交流,它應該直接與模組 B 通訊,而不是透過模組 C、D、E ......
每個模組只與它高度相關的模組交流,減少了模組之間不必要的依賴。
使得每個模組都能更好地封裝自己的功能,只暴露必要的介面,提高了模組的封裝性和隔離性。
我們再來看具體示例,以便更好地理解迪米特法則及其應用。
假設:
公司要開發一款社交軟體,需要研發使用者釋出帖子和發表評論的功能。
不遵循迪米特法則:
我們設計一個模組,讓這個模組直接與使用者、帖子和評論之間進行復雜的通訊,以獲取資訊、建立帖子和評論。
// 使用者模組
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計原則之【迪米特法則】
- 軟體設計原則—迪米特法則
- 嘻哈說:設計模式之迪米特法則設計模式
- 設計模式六大原則(五)----迪米特法則設計模式
- 什麼是迪米特法則?
- 設計模式的七大原則(6) --迪米特法則設計模式
- 迪米特法則——合理的封裝封裝
- 3 分鐘吃透開閉原則,架構設計築基必知必會架構
- SOLID架構設計原則Solid架構
- 10分鐘理解 Node.js koa 原始碼架構設計Node.js原始碼架構
- 【架構設計】你真的理解軟體設計中的SOLID原則嗎?架構Solid
- 理解Underscore的設計架構架構
- 架構師之路—理解設計模式架構設計模式
- 架構設計之一——基礎架構架構
- 雲原生架構及設計原則架構
- 架構設計中的基本原則架構
- 依賴倒置原則就看這篇,7張圖解徹底吃透,架構設計築基必知必會圖解架構
- Tomcat 架構原理解析到架構設計借鑑Tomcat架構
- 深入理解需求分析的目標(C系架構設計法)架構
- 如何通俗理解設計模式及其思想?設計模式
- 架構整潔之道二(設計原則)架構
- 如何最簡單、通俗地理解GPT的Transformer架構?GPTORM架構
- 架構師對MVC設計模式的理解架構MVC設計模式
- [分散式]架構設計原則--高併發分散式架構
- 簡單介紹架構設計的原則!架構
- Angular應用架構設計-5:設計原則與總結Angular應用架構
- 深入理解TensorFlow架構設計與實現原理 3 :基礎概念架構
- 大道至簡的架構設計思想之:封裝(C系架構設計法,sishuok)架構封裝
- SPA設計與架構-理解單頁面Web應用 (埃米頓.A斯科特) 中文pdf掃描版架構Web
- Tomcat詳解系列(2) - 理解Tomcat架構設計Tomcat架構
- 架構設計的五大原則-SOLID架構Solid
- 360°透視:雲原生架構及設計原則架構
- 互動設計法則
- 架構設計思想-微服務架構設計模式架構微服務設計模式
- 設計和架構:業務開發指導原則架構
- 【虹科乾貨】設計微服務架構的原則微服務架構
- 架構設計要按照什麼原則進行呢?架構
- 基於SpringCloud的微服務架構設計SpringGCCloud微服務架構