迪米特法则

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*> *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*> *)students; @implementation GroupLeader - (void)count:(NSArray*> *)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. 迪米特法则的缺点
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。
但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。

 

你可能感兴趣的:(迪米特法则)