当前位置: 首页 > 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 拉普拉斯金字塔 五、形…...

暗黑破坏神2存档修改实用教程:从入门到精通的d2s编辑器全攻略

暗黑破坏神2存档修改实用教程:从入门到精通的d2s编辑器全攻略 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款专为《暗黑破坏神2》玩家打造的开源存档编辑工具,支持角色属性调整、物品管…...

秋招简历模板下载怎么选?6款主流简历模板工具深度测评

秋招季来临,对应届生来说,简历是踏入职场的第一块敲门砖,而一份贴合岗位需求、契合HR筛选思路的简历模板,既能降低简历制作难度,也是提高简历初筛通过率的关键。如今市面上的简历模板工具五花八门,功能定位…...

3.多表关联在电商数据分析中的核心价值

多表关联在电商数据分析中的核心价值 第1章 多表关联、子查询与行列转换在电商数据分析中的核心价值 1.1 为什么单表查询不够用 我刚开始做数据分析的时候,以为SQL就是在一张表上做筛选和汇总。直到有一天,运营问我:“这批高价值用户&#xf…...

Kodi中文插件库终极指南:3分钟打造你的智能家庭影院

Kodi中文插件库终极指南:3分钟打造你的智能家庭影院 【免费下载链接】xbmc-addons-chinese Addon scripts, plugins, and skins for XBMC Media Center. Special for chinese laguage. 项目地址: https://gitcode.com/gh_mirrors/xb/xbmc-addons-chinese 还在…...

保姆级教程:用yangipcclient RN SDK 8.0快速给你的App加上实时对讲功能

保姆级实战:React Native应用集成实时对讲功能的完整指南 想象一下,你正在开发一款智能家居控制应用,用户反馈最强烈的需求是能够直接与家中的设备进行语音对讲。或者你负责的教育类App,小组讨论时缺少高效的实时语音沟通工具。传…...

QtScrcpy突破手游操控限制:从设备连接到多端协同的全栈解决方案

QtScrcpy突破手游操控限制:从设备连接到多端协同的全栈解决方案 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 在移动游戏竞技领域,触控操作的物理局限已成…...

告别重复造轮子:用快马AI一键生成SpringBoot通用后台管理模块

最近在做一个后台管理系统的项目,发现每次从零开始搭建SpringBoot框架都要重复写很多样板代码,特别浪费时间。后来尝试用InsCode(快马)平台的AI生成功能,效率提升了好几倍。今天就来分享下如何快速生成SpringBoot通用后台模块。 1. 后台管理…...

2025小红书跳转卡片技术揭秘:从逆向分析到服务器端自动化部署

1. 小红书跳转卡片技术现状解析 小红书跳转卡片功能原本是平台提供给商家的官方营销工具,但近期所有公开接口都已关闭。现在市面上能正常使用的方案,基本都是通过逆向工程实现的Hook技术方案。我花了两个月时间逆向分析了小红书安卓端7.8版本到8.5版本的…...

UE4实战:利用VaRest与VictoryBPLibrary实现高效本地文件读写

1. 为什么需要本地文件读写 在虚幻引擎4开发过程中,我们经常需要保存游戏配置、玩家进度或者关卡数据。想象一下你正在开发一个RPG游戏,需要记录玩家背包里的所有物品、当前任务进度和角色属性。如果每次退出游戏这些数据都消失,玩家肯定会抓…...

Ubuntu下Minicom与Kermit串口工具对比:哪个更适合你的嵌入式开发?

Ubuntu下Minicom与Kermit串口工具深度评测:嵌入式开发者的终极选择指南 在嵌入式开发领域,串口通信如同开发者的"听诊器",是调试硬件、监控系统状态的核心工具。Ubuntu作为最受开发者欢迎的Linux发行版之一,其生态中Mi…...