迪米特法则

泪湿孤枕 提交于 2020-03-23 17:23:13

1定义

迪米特法则又叫做最少知识原则,也就是说,一个对象应当对其他对象尽可能少的了解。不和陌生人说话。英文简写为: LoD。

2来源历史

1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等普及。后来,因为在经典著作《 The Pragmatic Programmer》而广为人知。

3作用

一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

迪米特法则的意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。

4原理与实现

迪米特法则强调了一下两点:

一、从被依赖者的角度来说:只暴露应该暴露的方法或者属性,即在编写相关的类的时候确定方法/属性的权限。

//计算机类

public class Computer{

    private void saveCurrentTask(){

        //do something

    }

    private void closeService(){

        //do something

    }

    private void closeScreen(){

        //do something

    }

   

    private void closePower(){

        //do something

    }

   

    public void close(){

        saveCurrentTask();

        closeService();

        closeScreen();

        closePower();

    }

}

 

//人

public class Person{

    private Computer c;

    ...

 

    public  void clickCloseButton(){

       c.close();

    }

}

 

 

二、从依赖者的角度来说,只依赖应该依赖的对象。


 

 

//操作系统
public class System{
    private void saveCurrentTask(){
        //do something
    }
    private void closeService(){
        //do something
    }
    private void closeScreen(){
        //do something
    }
    
    private void closePower(){
        //do something
    }
    
    public void close(){
        saveCurrentTask();
        closeService();
        closeScreen();
        closePower();
    }
}
 
//硬件设备容器
public class Container{
    private System mSystem;
    
    public void sendCloseCommand(){
        mSystem.close();
    }
}
 
//人
ublic class Person{
    private Container c;
    ....
    
    public void clickCloseButton(){
       c.sendCloseCommand();
    }
}
 

迪米特法则的核心观念就是类间解耦,弱耦合。只有弱耦合了之后,类的复用才可以提高,类变更的风险才可以减低。

 

 

参考链接:

https://www.cnblogs.com/xiaobai1226/p/8670245.html

https://www.jianshu.com/p/4b244f132439

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!