Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【转载】8. EBI 架构(译)

2024-01-26 1177点热度 0人点赞 0条评论

这篇文章是软件架构编年史(译)的一部分,这部编年史由一系列关于软件架构的文章组成。在这一系列文章中,我将写下我对软件架构的学习和思考,以及我是如何运用这些知识的。如果你阅读了这个系列中之前的文章,本篇文章的的内容将更有意义。

EBI 架构(Entity-Boundary-Interactor,实体-边界-交互器)架构因为 Robert C. Martin 关于整洁架构(我会在后续的文章中介绍)的讲座而被人熟知。

然而,Ivar Jacobson 早在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出了这个模式。那时,Jacobson 实际上把它叫做实体-接口-控制(Entity-Interface-Control),但是后来改成了 EBI,避免“接口”和编程语言中的结构“接口”混淆,以及“控制”和 MVC 中的控制器混淆。

8. EBI 架构(译)

实体

实体对象承载着系统使用的数据与所有和这些数据天然耦合在一起的行为。每一个实体对象都代表着一个和问题域相关的概念,以及它承载的身份和可恢复的(持久化)数据。Jacobson 告诉我们,实体对象应该包含和对象自己变同时发生变化的逻辑,例如,如果它的数据结构发生变化,这些数据上的操作也需要改变,因此它们也应该放在实体内。

有意思的是,早在 1992 年,Jacobson 就作出了如下警告:

新手也许有时会让实体对象只携带数据,把所有动态的行为放到控制对象中[...]。然而,这是应该避免的。[...] 许多行为反而应该放在实体对象中。——Ivar Jacobson 1992, pp. 134

这就是我们现在所知的“贫血实体”。

边界(接口)

边界对象是对系统接口的建模。

[…] 和系统接口有关的一切都应该放在接口对象中——Ivar Jacobson 1992, pp. 134

所有依赖系统环境(工具和传达机制)的功能都属于边界对象。

任何角色和系统的交互都要经过边界对象。如 Jacobson 所述,角色可以是像客户或管理员(操作员)这样的人类用户,也可以是像告警、打印机或者第三方 API 这样的非人类“用户”。

8. EBI 架构(译)

回味一下边界的概念,再看看图 7.14,把其中的四个边界想像成六个,我不禁联想到 2005 年才提出的端口和适配器架构(我将在后续的文章中介绍),整整晚了 13 年。

交互器(控制)

交互器对象承载了和其它任何对象类型天然无关的行为。

这些行为通常由对实体一些操作组成,最后将某个结果返回给边界对象。

边界对象和实体对象挑剩下的行为会被放在控制对象中。—— Ivar Jacobson 1992, pp. 185

这意味着所有不适合放在边界或实体的行为都会被放在一个或多个控制对象中。

因此,Jacobson 认为控制对象不仅仅是编排用例的对象,也包括那些拥有和用例有关的行为的对象,它们既不是边界也不是实体。

根据我的经验,我认为他称为交互器的对象就是我称为应用服务(编排用例)和领域服务(包含领域行为但不是实体)的对象。

位于中间的交互器对象地位十分重要,原因在于,如果去掉它们,特定用例的逻辑就会被放到实体中。然而,实体会被多个用例使用,因此它们会有通用的用法。特定用例的逻辑如果被放到了实体中,就能被多个边界使用,这些边界最终会把这个实体当成通用逻辑。而我们就会不得不修改这个实体让它适应另一个边界,这会增加实体的复杂性而且可能会破坏用到该实体的其它用例。

为什么是三种对象类型?

当时,Jacobson 宣称其它的 OO 方法会把所有的职责都放在实体本身,但是他(和他的支持者)则倾向与将这些职责分散到三种对象类型中,因为这样能让系统更适应变化。

[…] 所有的系统都会发生变化。因此,只有所有的变化都发生在局部,稳定性才会存在,也就是说,变化最好只能影响系统中的一个对象。—— Ivar Jacobson 1992, pg. 135

通过职责的封装将系统的变化控制在局部,就是 EBI 架构的目标。我们仔细思考一下,Jacobson 只是没有直接说出十年之后由 Robert C. Martin 在他的 “Agile Software Development, Principles, Patterns, and Practices”一书中提出的单一职责原则罢了。

总结

和 MVC 模式中的 Model 代表着整个后端(包括所有实体、服务和它们之间的关系在内的一切)一样,EBI 模式将边界看作是和外部世界的完整连接,而不仅仅是一个视图、一个控制器或是一个接口(这里指的是编程语言结构的接口)。 边界代表了对应着 MVC 中的 View 和 Controller 的整个展现层。EBI 中的实体代表了承载着数据及其行为的真正实体,而交互器对象代表了展现层和实体之间的连接,也就是我所谓的应用服务和领域服务。

EBI 模式关注后端而 MVC 更关注前端。它们不能互相取代,它们是对方的补充。如果把它们放在一个模式中,我们可以把它叫做视图-控制器-交互器-实体 (View-Controller-Interactor-Entity)。

引用来源

1992 – Ivar Jacobson – Object-Oriented Software Engineering: A use case driven approach
2002 – Robert C. Martin – Agile Software Development, Principles, Patterns, and Practices
2002 – Robert C. Martin – Single Responsibility Principle
Eclipse Process Framework – Entity-Control-Boundary Pattern
Jon Pearce – Implementing Use Cases
2012 – Robert C. Martin – Clean Architecture (NDC 2012)
2014 – Adam Bien – How to tackle JEE
2014 – Ali Parvini – Model View Controller vs Boundary Control Entity

本文仅供学习!所有权归属原作者。侵删!文章来源:作者 https://www.jianshu.com/p/395814410cf5

更多文章:

  1. 7. MVC及其变种(译)
  2. 10.领域驱动设计(译)
  3. 从MVC到DDD,该如何下手重构?
  4. 6.分层架构(译)
  5. 1.软件架构编年史(译)
  6. 9.包和命名空间(译)
  7. 手把手教你实战TDD
  8. 2.软件架构预述(译)
  9. 殷浩详解DDD 第三讲 - Repository模式
  10. 45 个 Git 经典操作场景,专治不会合代码
标签: 转载 架构 架构设计 EBI 实体
最后更新:2024-01-26

秋天0261

关注Java领域,后端开发、Netty、Zookeeper、Kafka、ES、分布式、微服务、架构等。分享技术干货,架构设计,实战经验等。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 实体
  • 边界(接口)
  • 交互器(控制)
  • 为什么是三种对象类型?
  • 总结
  • 引用来源
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
企业4A架构:业务、应用、数据、技术的完美融合 系统设计入门:成为高级软件工程师的指南 系统设计 | “胖瘦” BFF:常见的两种微服务形态 系统设计-业务表5要素 你所说的“事件驱动”是什么? What do you mean by “Event-Driven”? Spring中@Autowired和@Inject注解的区别? JVM GC配置指南 Kafka如何选择合适的分区数,你选对了吗

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2