一、定义
1、应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,及对其他依赖的类越来越少(不要和太多的类发生关系)。
2、尽量不要让类和类之间建立直接的关系,这样可以减少类之间的依赖,降低类之间的耦合。
3、一个类应该对自己需要耦合的类知道的最少,只知道其public方法,其内部如何复杂跟自己没有关系,也叫最少知识原则。
二、迪米特法则
核心观念是类间解耦、低耦合,类的复用率才可以提高
1、只和直接朋友交流
每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,组合、聚合、依赖等。
直接朋友定义:出现在成员变量、方法的输入参数和返回值的类成为朋友类
非朋友:出现在方法体内部的类。
编程实验:体育委员点名:
//违反迪米特法则的设计
#include <iostream>
#include <list>
using namespace std;
//Girl类
class Girl
{
};
//体育委员类
class GroupLeader
{
public:
void countGirls(list<Girl>& list)
{
cout << "女生的数量是: " << list.size() << endl;
}
};
//老师类
class Teacher
{
public:
//老师叫体育委员清点女生人数
void command(GroupLeader& groupLeader)
{
//方法内的类,与Teacher不是朋友关系
//<span style="color:#ff0000;"><strong>但这样的设计会使Teacher对Girl类产生依赖</strong></span>,违反Lod法则
list<Girl> listGirls;
//初始化女生
for (int i = 0; i < 20; i++)
{
Girl g;
listGirls.push_back(g); //会复制一份过去
}
groupLeader.countGirls(listGirls);
}
};
int main()
{
Teacher teacher;
GroupLeader groupLeader;
//老师发布命令
teacher.command(groupLeader);
cin.get();
return 0;
}
//遵循迪米特设计原则:
#include <iostream>
#include <list>
using namespace std;
//Girl类
class Girl
{
};
//体育委员类
class GroupLeader
{
private:
list<Girl>& listGirls;
public:
//构造函数
GroupLeader(list<Girl>& _list) : listGirls(_list)
{
}
void countGirls()
{
cout << "女生的数量是: " << listGirls.size() << endl;
}
};
//老师类:与Girl类解耦
class Teacher
{
public:
//老师叫体育委员清点女生人数
void command(GroupLeader& groupLeader)
{
groupLeader.countGirls();
}
};
int main()
{
Teacher teacher;
list<Girl> listGirls;
//初始化女生
for (int i = 0; i < 20; i++)
{
Girl g;
listGirls.push_back(g); //会复制一份过去
}
GroupLeader groupleader(listGirls);
//老师发布命令
teacher.command(groupleader);
cin.get();
return 0;
}
2、朋友之间也是有距离的
//知道得太多:InstallSoftware类和Wizard的耦合太紧
//松耦合:隐藏Wizard类安装步骤的接口,降低耦合度
3、是自己的就是自己的
当某个方法放在本类可以,放在其他类也没错,那么根据迪米特法则,可以在不增加类间的关系,也不对本类产生负
面影响,就放置在本类中。
三、最佳实践
1、迪米特法则的核心观念:类间解耦、弱耦合。实际应用中,如果一个类跳转两次以上才能访问到另一个类,就需
要想办法进行重构了。
2、解耦是有限度的,在实际项目中,需要适度考虑这个原则。