迪米特法则

1. 迪米特法则的概念

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD

迪米特法则可以简单说成:talk only to your immediate friends。 对于OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

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

2. 迪米特法则的多种含义

首先是只和朋友交流(Only talk to your immediate friends),出现在成员变量、方法的输入输出参数中的类称为成员朋友类。而出现在方法体内部的类不属于朋友类。其次是朋友之间也是有距离的不能暴露太多,否则二次修改的时候,会让影响的范围增大。这也要求类间public方法不能肆无忌惮的暴露。然后是自己的就是自己的,如果一个方法在类间关系中,放在自身类中既不增加类间关系,也对本类不产生负面影响就放置在自身类中。最后是谨慎进行序列化操作。

3. 迪米特法则举例

举例子说明什么是朋友,什么是直接的朋友。

老师让班长清点全班同学的人数。这个例子中总共有三个类:老师Teacher、班长GroupLeader和学生Student

老师类:

//命令班长清点人数
- (void)command:(GroupLeader *)groupLeader;

@end

@implementation Teacher

- (void)command:(GroupLeader *)groupLeader{

    //创建全班学生的数组
    NSMutableArray<Student *> *students = [[NSMutableArray alloc] init];
    for (int i = 0; i < 20; i++) {
        Student *student = [[Student alloc] init];
        [students addObject:student];
    }

    //让班长清点人数
    [groupLeader count:students];
}
班长类:

//清点人数
- (void)count:(NSArray<Student *> *)students;
@implementation GroupLeader

- (void)count:(NSArray<Student *> *)students{
    //直接打印出学生的人数
    NSLog(@"上课人数是:%d",(int)students.count);
}

学生类:
@interface Student : NSObject

@end

@implementation Student

@end
场景:
int main(int argc, const char * argv[]) {

    //创建班长对象
    GroupLeader *groupLeader = [[GroupLeader alloc] init];

    //创建老师对象
    Teacher *teacher = [[Teacher alloc] init];
    
    //老师命令班长清点人数
    [teacher command:groupLeader];

    return 0;
}
分析:老师有几个朋友?有两个,一个是班长,因为是老师的命令方法的输入参数,另一个是学术,因为在老师的命令方法中使用了学生。
按照直接的朋友的定义“出现在成员变量、方法的输入输出参数中的类就是直接的朋友”,只有班长是老师的直接的朋友。
4. 迪米特法则的缺点
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。
但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。

 

posted @ 2020-03-24 18:01  jyqdaisy  阅读(466)  评论(0编辑  收藏  举报