该原则也叫作迪米特法则,还是这个名字高大上。。。

  通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。该原则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

  当设计一个系统,不管他是什么对象,我们都需要注意他所交互的类有哪些,并注意这些类是如何交互的。该原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,维护的成本也随之变得不可估量了。。。

  如何遵守这个原则?

  就任何对象而言,在该对象的方法内,应该调用(综合各种因素,尽量遵守):

  a. 该对象本身;

  b. 被当做方法的参数而传递进来的对象;

  c. 此方法所创建的或实例化的对象;

  d. 对象的任何组件。。。

代码示例A:(未遵守原则)

public float GetTemp()
{
    C c = D.GetC();      
    return c.GetTemperature();
}

代码示例B:(遵守原则)

public float GetTemp()
{
    return D.GetTemperature();
}

  对比代码示例A,B。代码示例A中,从对象D中取到对象C,再从对象C中获取温度值;而代码示例B中,直接从对象D中获取温度值,这样可以减少我们所依赖的对象的个数。

代码示例C:(较全面)

public class Car
{
    // 下面注释对应上面的原则(a,b,c,d)
    Engine engine;                       // d   

    public Car() {}                              

    public void Start(Key key)           // b   
    {
        Doors doors = new Doors();       // c
        boolean bIsOK = key.Turns();     // b

        if(bIsOK)
        {
            engine.Start();              // d      
            UpdateDash();                // a  
            doors.Lock();                // c   
        }
    }

    public void UpdateDash() {}
}

 

posted on 2014-03-06 12:50  花爱春  阅读(1478)  评论(0编辑  收藏  举报