2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

探索六边形架构

  • 2014-11-02
  • 本文字数:1119 字

    阅读完需:约 4 分钟

端口和适配器架构风格,也叫做六边形架构,能够清晰地区分领域模型和输入输出设备之间的界限。 lan Cooper 一次演讲中为听众解释了各种架构风格的特性,尤其着重讲解了六边形架构的内容。

分层系统是一种架构风格,它的本质是避免耦合的出现。作为一名具有20 年从业经历的软件开发者及微软的MVP ,lan 相信耦合正是影响软件可维护的最大敌人。尤其是在大规模系统中,耦合的情况越多,想要在进行改动时避免连锁反应就越困难,同时也增加了测试的难度,而对每次改动所造成的影响的理解与合理解释也变得更加困难了。

端口和适配器架构正是一种分层架构,它遵循了分层系统的所有约束与特性。相比起六边形架构,lan 更倾向于使用端口和适配器架构这个名称,因为总有人怀疑六边形的边的数目是否有什么重要意义,其实它并没有任何意义。

一个六边形架构共包括三个层,其中最关键是的领域模型,它包括了所有的应用逻辑与规则。在领域层中不会直接引用技术实现,例如HTTP 上下文或数据库调用,这样就能够确保在技术方面的改动不会影响到领域层面。

包围在领域层之外的是端口层,它负责接收与用例相关的所有请求,这些请求负责在领域层中协调工作。端口层在端口内部作为领域层的边界,在端口外部则扮演了外部实体的角色。

在端口层之外的是适配器层,这一层的技术实现负责以某种格式接收输入、及产生输出。比方如,对于HTTP 请求,适配器会将转换为对领域层的调用,并将领域层传回的响应进行封送,通过HTTP 传回调用客户端。在适配器层不存在领域逻辑,它的唯一职责就是在外部世界与领域层之间进行技术性的转换。适配器能够与端口的某个协议相关联并使用该端口,多个适配器可以使用同一个端口。lan 举了一个例子,在切换到某种新的用户界面时,可以让新界面与老界面同时使用相同的端口。

lan 相信应当专注于对对象行为进行测试,通过对端口直接进行测试,可以忽略用户界面的细节。许多开发者常犯的一个错误是对领域模型的内部细节进行测试,这种方式会影响重构的进程,因为对实现细节的改动将导致测试不通过。正确的单元测试方法是对端口的边界进行测试,边界作为公开的接口,即使它的实现细节发生了变化,接口本身也能保证不受影响。

集成测试仅仅在对配置进行测试时才需要用到,例如在测试 ORM 映射时验证配置是否正确。与之类似,系统测试只在外部边界进行,通过可靠性测试以验证所有的东西都正确地连接在一起了,例如 REST API 能够正常工作,以及类似的一些测试。

Alistair Cockburn 在 2005 年时演示了六边形架构,作为对传统分层架构、耦合与牵连等问题的解决方案。

除此之外还存在着一种变体,就是 Robert C. Martin 在去年谈到干净架构(Clean Architecture)。

查看英文原文: Exploring the Hexagonal Architecture

2014-11-02 04:5812012
用户头像

发布了 428 篇内容, 共 197.8 次阅读, 收获喜欢 39 次。

关注

评论

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

前端基础二之css篇

ベ布小禅

8月日更

MySQL 系列教程之(六)DML 操作:数据的增删改

若尘

数据库 MySQL 数据库 8月日更

价值连城 图灵奖得主Yoshua Bengio约书亚·本吉奥的采访 给AI从业者的建议 John 易筋 ARTS 打卡 Week 60

John(易筋)

ARTS 打卡计划

如何理解 Java 多线程

HoneyMoose

大一一个学期学多少编程算正常?

沉默王二

编程

千亿级模型在离线一致性保障方案详解

百度Geek说

百度 测试 后端

解读短小精悍的 Then 框架

fuyoufang

ios swift 阅读代码 8月日更

Vue进阶(四十):ref ($refs) 用法详解

No Silver Bullet

Vue 8月日更

如何找到程序崩溃的 “凶手” ?

神策技术社区

数据库 程序员 埋点

LeetCode题解:217. 存在重复元素,哈希表,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

使用账号密码来操作github? NO!

程序那些事

Java GitHub 程序那些事

Go1.17正式发布--切片转为数组指针

草原狼

Go 语言

用Python爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话

Python研究者

8月日更

Go语言chan实现原理,彻底搞懂chan读写机制

微客鸟窝

Go 语言 8月日更

webrtc Rtp/rtcp (1)

webrtc developer

基于KubeEdge实现中国移动10086客服云边协同平台

华为云原生团队

云计算 开源 运维 边缘计算 边缘技术

从“人工”到“人工智能”,聊一聊本届东京奥运会的AI黑科技

行者AI

OPPO数据湖统一存储技术实践

安第斯智能云

大数据 数据湖 存储

Android技术分享| 自定义ViewGroup实现直播间大小屏无缝切换

anyRTC开发者

android 音视频 实时通信 Android开发 大小屏切换

【LeetCode】学生考勤Java题解

Albert

算法 LeetCode 8月日更

史上最大DDoS攻击之争:这三次攻击,谁才是「最大」?

百度开发者中心

最佳实践 方法论 信息安全 案例分析 行业深度

老板不让用 AFNetworking,我该怎么办?

神策技术社区

大前端 后端 数据 数据采集

linux工具之TC

webrtc developer

centos8 mediasoup 搭建

webrtc developer

WebRTC mediasoup

MaxCompute执行引擎核心技术DAG揭秘

阿里云大数据AI技术

网络货运平台要智能,安全的数据底座少不了

华为云开发者联盟

数据库 华为云 物流 智慧物流 可视化追踪

The Data Way Vol.2 | 做个『单纯』的程序员还真不简单

SphereEx

数据库 开源

EMQ 映云科技成为开源项目 Vue.js 定期捐赠者

EMQ映云科技

Java 开源 大前端 emq

Java 为什么设计成 String 不能用 == 来进行比较

HoneyMoose

七步实现列表点击事件的采集

神策技术社区

大前端 后端 代码

webrtc AlrDetector

webrtc developer

探索六边形架构_架构_Jan Stenberg_InfoQ精选文章