写点什么

探索六边形架构

2014 年 11 月 02 日

端口和适配器架构风格,也叫做六边形架构,能够清晰地区分领域模型和输入输出设备之间的界限。 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:588814
用户头像

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

关注

评论

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

PowerApps画布应用编码规范和指南

Changwei™

低代码 企业应用 Power Platform PowerApps

工业互联网平台:将为“补链”“优链”“强链”提供有力保障

浪潮云

工业互联网

运动健身市场越来越大,你的客户却越来越少?

IoT云工坊

人工智能 App 物联网 健身房 智能健身房

面试杀手锏!2021最新Android常用开源库总结,Android校招面试指南

欢喜学安卓

android 程序员 面试 移动开发

面试看这个就够了!6年菜鸟开发面试字节跳动安卓研发岗,学习路线+知识点梳理

欢喜学安卓

android 程序员 面试 移动开发

专访京东科技张亮:本土开源需形成吸纳开发者的靶心

京东科技开发者

开源

DIY一款能随周围环境变化的智能灯泡,求婚必备!

IoT云工坊

人工智能 物联网 人脸识别 sdk IoT App

快速入门:大白话梳理Nginx,全网最通俗易懂

Java王路飞

Java nginx 负载均衡 微服务 网络

任务悬赏系统软件开发

v16629866266

k8s-client-go源码剖析(三)

LanLiang

golang Kubernetes Kubernetes源码

Elasticsearch 从 0 到千万级数据查询实践

📿

Java spring elasticsearch Spring Cloud spring data

分盘存储:实现数据库备集群备份文件分散存储

华为云开发者社区

数据库 数据 容灾 集群 分盘存储

Java之五种遍历Map集合的方式

华为云开发者社区

Java 对象 Iterator map合集

谁再把IDEA的Project比作Eclipse的Workspace,我就跟谁急

YourBatman

eclipse IntelliJ IDEA Project Workspace

勿让 Docker Volume 引发 Terminating Pod

黄久远

Docker 云计算 Kubernetes 容器 云原生

单例模式原来是这么简单?!

后台技术汇

28天写作 2月春节不断更

Java 多线程上下文传递在复杂场景下的实践

vivo互联网技术

Java 架构 编程语言 多线程高并发

如何理解Linux系统SSH协议和原理

Changing Lin

Linux 2月春节不断更

MySQL字段类型最全解析

Simon

MySQL 数据库数据类型

第三周

ALone

话题讨论 | 你现在还会推荐亲朋做程序员吗?

石云升

话题讨论 2月春节不断更

领域的边界,一个小讨论

李小腾

领域驱动设计 DDD

软件架构模式之事件驱动架构

架构精进之路

软件架构 七日更 28天写作 2月春节不断更

第二章作业二

LouisN

💻 一文读懂两台计算机之间是如何通信的

飞天小牛肉

面试 计算机网络 2月春节不断更

两个高频设计类面试题:如何设计HashMap和线程池

yes

面试 hashmap 线程池

最基础的3道java面试题,你真的答得上来吗

田维常

面试

重点人员管控系统开发,智慧公安系统搭建解决方案

WX13823153201

重点人员管控系统开发

博文视点算法书单|让算法学习不再难

博文视点Broadview

GitHub星标数超4.2万的火爆之作!

博文视点Broadview

一款基于 WEB 的通用数据管控工具 - CloudQuery

侯林捷

开发工具 运维工程师 dba 数据库管理工具

探索六边形架构-InfoQ