知识卡片

按组件封装:Simon Brown的组件定义与Bob大叔的组件定义之别

普通读书笔记卡

内容

Simon Brown对本书前述的组件构建原则完全认同,但提出了自己的第四种代码组织方式——”按组件封装”:把一个粗粒度组件相关的所有类放进同一个Java包,这有点像用面向服务的视角构建软件(与微服务架构类似),也像[[数据库是业务逻辑间接使用的工具边界线应画在依赖箭头指向业务逻辑之处]]所属端口适配器模式把Web视作交付手段一样,按组件封装把UI和粗粒度组件分离开。这种方式把”业务逻辑”和”持久化代码”合并成一个统称为”组件”的整体——但作者对”组件”这个词的定义和Bob大叔在[[组件是软件的最小独立部署单元]]里给出的定义(”组件是部署单元,系统中能部署的最小单位,对应Java里的jar文件”)不完全一致:Simon的定义来自他自己的C4软件架构模型——”在一个执行环境中,一个干净良好的接口背后的一系列相关功能的集合”,这个层级模型区分了容器(Web应用/移动App/独立应用/数据库/文件系统)、组件、类三个层次,系统由一个或多个容器组成,每个容器包含一个或多个组件,每个组件由一个或多个类组成——组件具体存在于哪个jar文件里是另一个独立维度的事。按组件封装的好处很直接:如果要写和订单相关的代码,只有一个位置需要改动——OrdersComponent,组件内部仍要遵循关注点隔离原则,但这属于组件内部的事,使用者不需要关心;这有点像微服务或面向服务架构的产出效果,关键区别在于解耦的具体方式——可以认为单体程序里一个良好定义的组件,正是未来微服务化架构的前提条件。

参考来源

- 位置:《架构整洁之道》第34章《拾遗》"按组件封装"(源文件:_epub-src/text/part0015_split_004.html) - 结论依据:原文描述按组件封装把业务逻辑与持久化代码合并进一个组件包,并对比Simon Brown基于C4模型给出的组件定义与Bob大叔"组件是部署单元"的定义差异,说明修改订单相关代码只需改动一个位置的好处,直接支撑本卡片结论。 - 原始内容:这种做法混合了我们之前讲的所有的方法,目标是将一个粗粒度组件相关的所有类放入一个Java包中……我对组件的定义稍有不同:"在一个执行环境(应用程序)中的、一个干净、良好的接口背后的一系列相关功能的集合"……我们可以认为,单体程序中的一个良好定义的组件,是微服务化架构的一个前提条件。