写点什么

内聚对 SOA 是否重要?

  • 2008-04-30
  • 本文字数:2749 字

    阅读完需:约 9 分钟

早在 2005 年,当时 Steve Vinoski 还就职于 IONA 公司,他就发表过一篇关于内聚(Cohesion)耦合(Coupling)文章。在文中,他提到了这些年来已识别的 3 种“恰当的”内聚类型:

  • 功能内聚(Functional Cohesion):一个模块只做一件事。它们表现出了低耦合与高度重用。
  • 顺序内聚(Sequential Cohesion):一个模块包含多个需按一定次序执行的任务。
  • 通讯内聚(Communication Cohesion):一个模块包含多个基于相同输入的操作,但这些操作在执行次序方面没有任何要求。

然后,他又提到了四种“糟糕的”内聚:- 过程内聚(Procedural Cohesion):与顺序内聚相似,只不过各个任务所处理的数据各有不同。正如 Steve 所说:“这种内聚常常是‘为降低耦合度,人为把活动分组’的结果”。

  • 时间内聚(Temporal Cohesion):一个模块里的任务仅在时间上相关。“如果有任务要换在别的时间执行,那么这种模块会带来维护上的难题。”
  • 逻辑内聚(Logical Cohesion):一个模块里的活动由于“看似具有共同的实现”而被聚集起来。
  • 偶然内聚(Coincidental Cohesion):一个模块里的任务的唯一共同之处,就是它们均在此模块之中。

正如 Steve 所说: > 正如同耦合(coupling)一样,内聚(cohesion)对于分布式对象与服务来说仍然重要。例如,如果你仅仅因为一组方法具有相似的实现就把它们放在一个对象里,那么你将犯“创建逻辑内聚对象(logically cohesive object)”的错误。

该文最后总结: > 考虑到向“新的”计算方式的转变常常伴随着对旧的方式的直接批评,所以如今对 SOA 的关注引起对分布式对象的激烈反对并不出乎意料。不幸的是,其实许多适合分布式对象系统的质量标准也同样适用于分布式服务与 SOA。因此,有些人为了顺应潮流而被迫忽略它们是十分遗憾的。不过,也许不要紧,因为我们可以直接追溯到对象之前的时期,搞清楚像耦合和内聚这样的度量标准,并重新运用它们。

这在近年来也许已经不怎么被注意了,直到 Jim Webber 最近写了一篇关于“贫血的服务模型(Anemic Service Model)”的文章。Jim 简述了过去对良好的软件工程实践的讨论,他说的一些话跟 Steve 先前的非常相似: > 有些软件是高内聚、紧耦合的。这意味着,尽管它经过合理的设计,但由于存在紧密的相互依赖关系,所以不容易被修改。那是很糟糕的;而且很不幸地是,这在企业应用中很常见。还记得若干年前的确给你留下深刻印象,但如今维护起来却令你痛苦不堪的软件吗?原因就在于它是紧耦合的。 松耦合、低内聚的软件是另一种糟糕的软件。这意味着模块之间少有明显的相互依赖;但是,没有一个模块是在系统中某方面处于权威地位的。这进而造成需用“散弹法(scattergun approach)”来解决持续的系统演化,因为即使很小的改动也会波及多个组件或系统。也就是我们今天所认识到的SOA。

接着,该文继续讨论目前的SOA 思想完全与这一状况相悖: > 一方面,我们倾向于(而且确实在SOA 那帮人的怂恿之下)认为这种架构是非常符合目标的,因为它是极度松耦合的。既然每个组件或服务都与其他别的组件或服务没有耦合,那么应该可以像玩乐高积木那样、按无数种方式来组织或调整它们。书上教我们用一组基础服务来构建“业务服务(business services)”。事实上,我们甚至可以用BPM 工具“选择- 点击”来轻而易举地达到那个目标,从而避免了如开发者与一直伴随左右的变更管理这样的开销。是吗? 不。实际上根本不是。[……] 这是对架构的幻想,在真实世界的企业系统里是不可能的。实际上,一个不解决业务问题的服务根本没有资格进入SOA。

现在这篇文章吸引了不少值得注意的评论。然而,由这篇文章引发的实质性争论已蔓延到了别处, 尤其是Jean-Jacques Dubray 的回应 : > 嗯,有人一直试图单枪匹马地用一种“面向其他架构(Something Else Oriented Architecture)”来推翻SOA,那就是 MEST 支持者 Jim Webber。[……] 我觉得他这篇文章纯属误导。也许有些地方我理解不当,但 Jim 说的是内聚与松耦合的关系。[……] 在我看来,内聚(cohesion)听起来是个不错的工程原则,它很像“依赖结构矩阵(Dependency Structure Matrix)”。[……] 松耦合(loose coupling)的目标正是降低内聚。一个互联的(connected)系统是不存在内聚的。内聚和耦合不可能同时存在。即使在英语里,把这两个词联系在一起也是很糟糕的。松耦合的目标,是使得在不同时间、用不同技术、具有不同安全模型的代码片断可以一同工作。

SOA 是要远离内聚的系统、转而支持更广泛的重用场景。多层内聚的系统提供“多层”(像库一样的)重用模型:上层可以重用下层。不幸的是,它强迫我们以一种与理想的信息系统架构不兼容的方式来创建系统。问题出在内聚,而解决之道在于松耦合。Jim,你真以为人们都在试图“把东西放在一个模块里”吗?

Jean-Jacques 提出,尽管内聚是一个被充分理解的软件工程原则,不过它跟“当代”SOA 并不相关: > 有些人老拿他们 5 年前形成的观念来看“SOA”,而那只是被他们自己错误理解的 SOA,这种情形让我觉得越来越不愉快。Jim 所展现的是一幅陈旧的、并不能代表 2008 年的 SOA 的情景。

之后,Jean-Jacques 又继续讨论了Steve 最初那篇文章: > ……对于服务的接口与实现设计,内聚(cohesion)完全是一种没有必要的约束,它实际上会降低一个服务的重用程度、并减弱它参与不同组装的能力。也许我们该对现代松耦合的概念作一些了解了,比如:双向接口(bi-directional interfaces)、组装(assemblies)、编制语言(orchestration languages)、可扩展及语义可达的数据结构(extensible and semantically accessible data structures)。过去设计出那些古老的编程技巧,就是因为编程模型里没有这些概念。

但是争论仍在继续。内聚跟SOA 是不是本质对立的?例如,我们是否需要重写软件工程书籍以涵盖跟SOA 有关的内聚?当然,内聚本身并无坏处;不过,也许内聚跟耦合一样是分不同程度的,而且不能搞一刀切?英文原文: Is Cohesion Important for SOA?


译者简介:徐涵,中文 W3C 技术推广网站 W3China(w3china.org)创始人,开放翻译计划(transwiki.org)发起人,W3C 特邀专家。2005 年毕业于东南大学,获计算机硕士学位。2003 年创办中文 W3C 技术推广网站 W3China(w3china.org),2004 年发起开放翻译计划(transwiki.org)致力于 W3C 技术文档的翻译,2006 年翻译出版国内首本中文 SOA 专著《Understanding SOA with Web Services 中文版》(荣获 2006 年度 CSDN 读书频道 SOA 先锋奖,入选 China-pub 2006 年度好书榜),2008 年翻译出版 REST 专著《RESTful Web Services 中文版》。研究兴趣包括:Web Architecture、Semantic Web、Web Services、SOA、Social Network 等。联系方式: hanxu@w3china.org 。参与 InfoQ 中文站内容建设,请邮件至 china-editorial@infoq.com

2008-04-30 05:18982
用户头像

发布了 63 篇内容, 共 26.2 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

代码整洁之道

田维常

代码

灵雀云开源项目 Kube-OVN 亮相开源基础设施峰会

York

灵雀云 Kubernetes k8s Kube-OVN

ETL都没弄懂,谈什么大数据 ?我用一分钟给你整明白

智分析

ETL

软件测试--缺陷报告

测试人生路

软件测试

灵雀云Kube-OVN:基于OVN的开源Kubernetes网络实践

York

灵雀云 Kubernetes k8s Kube-OVN

大作业一:架构设计方案评审

Nick~毓

Kube-OVN 0.5.0 发布,支持 NetworkPolicy、用户自定义网卡和MTU

York

灵雀云 Kubernetes k8s Kube-OVN

“持证”就能上岗 京东绿色内推招聘通道开启

京东科技开发者

云计算 大数据 程序人生

中国特色新基建可视化,工程监控画面还能这么美?你绝对没见过

一只数据鲸鱼

物联网 新基建 数据可视化 绿色工业

软件界旷世之架:测试驱动开发(TDD)之争

华为云开发者联盟

软件 测试 TDD 代码 devcloud

技术实录 | 灵雀云基于 OVN 的 Kubernetes 网络架构解析

York

灵雀云 Kubernetes k8s Kube-OVN

一份阿里Java学习路线出现“病毒式”传播,导致44人秋招同时拿到offer

Java架构师迁哥

Python进阶系列文章汇总

Kaito

Python 爬虫

架构师训练营技术知识点

三板斧

架构师训练营第 1 期

腾讯大佬亲自总结出“Java知识地图+学习路线”从点到面一应俱全!不看血亏

比伯

Java 编程 架构 程序人生 计算机

再谈自研开源Kube-OVN, 设计思路及实现原理

York

灵雀云 Kubernetes k8s Kube-OVN

Kube-OVN 0.6.0 发布,支持 IPv6、流量镜像及更多功能

York

灵雀云 Kubernetes k8s Kube-OVN

新思科技网络安全研究中心发现Bouncy Castle中的漏洞

InfoQ_434670063458

新思科技 Bouncy Castle

SpringCloud从入门到精通01---父项目创建

Felix

SpringCloud Eureka 高可用架构

Yarn RM写ZNode超数据量限制bug修复

kwang

大数据 zookeeper YARN

Kube-OVN再更新! v0.8.0 支持网关高可用以及网络监控集成

York

灵雀云 Kubernetes k8s Kube-OVN

Kube-OVN v0.9.0更新,网络可视化和控制平面稳定性提升

York

灵雀云 Kubernetes k8s Kube-OVN

一个20年技术老兵的 2020 年度技术总结

万俊峰Kevin

微服务 go-zero Go 语言

云算力矿机租赁挖矿APP系统开发|云算力矿机租赁挖矿软件开发

系统开发

Java中定时器Timer致命缺点(附学习方法)

叫练

学习 定时任务 多线程 定时器 技术学习

教小师妹快速入门Maven,嘿嘿嘿...

田维常

maven

SpringCloud从入门到精通02---支付模块01

Felix

Kube-OVN v 0.7.0 发布,IPAM、子网和安全功能增强

York

灵雀云 Kubernetes k8s Kube-OVN

同城快递系统-大作业

三板斧

极客时间架构师一期

Hive的调优你都知道那些?

大数据老哥

大数据 hadoop hive

价值 - 价值的底色(一)

石云升

读书笔记 投资 28天写作 价值

内聚对SOA是否重要?_SOA_Mark Little_InfoQ精选文章