耦合

选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。

耦合

上一节我们重点关注了扇出的内容,以及用例子说明了如果才能将一个函数或者模块的代码通过重构来达到一个合理的扇出值。今天我们来理解耦合:

耦合是关注模块是如何组合在一起的,增加子模块或者可以减少扇出的值,但是不能减少原始模块对最初依赖之间的耦合度。本质是将显示依赖变成了间接依赖。

耦合一般有六个级别,它们分别是:

1、内容耦合

内容耦合是最紧的耦合,包括在外部对象上调用方法或者函数,或通过修改外部对象的属性直接修改对象的状态。以下是例子:

O.property = 'blah'; //直接改变外部对象的属性
O.method = function(){} //改变外部对象的方法
O.prototype.methiod = function(){} //直接改变了对象的原型

以上与外部对象O之间都是一种内容耦合。

 

2、公共耦合

比内容耦合略低一点的就是公共耦合。如果两个对象都共享另外一个全局变量,那么这两个对象就有公共耦合了。

var Global = 'global';
Function A() { GLobal = 'A'; };
Function B() { GLobal = 'B'; };

在这里,对象A和对象B就是公共耦合。

 

3、控制耦合

控制耦合比公共耦合的耦合度低一些。该耦合基于标记或者参数设置来控制外部对象。举个例子,创建一个单例抽象工厂,接着传入一个env标记告知该抽象工厂如何操作。这就是一种控制耦合。

var absFactory = new AbstractFactory({ env: 'Test'});

 

4、印记耦合

印记耦合是通过向外部对象传递一个记录,而只只用该记录的一部分。举个例子

O.makeBread({ type: wheat, size:99, name: 'foo'});
O.prototype.makeBread = function(args) {
	return new Bread(args.type. args.size);
}

以上代码中,向makeBread函数传递一个记录,而函数只使用了该记录三个属性中的两个,这就属于印记耦合。

 

5、数据耦合

耦合类型最松散的就是数据耦合。这种耦合发生在一个对象传递给另一个对象消息数据,而没有传递控制外部对象的消息参数。简单理解就是方法调用的时候传递数据,这些数据不能让被调用的方法具有分支逻辑啥的。

 

6、无耦合

最后一种耦合形式就是无耦合,两个对象之间的绝对零耦合。

 

我们用一个例子来说明减少耦合对于代码测试的好处:

function setTable() {
	var cloth = new TableCloth();
	var dishes = new Dishes();
	this.placeTableCloth(cloth);
	this.placeDishes(dishes);
}

我们看这段代码,setTable函数耦合了两个对象TableCloth和Dishes,而我在测试这个方法的时候必须为这两个对象进行模拟,因此代码测试将变得困难。修改成一下依赖注入以后

function setTable(cloth, dishes) {
	this.placeTableCloth(cloth);
	this.placeDishes(dishes);
}

这样修改以后,我通过向函数注入对象,起到了将方法和对象隔离的作用,测试起来也会更加简单。

 

另一种减少耦合的方法就是通过工厂和抽象工厂设计模式来重构代码,感兴趣的可以去网上看看相关的内容。

版权声明:著作权归作者所有。

相关推荐

Python合并多个字典的方法

示例x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} 相同属性合并,后者覆盖前者的值。x和y合并后>>> z {'a': 1, 'b': 3, 'c': 4} Python 3.

Java 8 Stream API转换到Kotlin集合API

Kotlin提供的集合操作的API相对Java 8 Stream的API简洁很多。下面是Java 8 Stream API转换到Kotlin集合API。 映射属性聚合为列表// Java:   List<String> names = users.stream().m

Kotlin集合扩展函数 - 创建集合

Kotlin标准包提供了一系列的扩展函数用来创建集合,包括Array,List,Set,Map以及可变集合。这里需要指出示例里的intList为val intList: List<I­nt> = listOf(1, 2, 3) Array创建数组基本方式val intArray: Array<­Int

Kotlin集合扩展函数 - 转换

Kotlin 集合类型提供了很多用于转换的扩展函数。这里需要指出示例里的intList为val intList: List<I­nt> = listOf(1, 2, 3) associate关联函数:使用转换函数把Array或Iterable转换为Map:数组fun <T, K, V> any_array

Git使用mergetool处理合并冲突

Git做合并时难免会发生冲突,发生冲突我们可以使用git的mergetool来处理。在使用mergetool前需要先了解下Git用于处理冲突的几个概念:LOCAL - 本机在当前分支下文件的headREMOTE - 在远程将要合并到LOCAL当前分支的headBASE - the common ancestor(s) of LOCAL a

Python单个表达式合并字典的方法

有时需要把两个字典合并为一个新的字典。这里记录下以下三种使用单个表达式的来做合并的方式。方式一:自定义合并函数def merge_dictionaries(first_dict, second_dict): merged = first_dict.copy() merged.update(second_dict) return mergedd1 = { "A": "张三", "B":

Python使用一行代码合并字典(Python2,3.5,3.9)

Python字典合并功能说明:对于字典x和y,z,合并后的字典,如果词典中出现重复的key,就会会出现y中的值替换x中的值。Python 3.9+合并词典Python 3.9开始,可以直接使用“|”实现字典的合并。z = x | y   Python 3.5+合并词典从Python 3.5开始,可以使用**扩展符,来进行合并。z = {**x, **y}Python 2 - P

合并多个git仓库,保留提交的历史记录

两个不同地址的库:https://127.0.0.1/mygroup/project1.git,分支devhttps://127.0.0.1/mygroup/project2.git,分支dev现在需要把这两个git仓库的dev分支合并到一个新的git仓库的dev分支:https://127.0.0.1/mygroup/allprojects.git按以下步骤操作:一、克隆allproject到本