框架与代码的形状
作为一个代码的设计者,我之前讨论过代码的形状,从“名字”出发,进行讨论。代码的形状:重构的方向-CSDN博客
从比喻的角度来看,名字似代码的血和肉,而框架则似代码的骨架。
猎豹和大象
在大自然中,每一种动物都有自己的骨架,因而有了自己的特性。
猎豹的骨架结构使其能够快速奔跑——它的脊柱高度灵活,四肢修长且肌肉集中,这种极致的优化让它成为陆地上速度最快的动物。然而,这种特化也带来了代价:猎豹的骨架无法支撑过重的身体,也无法适应复杂的地形。相比之下,大象的骨架结构则显得厚重而稳健——它的四肢粗壮如柱,脊柱坚固且略微拱起,这种设计让它能够承载数吨的重量,并适应各种复杂环境(如沼泽、丛林)。然而,大象的骨架也限制了它的灵活性,使其无法像猎豹一样快速奔跑或急转弯。
之所以用猎豹和大象来做比喻,也是因为它们也对应了两种典型的框架思路,“显式框架”和“隐式框架”。
典型的显式框架
,如React、Vue,就像猎豹的骨架一样,高度特化,专为速度而设计。借助这些框架,我们能够迅速搭建起项目,项目的完成周期甚至可以缩短至以周计。至于隐式框架
,我认为将其称为非显示框架
或许更为贴切,它更适用于处理那些具有不确定性的,酷似丛林探险特征的任务。
我也很幸运,最近同时在处理一个Vue3的项目和一个为vue3服务的cli。前者使用了上面讨论的显式框架
,后者则使用了隐式框架
。
显式框架-Vue3
这个Vue3项目是基于Geek-Admin来二次开发的。Vue 3 项目中典型的文件夹结构(如 hooks、views、components、routes)正是其显式框架
特征的直接体现。这种结构不仅反映了 Vue 3 的设计哲学,还展示了显式框架如何通过约定与约束塑造代码的形状。
一、文件夹结构的显式特征
-
components
:组件化约束- Vue 3 强制开发者将 UI 拆分为可复用的组件,每个组件是一个独立的单元(
.vue
文件)。 - 显式体现:组件必须放在
components
文件夹中,遵循单文件组件(SFC)规范。 - 示例:
/components/ECharts/index.vue/config/index.ts/ProTable/index.vue
- Vue 3 强制开发者将 UI 拆分为可复用的组件,每个组件是一个独立的单元(
-
views
:页面级抽象views
文件夹通常用于存放页面级组件,每个页面对应一个路由。- 显式体现:页面与路由的对应关系通过文件夹结构清晰表达。
- 示例:
/views/about.vue/assembly/batchImport/index.vue/index.scss
-
routes
:路由集中管理- Vue Router 的配置通常集中在
routes
文件夹中,显式定义路由与组件的映射关系。 - 显式体现:路由配置与页面逻辑分离,便于维护和扩展。
- 示例:
// /routes/index.js const routes = [{ path: '/', component: Home },{ path: '/about', component: About }, ];
- Vue Router 的配置通常集中在
-
hooks
:逻辑复用抽象- Vue 3 的 Composition API 鼓励将可复用逻辑抽象为自定义 Hook(类似于 React 的 Hooks)。
- 显式体现:逻辑复用代码集中在
hooks
文件夹中,与 UI 组件分离。 - 示例:
// /hooks/usePagination.tsimport { ref } from "vue"; import type { Pageable, DataLoader } from "@/components/interface";export function usePagination(initialPageSize: number | null, // 初始化每一页的数量,如果为null,则表示不处理翻页loadCallback: DataLoader | null // 翻页回调,如果设置为null,那么将不处理翻页回调) {...return {pageable: _pageable,...};}
上面是基于vue框架呈现出来的代码形状,我们一般都用这样的文件结构去一步一步地搭建基于vue的项目。
为什么呢?因为它符合vue显式框架
的特征。
-
约定优于配置
显式框架通过文件夹命名和文件位置显式定义代码的职责(如 components 存放组件,views 存放页面,hooks 存放可复用的逻辑,stores 管理全局状态)。这种“约定优于配置”的设计,不仅降低了项目的维护门槛,还让开发者能够快速理解代码结构,从而提升团队协作效率和开发速度。 -
职责分离
显式框架通过文件夹结构实现职责分离(如 components 负责 UI,stores 管理状态,hooks 封装逻辑),使得不同开发者在维护同一项目时,能够自然地遵循高内聚、低耦合的设计原则。这种一致性不仅降低了沟通成本,还让代码更易维护和扩展,从而有效抵御代码腐烂,延长项目的生命周期。
显式框架
的特征还体现了高度的可预测性,基于显式框架
的约定,可以快速估算出需要开发的页面数量及组件数量,因而使得项目的开发周期更容易量化和评估——无论是新功能的添加,还是问题的排查,开发者都能快速定位相关代码,从而提升整体交付效率。
与显式框架
不同,隐式框架
则是另外一番景象。
隐式框架
首先隐式框架
并没有约定的文件目录结构,也就是说它没有事先的约定来指导代码的功能与代码形状之间的关系。例如,在上面讨论的显式框架
Vue中,公共的UI组件,放在components文件夹下,页面放在views文件夹下等。同样,在隐式框架
中,对于即将增加的新功能,应该将其安放在何处,也没有像显式框架
那么显而易见。
安放在何处也许就是隐式框架
本身的答案。
之前写了一篇文章代码设计的几个关注点,这也算是我在隐式框架
主题上的一次探索。在那篇文章中,我讨论了通过重构变量名和文件名来解决安放何处
的问题,同时也提到了“王阳明”先生的“心即理”。如果非要用一句话来概括,“逻辑上的合理性”吧。
在但后面的思考中,我发现很难用一句话,或者不应该用一句话来阐述隐式框架
,原因很简单,如果可以,那它就不是隐式框架
了。
像vue3-project-cli这样的项目,本身就是探索性的,没有明确的目标,就像在丛林中探险,猎奇,甚至还有一些碰运气的成分。
对于这个项目,开发语言使用的是Rust,命令行参数使用的是clap,typescript代码的处理使用的是swc,数据的反序列化处理使用的是serde。这3个库在Rust生态中的使用频率极高,具备了显性的特征。也就是说,在Rust的生态中,涉及读取命令行参数的相关功能,都会选择clap,涉及到typescript或者javascript的相关ast的处理,都会选择swc,涉及到序列化与反序列化,动态数据的读取,都会想到serde。
但如何组织这些功能的代码,却没有一个显式的约定。但没有显示的约定并不意味着没有章法,接下来进入命令式
和函数式
的话题。
命令式与函数式
在没有“显式框架”之前,命令式编程和函数式编程是隐藏在背后指导代码生长的基因,它们决定着代码的形状。
命令式关注如何实现具体的业务逻辑,在命令式编程中,变量用于存储数据值,这些值可以在程序执行过程中被修改和更新。它被用于系统编程,高性能应用领域,以及和硬件结合紧密的领域。在命令式的编程上可以看到汇编语言的影子,以实现为目的,以修改状态为目的。
命令式编程的代码的形状具有如下特点:
- 顺序执行:
- 命令式编程范式的代码通常按照顺序执行,即程序中的语句按照书写的顺序从上到下依次执行。
- 控制结构(如循环、条件语句)用于控制程序的执行流程,但整体上仍然遵循顺序执行的原则。
- 可变状态:
- 命令式编程范式允许程序中的变量在执行过程中被修改和更新。
- 程序的状态(如变量的值)是程序执行过程中重要的组成部分,状态的变化直接影响程序的执行结果。
- 显式控制:
- 开发者需要显式地指定程序的执行步骤和控制流程。
- 程序的执行过程需要开发者进行精细的控制和管理,包括内存管理、错误处理等。
函数式编程通过引入高阶函数和不可变数据结构等概念,提供了一种更加声明式、抽象化的数据处理方式。这种方式使得代码更加简洁、易读、可预测和易于并行化。函数式编程被大量的应用于数据处理,事件处理以及并发处理中。
函数式编程的代码形状具有如下特点:
- 函数式组合:
- 函数式编程范式的代码通常通过函数的组合和变换来实现复杂的逻辑。
- 高阶函数(如映射、过滤、归约等)用于抽象数据处理逻辑,使得代码更加简洁和易读。
- 不可变数据:
- 函数式编程范式强调数据的不可变性,即数据一旦创建就不可修改。
- 数据的更新通过创建新的数据副本并应用修改来实现,从而避免了共享状态和副作用。
- 声明式编程:
- 函数式编程范式倾向于声明式编程风格,即描述“做什么”而非“怎么做”。
- 开发者需要关注问题的解决方案而非具体的执行步骤,这使得代码更加接近数学表达式,易于理解和推理。
结束啦,也是从这里开始
我们应该有所察觉,即便在理想的状态下,我们的项目选择了命令式或者函数式编程范式,这仍然只是编程理念的一部分。在实际的开发过程中,我们还倾向于通过一个显式框架来提供约定和规范,让我们的代码更加有序、可维护。
回望过去,在Vue框架诞生之前,繁荣的是JQuery。JQuery以其简洁易用的特性,极大地简化了DOM操作和事件处理,成为了当时Web开发者的首选。然而,随着Web应用的日益复杂,隐式的、松散的约定已经无法满足开发的需求。
正是在这个背景下,隐式框架向显式框架的转换过程悄然展开。这一转换不仅带来了技术上的革新,更蕴藏着无数的机会。显式框架通过提供明确的约定和规范,使得代码更加易于理解和维护,降低了开发成本,提高了开发效率。同时,它也促进了开发者之间的协作,使得团队开发变得更加顺畅。
而即便我们已经有了Vue3这样的成熟且强大的显式框架,这个转换过程仍然没有结束。技术的进步是永无止境的,随着Web应用的不断发展和变化,我们对框架的需求也在不断变化。新的挑战和问题不断涌现,需要我们不断探索和创新。因此,隐式框架向显式框架的转换,或者说框架的不断演进和完善,是一个持续的过程。
也许这就是我继续在vue3-project-cli投入精力的勇气吧。
相关文章:
框架与代码的形状
作为一个代码的设计者,我之前讨论过代码的形状,从“名字”出发,进行讨论。代码的形状:重构的方向-CSDN博客 从比喻的角度来看,名字似代码的血和肉,而框架则似代码的骨架。 猎豹和大象 在大自然中&…...
解决vscode扩展插件开发webview中的请求跨域问题
在webview中是无法发送跨域请求的,可以通过消息机制,在插件中发请求,然后将请求结果传递给webview 我的代码是基于vscode-webview-ui-toolkit-samples-vue来写的 webview vue组件中的代码示例 async function initData() {// 向插件发送消…...
junit5定制点
一、JUnit 5 自定义定制点是什么? JUnit 5 提供了强大的扩展模型(Extension Model),允许开发者通过实现特定接口(如 BeforeEachCallback、ParameterResolver)自定义测试行为。这些接口称为定制点ÿ…...
基于SpringBoot的信息技术知识赛系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【Rust自学】20.1. 最后的项目:单线程Web服务器
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 20.1.1. 什么是TCP和HTTP Web 服务器涉及的两个主要协议是超文本传输协议(Hypertext T…...
LabVIEW涡轮诊断系统
一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备,其运行状态直接关系到生产安全与经济效益。据统计,涡轮故障导致的非计划停机可造成每小时数十万元的经济损失,且突发故障可能引发严重安全事故。传统人…...
想品客老师的第十天:类
类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号,对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…...
注解(Annotation)
注解(Annotation)在 Java 中可以用来简化类的使用,使得被注解的类能够被自动发现、自动创建并在需要的地方直接调用,而不需要手动创建实例。具体来说,注解是用来标识类、方法、字段等的,它们通常与一些框架…...
使用开源项目:pdf2docx,让PDF转换为Word
目录 1.安装python 2.安装 pdf2docx 3.使用 pdf2docx 转换 PDF 到 Word pdf2docx:GitCode - 全球开发者的开源社区,开源代码托管平台 环境:windows电脑 1.安装python Download Python | Python.org 最好下载3.8以上的版本 安装时记得选择上&#…...
编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider
Cursor自己可以看成一个IDE,而且有强大的RAG功能,这让它对你的意图感知非常厉害,可以精确补全,可以感受代码片段 Aider可以看作一个袖珍,灵活,强大的扳手,怎么用都行,可以放在脚本里调用,可以看代码,可以修改代码。相比Cursor而言,它感受的是文件级别,颗粒度有些不…...
如何安全地管理Spring Boot项目中的敏感配置信息
在开发Spring Boot应用时,我们经常需要处理一些敏感的配置信息,比如数据库密码、API密钥等。以下是一个最佳实践方案: 1. 创建配置文件 application.yml(版本控制) spring:datasource:url: ${MYSQL_URL:jdbc:mysql…...
为AI聊天工具添加一个知识系统 之77 详细设计之18 正则表达式 之5
本文要点 昨天讨论了 本项目(AI聊天工具添加一个知识系统)中正则表达式模板的设计中可能要考虑到的一些问题(讨论到的内容比较随意,暂时无法确定 那些考虑 是否 应该是正则表达式模板设计要考虑的以及 是否完整)。今天…...
Ubuntu下Tkinter绑定数字小键盘上的回车键(PySide6类似)
设计了一个tkinter程序,在Win下绑定回车键,直接绑定"<Return>"就可以使用主键盘和小键盘的回车键直接“提交”,到了ubuntu下就不行了。经过搜索,发现ubuntu下主键盘和数字小键盘的回车键,名称不一样。…...
安全实验作业
一 拓扑图 二 要求 1、R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分; 4、所有设备均可访问R4的环回&#x…...
NOTEPAD++编写abap
参考下面三个链接 Notepad ABAP代码高亮显示_notepad代码高亮颜色-CSDN博客 百度安全验证 ABAP Syntax Highlighting in Notepad Part 2 - SAP Community 最后XML文件看看你可以自己增加些新语法的高亮显示...
基于python的体育新闻数据可视化及分析
项目 :北京冬奥会体育新闻数据可视化及分析 摘 要 随着社会的不断进步与发展,新时代下的网络媒体获取的信息也更加庞大和繁杂,相比于传统信息来源更加难以分析和辨别,造成了新时代媒体从业者撰写新闻的难度。在此背景下ÿ…...
C# 精炼题18道题(类,三木运算,Switch,计算器)
1.数组元素和 2.数组元素乘积 3.数组元素平均数 4.数组中最大值 5.数组中的偶数 6.数组中的阶乘 7.数组反转 8.字符串反转 9.回文字符串 10.检查回文 11.最小最大值 12.找素数 13.字符串中的最长无重复字符串 14.字符串去重 15.数组中计算两数之和 16.数字到字符…...
vue2语法速通
首先,git clone下来的项目要npm install下载依赖,如果是vue项目,运行通常npm run serve或者npm run dev vue速通一下 使用vite创建项目(较快) npm create vite 配置文件 src/ ├── assets/ # 存放…...
LabVIEW图片识别逆向建模系统
本文介绍了一个基于LabVIEW的图片识别逆向建模系统的开发过程。系统利用LabVIEW的强大视觉处理功能,通过二维图片快速生成对应的三维模型,不仅降低了逆向建模的技术门槛,还大幅提升了建模效率。 项目背景 在传统的逆向建模过程中…...
idea隐藏无关文件
idea隐藏无关文件 如果你想隐藏某些特定类型的文件(例如 .log 文件或 .tmp 文件),可以通过以下步骤设置: 打开设置 在菜单栏中选择 File > Settings(Windows/Linux)或 IntelliJ IDEA > Preference…...
Google C++ Style / 谷歌C++开源风格
文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…...
猫眼Java开发面试题及参考答案(上)
详细介绍项目,像项目中如何用 Redis,用到 Redis 哪些数据类型,项目中遇到哪些问题,怎么解决的 在我参与的一个电商项目中,Redis 发挥了至关重要的作用。这个电商项目主要是为用户提供商品浏览、购物车管理、订单处理等一系列功能。 在项目中使用 Redis 主要是为了提升系统…...
CNN的各种知识点(五):平均精度均值(mean Average Precision, mAP)
平均精度均值(mean Average Precision, mAP) 1. 平均精度均值(mean Average Precision, mAP)概念:计算步骤:具体例子:重要说明:典型值范围: 总结: 1. 平均精度…...
8.原型模式(Prototype)
动机 在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…...
DeepSeek-R1:开源机器人智能控制系统的革命性突破
目录 引言 一、DeepSeek-R1 的概述 1.1 什么是 DeepSeek-R1? 1.2 DeepSeek-R1 的定位 二、DeepSeek-R1 的核心特性 2.1 实时控制能力 2.2 多传感器融合 2.3 路径规划与导航 2.4 人工智能集成 2.5 开源与模块化设计 2.6 跨平台支持 三、DeepSeek-R1 的技术…...
网络安全学习 day5
状态检测和会话技术 状态检测以 “ 数据流量 ” 为单位来对报文进行检测和转发。即对一条流量的第一个报文进行包过滤规 则检查,并将判断结果作为这条流量的 “ 状态 ” 记录下来 。对于该条流量的后续报文,直接根据这个 “ 状态 ”来判断是否转发还是…...
[leetcode·回溯算法]回溯算法解题套路框架
本文参考labuladong算法笔记[回溯算法解题套路框架 | labuladong 的算法笔记] 本文解决几个问题: 回溯算法是什么?解决回溯算法相关的问题有什么技巧?如何学习回溯算法?回溯算法代码是否有规律可循? 其实回溯算法和我…...
【怎么用系列】短视频戒除—1—对推荐算法进行干扰
如今推荐算法已经渗透到人们生活的方方面面,尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨,慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...
【deepseek实战】绿色好用,不断网
前言 最佳deepseek火热网络,我也开发一款windows的电脑端,接入了deepseek,基本是复刻了网页端,还加入一些特色功能。 助力国内AI,发出自己的热量 说一下开发过程和内容的使用吧。 目录 一、介绍 二、具体工作 1.1、引…...
kali下Docker详细安装、docker-compose安装
目录 一、kali下docker安装 1. 更换apt源 2.安装docker 3.配置国内镜像加速器 4.利用docker运行靶场环境 二、docker-compose安装 1.下载docker-compose文件 2.将下载的文件复制到指定位置 3.赋予执行权限 4.利用docker-compose运行靶场环境 一、kali下docker安装 1.…...
Spring理论知识(Ⅴ)——Spring Web模块
Spring的组成 Spring由20个核心依赖组成,这20个核心依赖可以分为6个核心模块 Spring Web模块简介 众所周知,Java目前最大的一个用途就是作为Web应用的服务端(Java Web) Spring又是JavaEE中使用最广泛的开发框架࿰…...
图书管理系统 Axios 源码__新增图书
目录 功能介绍 核心代码解析 源码:新增图书功能 总结 本项目基于 HTML、Bootstrap、JavaScript 和 Axios 开发,实现了图书的增删改查功能。以下是新增图书的功能实现,适合前端开发学习和项目实践。 功能介绍 用户可以通过 模态框…...
【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步
会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…...
Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法
Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…...
Docker入门篇(Docker基础概念与Linux安装教程)
目录 一、什么是Docker、有什么作用 二、Docker与虚拟机(对比) 三、Docker基础概念 四、CentOS安装Docker 一、从零认识Docker、有什么作用 1.项目部署可能的问题: 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题࿱…...
完美世界C++游戏开发面试题及参考答案
堆栈数据结构有什么区别,举例说明 栈(Stack)和堆(Heap)是两种不同的数据结构,它们在多个方面存在显著区别: 存储方式 栈:栈是一种后进先出(LIFO)的数据结构,它的存储空间是连续的。栈由系统自动分配和释放,用于存储函数调用时的局部变量、函数参数、返回地址等信息…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.21 随机数生成:梅森旋转算法的工程实现
2.21 随机数生成:梅森旋转算法的工程实现 目录 #mermaid-svg-J92AWLtQsj9ys1z6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-J92AWLtQsj9ys1z6 .error-icon{fill:#552222;}#mermaid-svg-J92AWLtQsj9y…...
LeetCode 0922.按奇偶排序数组 II:O(1)空间复杂度-一次遍历双指针
【LetMeFly】922.按奇偶排序数组 II:O(1)空间复杂度-一次遍历双指针 力扣题目链接:https://leetcode.cn/problems/sort-array-by-parity-ii/ 给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进…...
VSCode设置内容字体大小
1、打开VSCode软件,点击左下角的“图标”,选择“Setting”。 在命令面板中的Font Size处选择适合自己的字体大小。 2、对比Font Size值为14与20下的字体大小。...
【蓝桥杯】日志统计
日志统计(编程题)https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53 题目 日志统计(编程题) 讲解 这个讲解感觉比较通俗易懂。 蓝桥杯2018年省赛B组08(c/c)日…...
九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2)
九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2) 文章目录 九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2)1. Redis 持久化 AOF 概述2. AOF 持久化流程3. AOF 的配置4. AOF 启…...
蓝桥杯备赛题目练习(一)
一. 口算练习题 ## 题目描述 王老师正在教简单算术运算。细心的王老师收集了 i 道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比…...
【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面我们已经学习了有关信号的一些基本的知识点,包括:信号的概念、信号产生和信号处理等,今天我们重…...
AI与SEO关键词的完美结合如何提升网站流量与排名策略
内容概要 在当今数字营销环境中,内容的成功不仅依赖于高质量的创作,还包括高效的关键词策略。AI与SEO关键词的结合,正是这一趋势的重要体现。 AI技术在SEO中的重要性 在数字营销领域,AI技术的引入为SEO策略带来了前所未有的变革。…...
《运维:技术的基石,服务的保障》
1. LVS(Linux Virtual Server):基于Linux内核的四层负载均衡解决方案 2. Bonding(链路聚合):物理网卡冗余与带宽叠加技术 3. RHEL(Red Hat Enterprise Linux):企业级Li…...
CSS Display属性完全指南
CSS Display属性完全指南 引言核心概念常用display值详解1. block(块级元素)2. inline(行内元素)3. inline-block(行内块级元素)4. flex(弹性布局)5. grid(网格布局&…...
【C++】STL——vector底层实现
目录 💕 1.vector三个核心 💕2.begin函数,end函数的实现(简单略讲) 💕3.size函数,capacity函数的实现 (简单略讲) 💕4.reserve函数实现 (细节…...
Docker Compose的使用
文章首发于我的博客:https://blog.liuzijian.com/post/docker-compose.html 目录 Docker Compose是什么Docker Compose安装Docker Compose文件Docker Compose常用命令案例:部署WordPress博客系统 Docker Compose是什么 Docker Compose是Docker官方的开源…...
11 3D变换模块(transform3d.rs)
transform3d.rs代码定义了一个名为 Transform3D 的 Rust 结构体,它用于表示一个3D变换矩阵。这个结构体是泛型的,包含三个类型参数:T、Src 和 Dst。其中,T 用于矩阵元素的数据类型,Src 和 Dst 用于表示变换的源和目标类…...
昆仑万维Java开发面试题及参考答案
进程和线程的区别是什么? 进程和线程都是操作系统中非常重要的概念,它们在多个方面存在显著的区别。 从定义上看,进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间,包括代码段、数据段、堆栈段等。例如,当你在电脑上同时打开浏览器和音乐播放…...