- 在軟件開發(fā)中枫夺,為了提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性,增加軟件的可擴(kuò)展性和靈活性绘闷,程序員要盡量根據(jù)7條原則來開發(fā)程序橡庞,從而提高軟件的開發(fā)效率较坛,節(jié)約軟件開發(fā)成本和維護(hù)成本,我們將在下面的幾節(jié)中依次來介紹者7條原則毙死,本節(jié)介紹里迪米特法則
迪米特法則定義
,產(chǎn)生于1987年美國(guó)東北大學(xué)(Northeastern University)的一個(gè)名為迪米特(demeter)的研究項(xiàng)目燎潮,由伊恩·荷蘭(lan Holland)提出,被NML創(chuàng)始者之一的布奇(Booch)普及扼倘,后來又因?yàn)樵诮?jīng)典著作《程序員修煉之道》The Pragmatic Programmer 提及而廣為人知确封。
定義:只與你的直接朋友交談,不跟“陌生人”說話再菊。
(Talk only to your immediate friends and not to strangers)爪喘。
如果兩個(gè)軟件需要交互,要使用第三方轉(zhuǎn)發(fā)調(diào)用實(shí)現(xiàn)交互纠拔。降低耦合度秉剑,提高模塊的相對(duì)獨(dú)立性。
迪米特法則中的“朋友”是指:當(dāng)前對(duì)象本身稠诲、當(dāng)前對(duì)象的成員對(duì)象侦鹏,當(dāng)前對(duì)象所創(chuàng)建的對(duì)象、當(dāng)前對(duì)象的方法參數(shù)等臀叙,這些對(duì)象同當(dāng)前對(duì)象存在關(guān)聯(lián)略水,聚合或組合關(guān)系,可以直接訪問這些對(duì)象的方法劝萤。
迪米特法則優(yōu)點(diǎn)
- 降低類之間的耦合度渊涝,提高模塊的獨(dú)立性
- 提高代碼的復(fù)用率和系統(tǒng)的擴(kuò)展性
注意:凡事講究恰到好處才是好,大量使用的話床嫌,系統(tǒng)中堆積大量中介邏輯跨释,增加系統(tǒng)的復(fù)雜性,使模塊間的通信效率降低厌处,所以鳖谈,在采用迪米特法則時(shí)喲啊反復(fù)權(quán)衡,確保高內(nèi)聚低耦合同時(shí)保證結(jié)構(gòu)清晰阔涉。
迪米特法則的實(shí)現(xiàn)方法
- 從依賴角度缆娃,只依賴應(yīng)該以來的對(duì)象。
- 從被依賴角度洒敏,只暴露應(yīng)該暴露的方法。
應(yīng)用注意事項(xiàng)
- 盡可能降低類之間的耦合度疙驾,利于復(fù)用凶伙。
- 在類的結(jié)構(gòu)設(shè)計(jì)上,盡量降低類成員的訪問權(quán)限
- 類的設(shè)計(jì)它碎,優(yōu)先考慮將一個(gè)類設(shè)置成不變類
- 盡可能減少對(duì)其他類的引用次數(shù)
- 不暴露屬性成員函荣,提供訪問器(set显押、get)
- 謹(jǐn)慎使用序列化(Serializable)功能
【例】明星與經(jīng)紀(jì)人關(guān)系實(shí)例
分析:明星需要經(jīng)紀(jì)人處理日常事務(wù),粉絲見面會(huì)傻挂,媒體業(yè)務(wù)洽談等乘碑,經(jīng)紀(jì)人與明星時(shí)朋友,粉絲媒體都是陌生人金拒,所以適合使用迪米特法則兽肤,如圖
package principle;
public class LoDtest {
public static void main(String[] args) {
Agent agent = new Agent();
agent.setStar(new Star("林心如"));
agent.setFans(new Fans("粉絲韓丞"));
agent.setCompany(new Company("中國(guó)傳媒有限公司"));
agent.meeting();
agent.business();
}
}
//經(jīng)紀(jì)人
class Agent {
private Star myStar;
private Fans myFans;
private Company myCompany;
public void setStar(Star myStar) {
this.myStar = myStar;
}
public void setFans(Fans myFans) {
this.myFans = myFans;
}
public void setCompany(Company myCompany) {
this.myCompany = myCompany;
}
public void meeting() {
System.out.println(myFans.getName() + "與明星" + myStar.getName() + "見面了。");
}
public void business() {
System.out.println(myCompany.getName() + "與明星" + myStar.getName() + "洽淡業(yè)務(wù)绪抛。");
}
}
//明星
class Star {
private String name;
Star(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//粉絲
class Fans {
private String name;
Fans(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
//媒體公司
class Company {
private String name;
Company(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
打印
粉絲韓丞與明星林心如見面了资铡。
中國(guó)傳媒有限公司與明星林心如洽淡業(yè)務(wù)。