QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

内聚对 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:181093
用户头像

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

关注

评论

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

从 Object.assign 开始了解ES2015

devpoint

浅拷贝和深拷贝 ECMAScript 6 assign

dubbo-go v3 版本 go module 踩坑记

apache/dubbo-go

Apache dubbo dubbo-go

专家谈 AI:2021 年人工智能发展趋势(下)

容光

日志收集组件—Flume、Logstash、Filebeat对比

数据社

大数据 5月日更

盘点golang中的开发神器

捉虫大师

Go 语言

5分钟速读之Rust权威指南(十二)

wzx

rust

人生算法:找到可复制的最小内核

石云升

读书笔记 5月日更 人生算法

区块链与数字化转型的关系

CECBC

Golang最细节篇— struct{} 空结构体究竟是啥?

奇伢云存储

云存储 Go 语言

2021智能制造、智慧金融、智能安全有何发展趋势

容光

AI 金融

极光开发者周刊【No.0528】

极光JIGUANG

程序员 开发者 开发者工具

技术栈,我该拿你怎么简化?

VoltDB

数据分析 5G 堆栈 边缘计算

《看板方法官方指南》中文版发布了!

Bruce Talk

敏捷 Kanban Agile

网络攻防学习笔记 Day28

穿过生命散发芬芳

5月日更 网络攻防

全国首创“区块链+信用”平台即将上线

CECBC

【得物技术】得物App分发平台的探索建设历程

得物技术

效率 平台 实践 心路历程 迭代

智能IP先锋:从园区网络智能变革,到数字化转型新突破

脑极体

发展农村数字普惠金融的问题及对策分析

CECBC

2021北京人工智能展览会-转述

容光

2021年CES十款智能家居黑科技产品

容光

人工智能

【Flutter 专题】125 图解自传 ACE_ICON.ttf 图标库

阿策小和尚

5月日更 Flutter 小菜 0 基础学习 Flutter Android 小菜鸟

python脚本编写——自动剪切移动文件夹

YUKI0506

智慧金融发展-转述

容光

运营管理

Qien Z.

5月日更

Go 并发编程-channel 连接一切

Rayjun

Go 语言

技术管理课学习笔记 01

escray

学习 极客时间 5月日更

想要成为架构师?你只要满足这些条件就可以

华为云开发者联盟

设计 工程师 架构师 软件系统 软件架构师

🔎【Java 源码探索】深入浅出的分析ThreadLocal

码界西柚

Java 多线程 ThreadLocal 5月日更 ThreadLocalMap

虚拟机如何实现synchronized

wzh

虚拟机 并发 synchronized Java EE

数智化社会供应链助力消费体验提升 京东图书千万好书“先5折再满减”

科技范儿

AI、智能健康与货币技术迎来大爆炸

容光

区块链 AI

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