组合与继承、内聚与耦合、接口设计原则

1822 Views

1. 组合与继承

组合:A类的构建方法里创建B类的对象,整体类与局部类之间松耦合。

继承:子类具有父类的属性和方法或者重新定义、追加属性和方法。

为什么提倡组合代替继承?

子类继承父类的所有公共的、保护的方法,可能有害(无法选择性继承,很多方法在子类中用不到,但是用户可能无意中调用,从而出现错误)违背信息隐藏。

继承在编译期绑定关系,组合在运行期绑定关系(采用面向接口编程)

java只能单继承,无法重用多个类的代码;而一个类可以组合多个类。

2. 内聚与耦合

内聚

模块内部各部分之间的联系。

1 偶然内聚: 指一个模块内的各处理元素之间没有任何联系。

2 逻辑内聚: 指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。

3 时间内聚: 把需要同时执行的动作组合在一起形成的模块为时间内聚模块。

4 通信内聚: 指模块内所有处理元素都在同一个数据结构上操作(有时称之为信息内聚),或者指各处理使用相同的输入数据或者产生相同的输出数据。

5 顺序内聚: 指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素输出就是下一功能元素的输入。

6 功能内聚: 这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。与其他模块的耦合是最弱的。

耦合

模块间的联系。

1 无直接耦合

2 数据耦合: 指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言的值传递;

3 标记耦合: 指两个模块之间传递的是数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址;

4 控制耦合: 指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某一功能;

5 公共耦合: 指通过一个公共数据环境相互作用的那些模块间的耦合。公共耦合的复杂程序随耦合模块的个数增加而增加。

6 内容耦合: 这是最高程度的耦合,也是最差的耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部。

紧耦合

本质是Client/Server的模型。

优点:架构简单、设计简单、开发周期短、能够快速的开发、投入、部署、应用。

缺点:1、同步操作导致对网络资源消耗大。同步操作在数据发送和数据返回之间,有很大一段是空闲的,这种空闲占用是对网络资源的极大浪费。2、安全控制力度差,因为服务器直接暴露给客户机,容易引发网络攻击行为。 3、程序代码之间关联度过高,不利于模块化处理。

松耦合

在client/server模型之间加入一个代理。

优点:1、异步操作减少了网络资源消耗。2、提高安全性,外部攻击在代理服务器被识别和过滤掉。3、多任务并行处理能力增强。

高内聚与低耦合

高内聚:一个模块只做一件事。

低耦合:各个模块之间不会相互依赖。

优点:

可扩展性高。修改一个模块功能时,对其他模块没有影响

减少开发和测试的工作量。

新增模块出现问题时,其他已有模块不受影响。

缺点:

成本高收益低。要付出很多精力设计,而得到的回报却很小。

高内聚低耦合的度量很难把握。

高内聚与低耦合是冲突的。最强的内聚莫过于一个类只写一个函数,这样内聚性绝对是最高的。但这会带来一个明显的问题:类的数量急剧增多,这样就导致了其它类的耦合特别多,于是整个设计就变成了“高内聚高耦合”了。最弱的耦合是一个类将所有的函数都包含了,这样类完全不依赖其它类,耦合性是最低的。但这样会带来一个明显的问题:内聚性很低,于是整个设计就变成了“低耦合低内聚”了。

3. 接口设计的原则

单一职责原则:单接口的职责应尽量单一。

依赖倒置原则:面向接口编程。高层模块不应该依赖低层模块,两种都应该依赖其抽象(接口类)。抽象不应该依赖细节(实现类)。细节应该依赖抽象。

里氏替换原则:子类必须完全实现父类的方法;在类中调用其他类时,务必使用父类或接口。

接口隔离原则:客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上。

迪米特法则:低耦合;一个对象应该对其他对象有最少的了解

开闭原则:一个软件实体(类、模块、函数)应该对扩展开放、对修改关闭

十二星座智商排行榜:谁才是天生的高智商王者?
英特尔i7