越級上報不可行,各司其職才是王道---迪米特法則
前言
- 迪米特法則要求類與類之間應該儘量減少互相的瞭解。別名又稱最少知識原則
- 相信搞Java的同學一聽肯定會說這不就是低耦合嗎。
- 只要兩個類有耦合關係,我們就稱兩個類為直接朋友關係。迪米特法則要求類只與直接朋友交流。那麼我們如何界定類與類之間的耦合關係呢
- 上述三種關係我們就稱之為耦合關係或者說是直接朋友關係。這裡需要注意的是僅出現在方法內部的類並不是直接朋友。
程式碼場景
- 話不多說,我們直接上程式碼吧。
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
也是我只想列印成員,具體怎麼列印不要告訴我,也不要讓我操心。所以解決迪米特法則的衝突也很簡單。我們只需要將衝突點上提即可。
總結
- 無規矩不成方圓。仔細回想下我們之前的程式碼開發,肯定很多都是破壞了迪米特法則。設計模式的難點就在於你可以不尊從他的原則照樣可以開發出程式甚至可以穩定執行。但是無法面對後期的需求車輪戰。
- 但是如果從一開始我們就儘量遵從設計原則的話,那麼在後期需求的擴張時,我們能夠將我們的程式碼有序的進行升級而不破壞已有的功能。或者說我們能夠一直按照一定的設計進行開發。
\
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 時序性資料庫為什麼海量資料下不卡頓呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支處理---還在硬編碼特殊處理邏輯?超級管理員不應該被區別對待
- Spring事務太強大了,相容資料庫同時給我們提供多種組合應對業務需求
- java物件在記憶體中如何分佈 | java上鎖原來就是記憶體佔位,so easy
- linux三劍客之編輯器sed出廠
- linux三劍客awk教你如何裁剪結果集
- 執行緒池7個引數拿捏死死的,完爆面試官
- 執行緒池存在的意義
- 多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
- java中的static關鍵字說清楚還得靠JVM
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解
- 每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
- 越級上報不可行,各司其職才是王道---迪米特法則
- 偏向鎖/輕量鎖/重級鎖鎖鎖更健康,上鎖解鎖到底是怎麼完成實現的,我來告訴你
- 狸貓換太子里氏替換原則;不要一味的進行抽象否則最後你無法hold你的物件
- 設計模式是我擺脫碼畜的唯一出路---依賴倒轉原則
- 學好數理化,寫遍所有程式碼都不怕,我用數學分類討論的思想解決
- synchronized已經不在臃腫了,放下對他的成見之初識輕量級鎖