架构设计之学新而知故

缘由

因为一些特殊的机缘,接触到洋葱架构等一些新架构设计概念。

尝试理解了一段时间,就想简单梳理下对它们的理解,以达到学新而知故 😃

信息增益

以前计算机专业并不设置通信领域的信息论的专业课程,但是,信息论的知识,应该是每个计算机从业者必知必会的概念。

区别信息之间的相同与差别,找出相同和不同,才能将掌握的信息量增加,以达到学新而知故!

  • 集中精神、注意观察、多试几次!

多试几次这步,信息量的增加是核心要诀,不然,都是无效的徒劳

所以,我总在信息量不增加的情况下,宁肯抱残守缺,并不选择继续重试,必须在找到新方法、新工具、新视角情况下,展开下一次尝试!

以前积累的架构设计

  • 分层设计
  • MVC设计

新学习的架构

  • 六边形架构
  • 洋葱架构

架构设计更高层面的哲学

  • 高内聚、低耦合
  • 单一职责
  • 依赖倒置,利用稳定接口将变化隔离
  • 稳定之锚必须存在,不然,无法建构一个系统,犹如在沙滩上搭建房子一般
  • 即使是依赖倒置这种场景,也有稳定的部分和变化的部分

分层设计

分层设计,层次之间拥有稳定的接口,但层次与层次之间在细节上无关的,代表着高内聚和低耦合、单一职责设计原则指导下的隔离。

其典型代表是网络协议栈

当协议栈处理网络层IP协议时,并不需要关心传输层TCP/UDP层的具体报文,而仅仅将其看成有效载荷,进行无差别的处理而已。

在这里插入图片描述

  • 另外,分层设计需要注意自举能力,通过功能分解,最终完成大功能的自举过程

MVC设计

MVC设计,按照职责进行分割系统,如以用户为视角,从前端View,到中台Controller,再到数据后端Model。

在这里插入图片描述
从结构上来看,与分层设计并无太大区别,但是,具有新意,在WEB系统场景,使得对于理解和实践分层设计很有帮助。

六边形架构和洋葱架构

两种新的架构,着重于依赖倒置原则,将依赖外悬进行适配,或分出不同的圈层进行隔离,以利于核心业务层的稳定。

如果说,分层设计对上层的依赖仅为有效载荷的假设,六边形架构和洋葱架构,则允许更多的假设,
但采用依赖倒置的办法,在外层圈层将这些依赖固化后,而在核心层可以进行无差别的接口假设进行执行。

六边形架构和洋葱架构,退化来看,也是一种分层设计,但还是有所着重。在适应的场景,用其进行建构更方便,用其长处!

当分层演变为多边形

在这里插入图片描述

当简单的分层设计出现比较严重跨层的耦合时,例如,途中红色的线,实际上出现多边形结构。

这时看是否设计上向六边形架构和洋葱架构靠拢。

六边形架构

在这里插入图片描述

洋葱架构

在这里插入图片描述

树形架构

以前刚毕业时,自己也曾有:在枝叶处确定细节,在主干区无差别地进行共同处理

此种无名气的设计思想,是否也可以理解为,在六边形架构和洋葱架构之外,另外一重诠释呢?

设计的稳定之锚

纵观各种架构设计,居于内层的领域模型,必须是稳定之锚。

然后,合理地区分变化和稳定的关系,迭代、重构开发,谁也无法提前理解全部,哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/617669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

条件变量解决同步问题之打印金鱼

说明 本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享) 本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释 问题描述 有三类线程 T1 若干: 死循环打印< T2 若干: 死循环打印> T3 若干: 死循环打印_ 任务: 对线程同步&#xff0c;使得屏幕…

eNSP中小型园区网络拓扑搭建(下)

→b站直通车&#xff0c;感谢大佬← →eNSP中小型园区网络拓扑搭建&#xff08;上&#xff09;← 不带配置命令的拓扑图已上传~ 配置ospf SW5 # ospf 1 router-id 5.5.5.5area 0.0.0.0network 192.168.51.5 0.0.0.0network 192.168.52.5 0.0.0.0area 0.0.0.10network 192.1…

MATLAB函数fir1的C语言移值

要移值的matlab函数&#xff1a; h3 fir1(16,[0.25 0.50]); C语言版本 #include <iostream> #include <cmath>#define PI acos(-1)double sincEasy(double *x, int len, int index) {double temp PI * x[index];if (temp 0) {return 1.0; // sinc(0) 1}ret…

如何在 Linux / Ubuntu 上下载和安装 JMeter?

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 安装 Java 要下载 Java&…

01、什么是ip、协议、端口号知道吗?计算机网络通信的组成是什么?

声明&#xff1a;本教程不收取任何费用&#xff0c;欢迎转载&#xff0c;尊重作者劳动成果&#xff0c;不得用于商业用途&#xff0c;侵权必究&#xff01;&#xff01;&#xff01; 目录 前言 计算机网络 网络ip地址 网络协议 网络端口号 前言 最近有个项目要用到相关文章…

NOR FLASH介绍

参考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH简介 XIP技术:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特点和应用举例&#xff1a; NOR Flash&#xff1a; 特点&#xff1a; 支持随机访问&#xff0c;可以直接…

【ROS2】节点

文章目录 ROS2 节点示例&#xff1a;创建并运行成功一个节点1. 创建功能包2. 编写源文件、CMakeLists.txt、package.xml3. 编译功能包4. 设置环境变量5. 运行节点6. 查看节点 参考链接 ROS2 节点 机器人的每一项功能&#xff0c;都被称为是一个节点。 每个节点都是一个独立的…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessBeforeInitialization–> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

json-server 模拟接口服务

前端开发经常需要模拟接口请求&#xff0c;可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json &#xff0c;与 package.json 同级&#xff0c;内容为模拟的数据 注意 json 文件对格式…

基于SSM的“网约车用户服务平台”的设计与实现(源码+数据库+文档)

基于SSM的“网约车用户服务平台”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能 首页 站内新闻浏览 打车信息查询功能 在线打车功能…

Docker尚硅谷_高级篇

Docker尚硅谷 高级篇一、Dockerfile1.1 Dockerfile1.2 构建过程1.3 Dockerfile保留字1.3 构建镜像1.4 虚悬镜像 二、Docker发布微服务2.1 搭建SpringBoot项目2.2 发布微服务项目到Docker容器 三、Docker网络3.1 Docker网络3.2 docker网络命令3.3 Docker网络模式3.4 docker03.5 …

离散化(算法竞赛)

Ⅰ 离散化简介 离散化&#xff1a;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 适用范围&#xff1a;数组中元素值域很大&#xff0c;但个…

面试八股之Redis篇2——redis分布式锁

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

C语言——文件相关操作补充

一、文件读取结束的判定 当我们使用例如fgetc、fgets、fscanf、fread等函数来读取文件内容时&#xff0c;我们可能遇到需要判断文件读取的结束&#xff0c;一般情况下都是通过这些函数的返回值来判断文件读取是否结束。 1、fgetc 返回读取的字符的ASCII值&#xff0c;如果读…

攻防世界-web-fileclude(二)

题目 解题 题目源码 WRONG WAY! <?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET["file1"]) && isset($_GET["file2"])) {$file1 $_GET["file1"];$file2 $_GET["file2"];if(!empty($…

10分钟入门pandas(一)

pandas 是基于python语言的数据分析处理库,使用广泛。本文主要参考pandas的官方入门指导,并结合自己入门使用的一些常用操作进行说明。 pandas通常和numpy结合使用,一般通过如下语句导入numpy和pandas库。 import numpy as np import pandas as pd一. pandas 数据结构 pan…

一个全栈SpringBoot项目-Book Social Network

一个全栈SpringBoot项目-Book Social Network BSN是一个会员之间交换图书的社交网络平台。图书社交网络是一个全栈应用程序&#xff0c;使用户能够管理他们的图书收藏并与图书爱好者社区互动。它提供的功能包括用户注册、安全电子邮件验证、图书管理&#xff08;包括创建、更新…

6818Linux内核开发移植

Linux内核开发移植 Linux内核版本变迁及其获得 Linux是最受欢迎的自由电脑操作系统内核&#xff0c; 是一个用C语言写成&#xff0c; 并且符合POSIX标准的类Unix操作系统 Linux是由芬兰黑客Linus Torvalds开发的&#xff0c; 目的是尝试在英特尔x86架构上提供自由免费的类Un…

Linux day4 _vim及其相关指令

wc命令 做数量统计 可以通过wc命令统计文件的行数&#xff0c;单词数量等 语法&#xff1a;wc [-c -m -l -w] 文件路径 选项 -c&#xff0c;统计bytes数量 -m&#xff0c;统计字符数量 -l&#xff0c;统计行数 -w统计单词数量 参数&#xff0c;文件路径&#xff0c;被统…

MySQL表死锁查询语句

步骤1&#xff1a;查询表死锁的sql语句&#xff1a; SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ; 或 SELECT * FROM information_schema.INNODB_TRX; 步骤2&#xff1a;删除 kill "对应的线程id"