连载:面向对象葵花宝典:思想、技巧与实践(28) - 设计原则:内聚&耦合

简介:

前面通过实例讲解了一个一环扣一环的面向对象的开发流程:用例模型 -> 领域模型 -> 设计模型(类模型 + 动态模型),解答了面向对象如何做的问题。接下来我们就要讲“如何做好面向对象设计”的技巧了


===================================================================

【内聚】

参考维基百科的解释,内聚的含义如下:

cohesion refers to the degree to which the elements of a module belong together.

(http://en.wikipedia.org/wiki/Cohesion_(computer_science))

翻译一下即:内聚指一个模块内部元素彼此结合的紧密程度

 

看起来很好理解,但深入思考一下,其实没有那么简单。

首先:“模块”如何理解?

你一定会说,“模块”当然就是我们所说的系统里的“XX模块”了,例如一个ERP系统的“权限”模块,一个电子商务的“支付”模块,一个论坛网站的“用户管理”模块。。。。。。等等

 

你说的没错,但在面向对象领域,谈到“内聚”的时候,模块的概念远远不止我们通常所理解的“系统内的某个模块”这个范围,而是可大可小,大到一个子系统,小到一个函数,你都可以理解为内聚里所说的“模块”。

 

所以,你可以用“内聚”来判断一个函数设计是否合理,一个类设计是否合理,一个接口设计是否合理,一个包设计是否合理,一个模块/子系统设计是否合理。

 

其次:“元素”究竟是什么?

有了前面对“模块”的深入研究后,元素的含义就比较容易明确了(不同语言稍有不同)。

函数:函数的元素就是“代码”

类/接口:类的元素是“函数、属性”

包:包的元素是“类、接口、全局数据”等

模块:模块的元素是“包、命名空间”等

 

再次:“结合”是什么?

英文的原文是“belong”,有“属于”的意思,翻译成中文“结合”,更加贴近中文的理解。但“结合”本身这个词容易引起误解。绝大部分人看到“结合”这个单词,想到的肯定是“你中有我、我中有你”这样的含义,甚至可能会联想到“美女和帅哥”的结合,抑或“青蛙王子和公主”的结合这种情况。

这样的理解本身也并没有错,但比较狭隘。

我们以类的设计为例:假如一个类里面的函数都是只依赖本类其它函数(当然不能循环调用啦),那内聚性肯定是最好的,因为“结合”得很紧密。

 

但如果这个类的函数并不依赖本类的函数呢?我们就一定能说这个类的内聚性不好么?

其实也不尽然,最常见的就是CRUD操作类,这几个函数相互之间没有任何结合关系(某些设计可能会先查询再修改,但这样的设计不是事务安全的),但其实这几个函数的内聚性非常高。

 

所以,关于内聚的结合概念,我认为不是非常恰当的描述。那么,就究竟什么才是真正的“内聚”呢?

答案就藏在显而易见的地方,翻开你的词典,仔细看看cohesion的含义,你会看到另外一个解释:凝聚力!

 

“凝聚力”就是“内聚”的核心思想,抛开面向对象不谈,我们日常工作中几乎随处可见“凝聚力”:

你可能会说,你的团队很有凝聚力。。。。。。

领导可能会说:我们要增强团队的凝聚力。。。。。。

成功学大师会说:凝聚力是一个团队成功的基石。。。。。。。

 

面向对象领域的“凝聚力”,和团队的“凝聚力”是一样的概念。

l 判断团队凝聚力时,我们关注团队成员是否都专注于团队的目标;判断面向对象模块的凝聚力时,我们同样关注元素是否专注于模块的目标,即:模块本身的职责!

l 判断团队凝聚力时,我们还会关注团队成员之间是否互相吸引和帮助;判断面向对象模块凝聚力时,我们同样关注元素间的结合关系;

 

虽然判断内聚性的时候我们会考虑元素的结合情况,但其实是否专注模块的职责,才是内聚性的充要条件

当模块的元素全部都专注于模块的职责的时候,即使元素间的结合不是很紧密,也是符合内聚性的要求的,这也是CRUD设计符合内聚性的原因。

 

所以,判断一个模块(函数、类、包、子系统)“内聚性”的高低,最重要的是关注模块的元素是否都忠于模块的职责,简单来说就是“不要挂羊头卖狗肉”


【耦合】

参考维基百科,耦合的定义如下:

 coupling or dependency is the degree to which each program module relies on each one of the other modules

(http://en.wikipedia.org/wiki/Coupling_(computer_science))

简单翻译一下:耦合(或者称依赖)是程序模块相互之间的依赖程度。

 

从定义来看,耦合和内聚是相反的:内聚关注模块内部的元素结合程度,耦合关注模块之间的依赖程度

 

理解耦合的关键有两点:什么是模块,什么是依赖。

 

什么是模块?

模块和内聚里面提到的模块一样,耦合中的模块其实也是可大可小。常见的模块有:函数、类、包、子模块、子系统等

 

什么是依赖?

依赖这个词很好理解,通俗的讲就是某个模块用到了另外一个模块的一些元素

例如:A类使用了B类作为参数,A类的函数中使用了B类来完成某些功能。。。。。。等等


================================================ 
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/24481189
================================================ 


相关文章
|
监控 安全 数据可视化
Grafana 安全性和权限管理
【8月更文第29天】Grafana 是一个广泛使用的开源平台,用于可视化和监控时间序列数据。随着 Grafana 在生产环境中的广泛采用,确保其安全性变得至关重要。本文将探讨如何配置 Grafana 的访问控制和安全设置以保护敏感数据,并提供一些具体的代码示例。
1735 3
|
弹性计算 缓存 安全
阿里云服务器ECS收费标准参考,2核4G配置ECS实例规格整理
阿里云提供多种2核4G ECS实例,如计算型c7、经济型e、u1等,价格不等,从68.0元/月到203.0元/月。ECS通用算力型u1实例采用高性能Intel处理器,网络收发包能力达30万PPS。经济型e实例基于Intel Xeon Platinum,适合入门级需求。2核4G服务器支持的并发访问人数依赖于软件效率、带宽、应用架构和用户行为等因素。更多信息请查看阿里云ECS产品页。
577 1
|
芯片
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
1309 0
|
UED 开发者
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
高级动画可以显著提升用户体验,为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画,包括弹性动画、透明度渐变和旋转缩放组合动画等示例。
403 12
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
|
11月前
|
存储 人工智能 程序员
【C语言】一篇通关所有 “关键字”,值得收藏篇!
关键字是编程语言预定义的保留词,代表特定的操作或结构。C语言中的关键字用于定义变量类型、控制语句、存储类、数据类型等。使用这些关键字可以创建函数、控制程序的流程、声明变量和常量等。
2147 0
|
Go vr&ar 图形学
重塑体验:AR/VR技术在游戏与娱乐行业的创新应用
【10月更文挑战第29天】本文探讨了AR/VR技术如何改变游戏与娱乐行业,介绍了AR和VR的基本概念及其在游戏和娱乐中的应用实例,包括《精灵宝可梦GO》的AR开发和VR视频播放器的实现代码,并展望了未来的发展趋势。
816 2
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
571 5
|
人工智能 运维 Cloud Native
全新启航!阿里云向量检索服务Milvus版正式上线!
由阿里云与 Zilliz 联合推出的业内领先的云原生向量检索引擎 - 阿里云向量检索服务 Milvus 版在杭州、上海、北京、深圳四大 region 正式可用并开放公测!
|
新能源
【2023年第十三届APMCM亚太地区大学生数学建模竞赛】C题 中国新能源电动汽车的发展趋势 44页论文、数据及代码
本文在2023年第十三届APMCM亚太地区大学生数学建模竞赛中针对中国新能源电动汽车的发展趋势进行深入研究,建立了多元线性回归、时间序列和机理模型,分析了影响因素、预测了未来发展趋势,并探讨了对全球汽车产业及生态环境的影响,提供了相应的政策分析和市民宣传信。
466 2
|
SQL 分布式数据库 数据库
OceanBase数据库
【8月更文挑战第8天】OceanBase数据库
409 2