迪米特法则学习笔记

迪米特法则是设计模式所需要遵循的法则之一
所谓的迪米特法则:
定义如下:一个对象应该对其他对象保持最少的了解,类与类之间的关系越密切,耦合度越大,当一个类发生改变的时候。对另外一个类的影响也越大。所以应该尽量降低类与类之间的耦合度
迪米特法则又叫做最少知道原则,指的是一个类对自己依赖的类知道的越少越好,迪米特法则还有一个更加简单的定义:只和直接的朋友通信,
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等等。其中,我么称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友,也就是还说,陌生的类最好不要作为局部变量的形式出现在类的内部

我在网上找讲解迪米特法则的简单例子,很多用java做实例,还是这个耳熟能详的老师让体育委员计算女生数目的例子。好,那我给PHP做实例的这个写个注释吧。原文地址是http://my.oschina.net/shyl/blog/531542

下面是违反迪米特法则的代码实例:

class Teacher {
    //老师对学生发布命令,清一下女生
    public function commond(GroupLeader $groupLeader){
        //初始化女生
        for($i=0; $i<20; $i++){
            $listGirls[] = new Girl();
        }
        //告诉体育委员开始执行清查任务
        $groupLeader -> countGirls($listGirls);
    }
}
 
class GroupLeader {
    //有清查女生的工作
    public function countGirls($listGirls = array()){
        echo '女生的数量是:' . sizeof($listGirls);
    }
}
 
class Girl {
 
}
 
class Client {
    public static function doing() {
        $teacher= new Teacher();
        //老师发布命令
        $teacher -> commond(new GroupLeader());
    }
}
 
Client :: doing();

代码完美运行:下面是运行结果


但是这段代码是违反迪米特法则的,为什么这么说呢,迪米特法则:只和直接的朋友类通信。我们看Teacher类,他的直接的朋友其实只有一个GroupLeader类,这个类出现在Teacher类的方法参数上(另外两种方式是出现在成员变量或者返回值上)。所以按照迪米特法则的规定Teacher类只能与GroupLeader类进行通信,但是在commond方法中,居然使用了Girl类。Girl类不是Teacher类的直接朋友。

我们来看优化后的代码,作者把使用Girl类的部分代码挪移到了场景客户端。

<?php
header("content-type:text/html;charset=utf8");
class Teacher {
 
    public function commond(GroupLeader $groupLeader){
        //告诉体育委员开始执行清查任务
        $groupLeader -> countGirls();
    }
}
 
class GroupLeader {
    private $_listGirls = array();
    //传递全班的女生
    public function __construct($listGirls){
        $this -> _listGirls = $listGirls;
    }
 
    //有清查女生的工作
    public function countGirls(){
        echo "女生数量是:" . sizeof($this -> _listGirls);
    }   
}
 
class Girl {
 
}
 
class Client {
 
    public static function doing() {    
 
        //初始化女生
        for($i=0; $i<22; $i++){
            $listGirls[] = new Girl();
        }
     
        $teacher= new Teacher();
        //老师发布命令
        $teacher -> commond(new GroupLeader($listGirls));
    }
}
 
Client :: doing();
?>
这样就符合迪米特法则了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值