当前位置: 首页 > news >正文

单一原则+干湿分离,让你的架构能力起飞

# 概念

软件单一原则(Single Responsibility Principle,SRP)是面向对象编程中五大基本设计原则之一。它指每个软件模块或类都应该只负责一个单一的功能或责任。

  1. 高内聚低耦合

  2. 实现代码可维护性

干湿分离是一种建筑设计和室内装修的方法,主要目的是将"干区"和"湿区"进行物理隔离,以提高空间利用率和使用效率。

  1. 提高空间利用率 

  2. 改善使用体验 

  3. 便于管理和维护 

  4. 增强安全性

看似两个不相干的主题,但是从工程角度是如此的相似相通,单一原则在实践过程中容易走样:

  1. 懒:懒拆分, 懒抽象

  2. 怕:没有“继承”,没人知道背景,不敢动,不敢抽象 

  3. 差:不具备这样的能力

# 详细

在工程界,有样板间(Pattern), 脚手架(Scaffold)辅助,即使复杂如上海中心这样的工程,终是普通的水泥工垒砌起来。

在软件架构中,以设计范式(pattern)为道,以实践工具为术,可以大大减缓软件架构的腐败,降低在软件架构演进过程熵值扩散。

所以软件架构里面的干湿分离, 其实直接在代码目录隔离(参考早期大家习惯把后缀 IT的测试类标志为集成测试); 这也算遵循&扩展标准,其实很早也在行业内实践了,如rails/grails 里面的COC: Convention over Configuration  \  Clean Code :-) , 所以你可以看到些 “main” 之外目录:

  1. wire: 协议目录 

  2. stub: 服务端代码 

  3. trait: 数据库操作辅助代码

  4. ...

凡事都有事前,事中,事后,基本三个切入点进行控制, 来自archguard 给了很好的解释:(摘自:archguard)

核心理念:三态模型 + 双环守护

  • 设计态:目标架构。通过 DSL(领域特定语言) + 架构工作台来构建 。

  • 开发态:实现架构。关注于:可视化 + 自定义分析 + 架构治理。

  • 运行态:运行架构。结合 APM 工具,构建完整的分析链。

https://archguard.org/

图片

最终达到 "天人合一":

Arch ⇋ Code ⇋ Document

# ApiHug 思路

  1. 设计态:DSL 定义(目录,包结构,值对象,领域对象,枚举,错误...) + 可视化

  2. 开发态: 基于成熟企业开发,编译 Lint,  服务编织(静态分析) + 可视化

  3. 运行态:APM,  Bootstrap 校验, Actuator

# 预告

  1. 1.0.0 SDK 预备发布

  2. 一键迁移老项目

  3. Domain Knowledge AI 集成

  4. ...

图片

API 设计工具千万家,ApiHug才是真的爱大家

💝 不玩心跳、擦边,只有实打实的爱!

⛔ 不是更强的 postman、jmeter, xxxx!

🥳 ApiHug 提供API 设计到实现的新范式!

ApiHug 准则:

  1. 📐 设计先行:  Design First

  2. 📑 协议驱动:Specification Driven

  3. 🗺️ 单一信任源: Single Source of Truth

  4. ❤️ 开发同理心: Development Empathy

ApiHug:

  1. 无服务: 一切尽在本地, 或者您的内部 Repository

  2. 无强依赖: 遵循行业最佳、最成熟实践、可插拔 

  3. 无隐藏:一切尽公开透明

📐设计先行

通过统一的API 设计元语(DSL, domain specific language), 让API 设计更语言化(Describe);实现高度的一致化,和高复用。

📑协议驱动

OAS (OpenAPI specification), 是 ApiHug世界的 "金科玉律", 严格保证定义 ↔ 实现之间同构(isomorphism)态射。

🗺️单一信任源

实现 API 从:蓝图→施工→测试→落地,不走样, 不变形,不改味。极致沟通效率和极低信任成本。

❤️ 开发同理心

置身于多种角色,感同身受,在快和慢,现在和将来,个体和团队上综合平衡,极具同理心是ApiHug 人文基础,她不仅仅是一段代码,一个工具,一种方式。

We Build What We Love & Love What We Built

https://apihug.com/docs/start/what-is-apihug

开启愉快开发之旅:https://apihug.com/docs/start

00. 预安装

  1. JDK 17+ OpenJDK or Oracle

  2. Gradle 8+

  3. IDEA 2022+

  4. ApiHug - API design Copilot  IDEA plugin 市场

01. 插件安装

  1. File

  2. Settings

  3. Plugin

  4. Search ApiHug

  5. Install & Restart

图片

02. Project Wizard

ApiHug - API design Copilot 提供了一个非常友好的项目启动模板,按照步骤一路点下来就可以。

01- 开始ApiHug项目

  1. File

  2. New -> Project

  3. ApiHug

图片

02-项目设置

  1. Project settings

  2. package

  3. name

  4. description

  5. SDK Settings

  6. version

  7. DB Vendor

  8. Cache

  9. Port

图片

03-Spring 设置

标准Spring 配置和 starter.spring.io 一样:

  1. 选择类型

  2. 选择你需要的模块,比如: Spring Web

图片

最后 点击: Create -> Open Project  就可以打开项目啦!

04-开启项目

跟着IDEA的引导:

  1. 以 Gradle 方式加载项目, 如果没有检查通知Notification栏目,可能你隐藏了;

  2. 两个模块 demo-app-proto & demo-app 应该被gradle自动识别出来。

图片

04.1-Wire
  1. 打开 README.md > 0. Build All

  2. 找到那段脚本贴到控制台上: Terminal

  3. 回车 Enter 执行

  4. 检查模块 demo-app-proto 目录 main > wire 里面内容和更新

图片

04.2-Stub
  1. 打开 README.md > 2. Build Stub (Individual)

  2. 同理找到那段命令行,贴到控制台 Terminal

  3. 按回车 Enter 执行

  4. 检查模块 demo-app 目录 main > stub 里内容和更新:

图片

04.3-Boot
  1. 打开 README.md > 3. Run Application

  2. 找到对于命令,贴到 Terminal

  3. 回车 Enter 执行

  4. 检查命令行输出 Log demo-app

图片

----------------------------------------------------------
Application 'demo-app' is running! Access URLs:
Local                             http://localhost:18089/External                          http://192.168.0.115:18089/OAS                               http://192.168.0.115:18089/v3/api-docsActuator                          http://192.168.0.115:18089/managementApi-Errors                        http://192.168.0.115:18089/hope/meta/errorsApi-Dictionaries                  http://192.168.0.115:18089/hope/meta/dictionariesApi-Authorities                   http://192.168.0.115:18089/hope/meta/authoritiesProfile(s)                        dev
04.4-查看 OAS
  1. 从控制台命令行上找到对应的URL

  2. 在浏览器(Chrome)输出查看即可 

图片

ApiHug 工具栏

ApiHug 工具栏(Tool Window)  默认停靠在您的IDEA右侧栏, 当然您也可通过上面菜单调出 :   ApiHug > ApiHug Designer : 

图片

🥳 恭喜! 开启您愉悦的开发之旅吧!

图片

相关文章:

单一原则+干湿分离,让你的架构能力起飞

# 概念 软件单一原则(Single Responsibility Principle,SRP)是面向对象编程中五大基本设计原则之一。它指每个软件模块或类都应该只负责一个单一的功能或责任。 高内聚低耦合 实现代码可维护性 干湿分离是一种建筑设计和室内装修的方法,主…...

如何恢复永久删除的照片?

“嗨,我永久删除了电脑上的很多照片。回收站被清空,照片会永久丢失吗?有什么方法可以恢复这些已删除的照片吗? 我们所有人都经历过同样的事情:我们的硬盘上存储了文件、视频或照片,但不小心删除了它。这个…...

一文看懂llama2(原理模型训练)

自从Transformer架构问世以来,大型语言模型(Large Language Models, LLMs)以及AIGC技术的发展速度惊人,它们不仅在技术层面取得了重大突破,还在商业应用、社会影响等多个层面展现出巨大潜力。随着ChatGPT的推出&#x…...

Sui基金会公布2024年3–4月资助项目名单

Sui基金会宣布3月和4月的资助项目名单,在这两个月中,共有10个项目获得了资助,以加速Sui的整合和发展。其中有八个项目专注于为开发者创造更好的体验,从开发强大的集成开发环境(IDE)到使用零知识证明保护用户…...

Spring Security3.0.1版本

前言: 抽象Spring Security3.0上一篇 在上一篇中,我们完成了对Security导入,快速入门,和对自动配置的简单验证 对登录流程的分析和Security基本原理 补充: 先解决上一篇留下的问题,端口和端点的区别 端…...

网络报文协议头学习

vxlan:就是通过Vxlan_header头在原始报文前面套了一层UDPIP(4/6)Eth_hdr 需求背景:VXLAN:简述VXLAN的概念,网络模型及报文格式_vxlan报文格式-CSDN博客 如果服务器作为VTEP,那从服务器发送到接…...

颜色与纹理

1 将非坐标数据传入顶点着色器 当执行gl.drawArrays()函数时,存储在缓冲区对象中的数据将按照其在缓冲区中的顺序依次传给对应的attribute变量。在顶点着色器中,我们将这两个attribute变量分别赋值给的gl_Position和gl_PointSize,就在指定的位置绘制出指定大小的点了。 1.…...

pytest-playwright 插件的使用

引言 在自动化测试领域,Playwright 是一个强大的工具,它支持 Chromium、Firefox 和 WebKit 三大浏览器引擎。Playwright 提供了与 Pytest 集成的插件,使得编写端到端测试变得更加简单和高效。本文将介绍如何使用 Pytest Playwright 插件来编…...

基于springboot实现智慧校园之家长子系统项目【项目源码】计算机毕业设计

基于springboot实现智慧校园之家长子系统演示 SpringBoot框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SpringBoot,在JavaWeb开发中使用的流行框架有SSH、SpringBoot、SpringMVC等,作为一个课题程序采用SSH框架也可以&#xff0c…...

云WAF的安全审计功能

云WAF(Cloud Web Application Firewall)是一种部署在云端的专业网络安全解决方案,它为Web应用程序提供强力的保护,通过检测和阻止恶意流量、攻击和漏洞,确保Web应用程序的安全性和可用性。在安全审计方面,云…...

第十七章 创建Web客户端 - 其他调整

文章目录 第十七章 创建Web客户端 - 其他调整其他调整使用生成的 Web 客户端类示例 1:使用使用包装消息的客户端示例 2:使用使用未包装消息的客户端 第十七章 创建Web客户端 - 其他调整 其他调整 如果 WSDL 未指定 Web 服务的位置,则 SOAP …...

学习java的日子 Day52 多表联合查询,DCL,数据类型,约束,索引,视图

Day52 1.DML-多表联合查询(重要) 1.1 一对一情况 略 1.2 一对多情况 当需要查询多个表中的字段时,就可以使用表连接来实现。表联接分为内连接和外连接 内连接:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结 外连接:…...

计算机视觉(CV)的教程、相关项目

计算机视觉(CV)是一个广泛而深入的领域,其教程和项目众多。以下是针对计算机视觉(CV)的教程和相关项目的一个清晰概述: 教程 入门教程: OpenCV入门:OpenCV是一个开源的计算机视觉库,提供了大量用于图像和视频处理的函数。可以通过OpenCV的官方文档或在线教程来学习其…...

mysql in 逗号分隔_数据库字段是逗号分隔的查询(FIND_IN_SET(str,strlist)方法的使用)

使用函数FIND_IN_SET(str,strlist)--(推荐) 函数介绍:返回在strlist中str字符串通过“,”分隔成列表后所在的位置(索引),如 SELECT FIND_IN_SET("c", "a,b,c,d,e"); 返回3(索引从1开始) 有了这个方法再回到之前的sql语句可以变成如下: select name,bra…...

【Python】 将日期转换为 datetime 对象在 Python 中

基本原理 在 Python 中,处理日期和时间的库是 datetime,它提供了广泛的功能来处理日期和时间。datetime 模块中有一个 datetime 类,它可以用来表示日期和时间。有时,我们可能会遇到需要将日期字符串转换为 datetime 对象的情况&a…...

dpdk-19.11 arm64 环境适配 Mellanox CX4 网卡

环境信息 cpu: arm64 架构 dpdk 版本:19.11 glibc 版本:2.17 网卡型号: Mellanox CX4 网卡,详细 pci 信息如下: 02:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx] 02:00.1 Ether…...

1141. 查询近30天活跃用户数

1141. 查询近30天活跃用户数 题目链接:1141. 查询近30天活跃用户数 代码如下: # Write your MySQL query statement below select activity_date as day,count(distinct user_id) as active_users from Activity where activity_date between 2019-06-…...

11_JavaWeb监听器

文章目录 监听器1.监听器的分类2.application域监听器案例 监听器 概念:后端要发生一些事情的时候,自动触发一些代码的执行; 1.监听器的分类 web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类 按监听的…...

jmeter常用的断言

包括(Contains):响应内容包括需要匹配的内容即代表响应成功,支持正则表达式 匹配(Matches):响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达…...

Opencv Python图像处理笔记二:图像变换、卷积、形态学变换

文章目录 前言一、几何变换1.1 缩放1.2 平移1.3 旋转1.4 翻转1.5 仿射1.6 透视 二、低通滤波2.1 均值滤波2.2 高斯滤波2.3 中值滤波2.4 双边滤波2.5 自定义滤波 三、高通滤波3.1 Sobel3.2 Scharr3.3 Laplacian3.4 Canny 四、图像金字塔4.1 高斯金字塔4.2 拉普拉斯金字塔 五、形…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

基础测试工具使用经验

背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...