干净的体系结构-“组件原理三合一”的示例

如何解决干净的体系结构-“组件原理三合一”的示例

我正在阅读Clean Architecture的“组成原则”部分。

作者在那里解释了组件设计的三个原理。我想我有点孤立地了解它们。

重用/发布等效原则(REP)
我对此的理解是,要使软件包可重用,它们需要具有适当的发行跟踪机制(版本,文档等)

通用闭包原理(CCP)
该声明指出,出于相同原因而更改的类必须捆绑在同一包中。目标是实现可维护性->如果您的应用程序中的某些内容发生更改,则可能会在单个软件包(或仅几个软件包)中进行更改。

通用重用原则(CRP)
如果用户依赖于某个程序包,则他们应该依赖于该程序包中的所有类。
这意味着,程序包应仅包含可一起重用的那些类。

在研究了这些原理之后,作者展示了这些原理的“三合一”,类似于经典的CAP定理:

Triad of Component Principles

我对此的理解是,在设计组件时,您只能选择遵循三个原则中的两个。

那是我不太了解的部分:

  1. 我看不出使用REP是如何独占其他任何原理。据我了解,满足REP意味着实施发布管理机制。我看不到同时坚持CCP和CRP可以禁止这样做吗?
  2. 如何将CCP和CRP一起使用?我认为它们是完全相反的原则。前者指出,类应以可以一起更改的方式分组,而后者则应将类以一起使用的方式分组。我认为这两个目标是相反的,我看不到如何共同实现。

如果有人帮助揭穿这些原则,将感到很高兴,因为这本书没有任何可能的“三合会”对的实际例子。 REP和CRP,REP和CCP,CCP和REP。

如果有人可以提供这些可能的配对的缺失示例,那就太好了!

解决方法

通用闭包原理:不要使应用程序中的组件过于宽泛。

倾向于一起更新的组件应该组合在一起。如果在进行一项更改时许多组件需要更新,则组件之间可能存在耦合。随着组件之间耦合程度的提高,由于意外的用例和不完善的文档,对一个组件进行细微更改而产生广泛影响的可能性也会增加。

通用重用原则:不要使应用程序中的组件过于具体。

如果组件的用户需要一个组件的一部分,则应包括该组件的所有部分(因为它们是相关的/必要的)。从用户的角度来看,组件应该做一件事。建立“一件事”的所有逻辑都应包含在组件中。将逻辑打包到组件中的主要好处是可以提高可用性和可维护性,并且复用单元应该是有用的复用单元。

重用/发布等效原则:不要以为组件是完美的。

手动传递单个类是无法维持的。为了使给定的组件有用,必须有一种提供长期稳定性的机制(例如:已注意到的问题已解决,等等)。因此,应该有某种形式的发布流程,可以记录问题并可以找到和使用组件的更新版本。

从可用性和可维护性的角度确定给定组件的特定性/广泛性时,必须考虑取舍。

  1. 没有遵循CCP吗?组件无法维护。很难解决问题/添加增强功能。
  2. 没有遵循CRP?组件没有用。难以使用的组件。
  3. REP没有关注?组件不可信任。难以使用的组件。

需要权衡取舍,但与CAP相比似乎有些困难。 CAP更像是“挑剔”,而更像是“记住编写组件的原因”。我倾向于认为存在一些主观的最优结构,这些结构提供了可用且值得信赖的组件。 CAP客观上只能选择2个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-