系统架构师之高内聚低耦合
一、概念:
标记耦合(Stamp Coupling)和数据耦合(Data Coupling)是软件设计中两种不同的耦合类型,它们之间的区别如下:
- 标记耦合:标记耦合是指模块之间通过参数传递标记或标识符来进行通信的程度。这种耦合方式需要模块之间共享标记或标识符,依赖于标记或标识符的具体实现。标记耦合的特点是:
- 模块之间通过参数传递标记或标识符来进行通信。
- 模块之间共享标记或标识符,依赖于标记或标识符的具体实现。
- 模块之间的耦合度较高,难以重用和修改。
- 标记或标识符的含义和作用需要在模块之间进行共享和理解。
2. 数据耦合:数据耦合是指模块之间通过参数传递数据来进行通信的程度。这种耦合方式需要 模块之间共享数据,但不依赖于数据的具体实现。数据耦合的特点是:
- 模块之间通过参数传递数据来进行通信。
- 模块之间共享数据,但不依赖于数据的具体实现。
- 模块之间的耦合度较低,易于重用和修改。
- 数据的含义和作用可以通过数据本身来进行理解。
因此,标记耦合和数据耦合的主要区别在于模块之间的通信方式不同。标记耦合依赖于标记或标识符的具体实现,而数据耦合不依赖于数据的具体实现。数据耦合的耦合度较低,易于重用和修改,而标记耦合的耦合度较高,难以重用和修改。
二、高内聚低耦合分类

三、耦合
非功能耦合:模块之间通过共享非功能性的属性或特征来进行通信的程度。这种耦合方式不依赖于模块之间共享的数据或功能,而是依赖于模块之间共享的性能、安全、可靠性等非功能性的属性或特征。
数据耦合:模块之间通过简单参数来传递数据进行通信,简单参数如java中得值传递。
标记耦合:模块之间通过相对复杂参数来传递数据进行通信,复杂参数如结构体,也可以理解为java中得引用传递。
外部耦合:这种耦合关系通常是通过接口或者协议进行的,例如两个系统之间的接口协议、两个不同的软件系统之间的接口等。
公共耦合:公共耦合是指多个模块之间共享同一个全局变量、常量、数据结构等共同的资源,从而形成的耦合关系。这种耦合关系使得多个模块之间紧密地相互依赖,对系统的可维护性和可扩展性产生不良影响。如不同部件通过消息中间件来传输数据。公共耦合表面上耦合度高,但从架构角度,不同部件可以专注自己的事情,也能提高复用并发,其实部件是解耦度是高的。
内部耦合:内部耦合是指一个系统中两个或多个模块之间的耦合关系,这些模块都属于同一个系统或同一个软件模块。这种耦合关系通常是通过共享数据、共享代码、共享变量等方式实现的。内部耦合是系统中最常见的耦合方式之一,但是它也是造成系统耦合度高、代码复杂度高、可维护性差等问题的主要原因之一。
四、内聚
功能内聚:模块内的元素都是为了实现同一个功能而存在的,例如所有与用户认证相关的函数都放在同一个模块中。
顺序内聚:模块内的元素都是按照一定的顺序依次执行的,例如一个读取文件的函数内部包含了打开文件、读取文件内容和关闭文件等操作。
通信内聚:模块内的元素都是为了实现某种通信或协作而存在的,例如一个客户端与服务器通信的模块内包含了发送数据、接收数据和处理数据的函数。
过程内聚:模块内的元素都是为了实现某一个过程而存在的,例如一个模块内包含了对数据进行排序、查找和过滤等操作的函数。
瞬时内聚/时间内聚:时间内聚是指一个模块内的元素都是在同一个时间段内执行的,例如一个模块内包含了所有与启动和关闭系统有关的函数
逻辑内聚:逻辑内聚是指一个模块内的元素都是为了实现一个逻辑或者功能相关的操作而存在的,例如一个模块内包含了所有与用户登录相关的函数
偶然内聚:偶然内聚是指一个模块内的元素之间没有明显的关联性,它们只是因为某些偶然的原因被放在同一个模块中,例如一个模块包含了所有与文件操作、网络通信、数据库访问等操作相关的函数
相关文章:
系统架构师之高内聚低耦合
一、概念: 标记耦合(Stamp Coupling)和数据耦合(Data Coupling)是软件设计中两种不同的耦合类型,它们之间的区别如下: 标记耦合:标记耦合是指模块之间通过参数传递标记或标识符来进…...
Netty核心源码剖析(二)
1.Netty接受请求过程源码剖析 1>.从之前的Netty启动过程源码剖析中,我们得知服务器最终注册了一个Accept事件等待客户端的连接.我们也知道,NioServerSocketChannel将自己注册到了bossGroup单例线程池(reactor线程)上,也就是EventLoop; 2>.先简单说下EventLoop的逻辑,Ev…...
「C/C++」C/C++ Lamada表达式
✨博客主页:何曾参静谧的博客 📌文章专栏:「C/C」C/C程序设计 相关术语 Lambda表达式:是C11引入的一种函数对象,可以方便地创建匿名函数。与传统的函数不同,Lambda表达式可以在定义时直接嵌入代码ÿ…...
bug(Tomcat):StandardContext.startInternal 由于之前的错误,Context[/day01]启动失败
引出 项目启动失败,一个困扰了一上午的bug 报错信息 org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 org.apache.catalina.core.StandardContext.startInternal 由于之前的错误…...
Java性能权威指南-总结6
Java性能权威指南-总结6 垃圾收集入门垃圾收集概述GC算法选择GC算法 垃圾收集入门 垃圾收集概述 GC算法 JVM提供了以下四种不同的垃圾收集算法: Serial垃圾收集器 Serial垃圾收集器是四种垃圾收集器中最简单的一种。如果应用运行在Client型虚拟机(Windows平台上的32位JVM或…...
群的定义及性质
群的定义 设 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为独异点,若 G G G中每个元素关于 ⋅ \cdot ⋅都是可逆的,则称 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为群 由于群中结合律成立,每个元素的逆元是唯一的 …...
mac电脑git clone项目时报错证书过期和权限被拒绝
mac电脑使用git clone命令克隆项目时,一开始一直提示证书过期 SSL certificate problem: certificate has expired 执行以下代码关掉验证后,解决了这个问题 找到git目录 Git\git-cmd输入命令跳转到bin目录,cd bin输入命令运行git.exe执行关…...
【AIGC】Photoshop AI Beta版本安装使用(永久免费)
AIGC 大爆发 Adobe近日宣布,Photoshop(测试版)应用程序发布了生成式AI绘图,这是世界上第一个创意和设计工作流程的副驾驶,为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持,Adobe的…...
01 云原生生态系统解读
云计算的技术革命 互联网时代的历程 云计算到底是什么 云计算历程 云平台的优缺点 优势 稳定性:云平台大量资源,分布式集群部署,保障服务永不宕机,几个9弹性扩展:按需索取,一键秒级开通需要的资源安全性&…...
Java——Java易错选择题复习(2)(计算机网络)
1. 下面关于源端口地址和目标端口地址的描述中,正确的是( ) A. 在TCP/UDP传输段中,源端口地址和目的端口地址是不能相同的 B. 在TCP/UDP传输段中,源端口地址和目的端口地址必须是相同的 C. 在TCP/UDP传输段中ÿ…...
【HTML5系列教程】
《HTML5系列教程》目录大纲: 介绍 内容包括HTML简介、服务器的概念、B/S、C/S软件架构、前端与后端的开发内容、HTML发展历程、浏览器内核介绍、Web标准、WebStorm工具的使用、WebStorm常用快捷键、HTML常用标签 如:文本标签(span)、排版标签(div/p/h…...
二、电压源、电流源、受控源
点我回到目录 目录 理想电压源 理想电流源 受控源 电流源做功问题 电压源做功问题 理想电压源 •定义:两端电压保持定值或一定的时间函数,且电压值与流过它的电流i无关 •特点:理想电压源两端的电压由本身决定,与外电路无关…...
骨传导是哪个意思,推荐几款性能优的骨传导耳机
骨传导耳机是通过头部骨迷路传递声音,而不是直接通过耳膜的振动来传递声音。与传统的入耳式耳机相比,骨传导耳机不会堵耳朵,在跑步、骑车等运动时可以更好的接收外界环境音,保护听力,提升安全性。此外,骨…...
利用Taro打造灵活的移动App架构
最近公司的一些项目需要跨端框架,技术老大选了Taro,实践了一段时间下来,愈发觉得Taro是个好东西,所以在本篇文章中稍微介绍下。 什么是Taro? Taro(或称为Taro框架)是一种用于构建跨平台应用程…...
(转载)基于模拟退火算法的TSP问题求解(matlab实现)
1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成&am…...
splitpcap 使用说明
背景 当PCAP原始文件特别巨大的时候,整个文件直接载入内存是相当耗时的,于是一个简单的想法是将大的PCAP切分成若干小PCAP。对于这个任务,现有工具splitcap是可以完成的。无论是按照主机对、还是按照五元组信息切分,splitcap都会…...
配置docker阿里云镜像加速
默认情况下docker安装镜像文件是从docker官方的镜像中心下载:https://hub.docker.com/ , 有时速度慢,可以通过配置docker阿里云镜像来加速,配置后,就从国内阿里云下载。 注册阿里云用户,登录->工作台-&g…...
《消息队列高手课》课程学习笔记(八)
如何实现高性能的异步网络传输? **异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法,…...
DC电源模块在工业自动化的应用
BOSHIDA DC电源模块在工业自动化的应用 随着自动化技术的不断发展,DC电源模块已成为工业控制系统中不可或缺的一个组成部分。在许多自动化系统中,如机器人、控制器、PLC等,都需要使用到直流电源模块来提供稳定可靠的电源,以确保系…...
Java容器-集合
目录 1.Java容器概述 2.集合框架 3.Collection接口中的方法使用 4.iterator() 5.List接口 2.ArrayList、LinkedList、Vector相同点 3.不同点 1.ArrayList 2.LinkedList 3.Vector 4.Vector源码分析 5.ArrayList源码分析 6.LinkedList源码分析 6.List中的常用方法 …...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
