阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

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

关注

评论

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

【IT小知识】扩容是什么意思?扩容的近义词有哪些?

行云管家

扩容 IT运维

给跪了!阿里P7技术专家进阶必备,架构进阶宝典

做梦都在改BUG

Java 进阶 架构师

分析 | NFTScan NFT API 在加密钱包开发中的应用

NFT Research

API NFT

2023金三银四最新Java面试题大全(整理版)1000+面试题附答案详解

架构师之道

程序员 java面试

京东三面:说说synchronized和volatile的区别

Java你猿哥

Java 面试 ssm 面经 Java多线程

GPT-4:不open的OpenAI,终于不再编造事实

鼎道智联

openai ChatGPT4

StyleGAN 生成 AI 虚拟人脸,再也不怕侵犯肖像权

极客飞兔

人工智能 AI 图像处理 StyleGAN 人脸生成

Go Slice 扩容的这些坑你踩过吗?

王中阳Go

Go golang 高效工作 学习方法 面试题

Java体系最强干货分享—挑战40天准备Java面试,最快拿到offer!

Java你猿哥

Java 后端 ssm 面经 春招

EMQ&南洋万邦云边一体化方案:激活数据潜力,打造智慧工业园区

EMQ映云科技

物联网 IoT 工业互联网 智能制造 企业号 3 月 PK 榜

GPT-4:我不是来抢你饭碗的,我是来抢你锅的

这我可不懂

低代码 ChatGPT JNPF GPT-4

Apache Doris 1.2.3 Release 版本正式发布

SelectDB

数据仓库 数据湖 Doris 数据湖Catalog catalog

轻松搞定面试拿offer的Java面试宝典(全彩图文版)24个Java技术栈

Java你猿哥

Java 面试 ssm 面经 java技术栈

想稳中求进?字节大佬的硬核学习神器《图解Java并发编程》看了吗

Java你猿哥

Java 面试 Java并发 ssm 面经

Portraiture最新版插件新增哪些功能?

茶色酒

Portraiture4

GO语言集成开发: GoLand 2022 中文激活版

真大的脸盆

Mac 代码开发 Mac 软件 代码编辑 代码编辑工具

阿里巴巴灵魂一问:说说触发HashMap死循环根因

Java你猿哥

Java jdk 后端 ssm

见技术大佬,领惊喜好礼!快来领取数据库峰会邀请函!

InfoQ写作社区官方

数据库 云原生 阿里 热门活动 阿里云瑶池数据库峰会

3月27日“文心一言云服务”系列产品将发布 已有21家企业签约

Geek_2d6073

MQTT 5.0特性Inflight Window&Message Queue

EMQ映云科技

物联网 IoT mqtt emqx 企业号 3 月 PK 榜

币安欧意交易所合约跟单平台软件开发详情(api对接)

开发微hkkf5566

美团二面特点:喜欢写一个 SQL 语句,然后问你加了哪些锁!

Java你猿哥

Java 数据库 sql ssm InnoDB存储引擎

如何利用ChatGPT搞科研?

Openlab_cosmoplat

人工智能 开源社区 ChatGPT

如何基于 Apache Doris 与 Apache Flink 快速构建极速易用的实时数仓

SelectDB

flink 数据湖 实时数仓 Doris 数据库、

中小企业运维安全审计用什么软件好?有推荐吗?

行云管家

信息安全 堡垒机 运维审计

爱了!阿里P8纯手码出489页SQL优化手册,附笔记源码

做梦都在改BUG

Java 数据库 sql 面试

TechBits | TCP 使用 WireShark 进行抓包

Java你猿哥

Java 后端 ssm

硬核!腾讯大佬最新手打的Spring Boot笔记,从原理到实战再到源码

Java你猿哥

Java Spring Boot 后端 面经

代码实战带你了解深度学习中的混合精度训练

华为云开发者联盟

人工智能 深度学习 华为云 华为云开发者联盟 企业号 3 月 PK 榜

Atlassian Server用户新选择 | 迁移到数据中心版前,您需要做这些准备(1)

龙智—DevSecOps解决方案

Atlassian Atlassian迁移 数据中心版 server版

CorelDRAW Graphics Suite2023功能介绍

茶色酒

cdr2023

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