1.什么是耦合?
耦合其实就是程序之间的相关性。
程序之间绝对没有相关性是不可能的,否则也不可能在一个程序中启动,如下图:
这是一个Linux中socket TCP编程的程序流程图,在图中的TCP服务器端,socket()、bind()接口、listen()接口、accept()接口之间肯定存在着相关(就是要调用下一个接口程序必需先调用前一个接口),也就是耦合,否则整个TCP服务器端就建立不起来,以及改变了bind()中的传入的数据,比如端口号,那么接下来的listen()监听的端口,accept()接收连接的端口也会改变,所以它们之间有很强的相关性,属于紧耦合。
2.耦合的形式
(1)数据之间耦合
在同一个结构体或者类中,如:
typedef struct Person
{
int age;
char* name;
}Person;
class Person
{
private:
int age_m;
bool namePresent_m;
std::string name_m;
};
在上面的结构体和类中,年龄和名字两个基本数据单元组合成了一个人数据单元,这两个数据之间就有了耦合,因为它们互相知道,在一些操作中可能需要互相配合操作,当然这两种数据耦合性是比较低的,但是namePresnet_m是判断name_m是否存在的数据,所以这两个数据之间耦合性就高很多了。
(2)函数之间的耦合性
函数如果在一个类中也会互相存在耦合性,比如下面例子:
Class Person
{
Public:
Int getAge(){return age_m;};
Void setAge_v(int age){age_m = age;};
Std::string getName(){return name;};
Void setName(std::string name){name_m = name;};
Private:
Int age_m;
Std::string name_m;
};
其中的getAge()和setAge_v()接口操作的是同一个数据,能够互相影响,存在着很明显的耦合,但是getName()和getAge()两个接口相关性就不明显的,但是也会存在耦合性,因为getName()能够访问的类中数据,getAge()也能访问,如果程序员编写代码不注意,也会把在两个接口中调用到了相同数据,互相造成了影响。
除了封装在一个类中的函数之间有耦合性,外部的函数也会根据业务需要产生耦合,比如刚开始说的网络编程的例子中,socket()、listen()、bind()、accept()之间就产生了很强的耦合。
以及在两个类中,比如: