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

【2】基于多设计模式下的同步异步日志系统

6. 相关技术知识补充

6.1 不定参函数

在初学C语⾔的时候,我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。

⽽这种不定参函数在实际的使⽤中也⾮常多⻅,在这⾥简单做⼀介绍:
不定参宏函数

#include <iostream>
#include <cstdarg>
#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, 
##__VA_ARGS__)
int main()
{LOG("%s-%s", "hello", "world");return 0;}

C⻛格不定参函数

#include <iostream>
#include <cstdarg>
void printNum(int n, ...) {va_list al;va_start(al, n);//让al指向n参数之后的第⼀个可变参数for (int i = 0; i < n; i++) {int num = va_arg(al, int);//从可变参数中取出⼀个整形参数std::cout << num << std::endl;}va_end(al);//清空可变参数列表--其实是将al置空
}
int main()
{printNum(3, 11,22,33);printNum(5, 44,55,66,77,88);return 0;
}
#include <iostream>
#include <cstdarg>
void myprintf(const char *fmt, ...) {//int vasprintf(char **strp, const char *fmt, va_list ap);char *res;va_list al;va_start(al, fmt);int len = vasprintf(&res, fmt, al);va_end(al);std::cout << res << std::endl;free(res);
}
int main()
{myprintf("%s-%d", "你好", "世界");return 0;
}

C++⻛格不定参函数


#include <iostream>
#include <cstdarg>
#include <memory>
#include <functional>
void xprintf()//参数包为空的特化
{std::cout << std::endl;
}
template<typename T, typename ...Args>//C++11可变参数包
void xprintf(const T &value, Args &&...args) {std::cout << value << " ";if ((sizeof ...(args)) > 0) {xprintf(std::forward<Args>(args)...);}else {xprintf();}
}
int main()
{xprintf("你好");xprintf("你好", 19);xprintf("你好", "我的心上人", 19);return 0;
}

6.2 设计模式

设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路。它不是语法规定,而是⼀套⽤来提高代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决方案。
六大原则:
• 单一职责原则(Single Responsibility Principle)

1.类的职责应该单⼀,⼀个方法只做⼀件事。职责划分清晰了,每次改动到最⼩单位的⽅法或类。
2.使⽤建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很⾼的函数、数据的封装
3.⽤例:⽹络聊天:⽹络通信 & 聊天,应该分割成为⽹络通信类 & 聊天类

• 开闭原则(Open Closed Principle)

  1. 对扩展开放,对修改封闭
    2.使⽤建议:对软件实体的改动,最好⽤扩展⽽⾮修改的⽅式。
    3.⽤例:超时卖货:商品价格—不是修改商品的原来价格,⽽是新增促销价格。

• 里氏替换原则(Liskov Substitution Principle)

通俗点讲,就是只要父类能出现的地⽅,子类就可以出现,⽽且替换为子类也不会产⽣任何错误或异常。
1.在继承类时,务必重写父类中所有的⽅法,尤其需要注意父类的protected方法,子类尽量不要暴露自己的public⽅法供外界调⽤。
2.使⽤建议:子类必须完全实现父类的⽅法,孩子类可以有⾃⼰的个性。覆盖或实现⽗类的⽅法时,输⼊参数可以被放大,输出可以缩小
3.⽤例:跑步运动员类-会跑步,⼦类⻓跑运动员-会跑步且擅⻓⻓跑, ⼦类短跑运动员-会跑步且擅⻓短跑

• 依赖倒置原则(Dependence Inversion Principle)

1.高层模块不应该依赖低层模块,两者都应该依赖其抽象. 不可分割的原子逻辑就是低层模式,原子逻辑组装成的就是高层模块。
2.模块间依赖通过抽象(接口)发生,具体类之间不直接依赖
3.使⽤建议:每个类都尽量有抽象类,任何类都不应该从具体类派⽣。尽量不要重写基类的方法。结合里氏替换原则使⽤。
4.⽤例:奔驰车司机类–只能开奔驰; 司机类 – 给什么⻋,就开什么⻋; 开车的⼈:司机–依赖于抽象

迪米特法则(Law of Demeter),又叫“最少知道法则”

1.尽量减少对象之间的交互,从而减⼩类之间的耦合。⼀个对象应该对其他对象有最少的了解。
2.对类的低耦合提出了明确的要求:
只和直接的朋友交流, 朋友之间也是有距离的。⾃⼰的就是⾃⼰的(如果⼀个⽅法放在本类中,既不增加类间关系,也对本类不产⽣负⾯影响,那就放置在本类中)。
3.用例:⽼师让班⻓点名–⽼师给班⻓⼀个名单,班⻓完成点名勾选,返回结果,⽽不是班⻓点名,⽼师勾选

• 接口隔离原则(Interface Segregation Principle);

1.客户端不应该依赖它不需要的接⼝,类间的依赖关系应该建立在最小的接⼝上
2.使用建议:接⼝设计尽量精简单⼀,但是不要对外暴露没有实际意义的接口。
3.⽤例:修改密码,不应该提供修改⽤户信息接⼝,⽽就是单⼀的最⼩修改密码接口,更不要暴露数据库操作

从整体上来理解六⼤设计原则,可以简要的概括为⼀句话,⽤抽象构建框架,⽤实现扩展细节,具体到每⼀条设计原则,则对应⼀条注意事项:

• 单⼀职责原则告诉我们实现类要职责单⼀;
• ⾥⽒替换原则告诉我们不要破坏继承体系;
• 依赖倒置原则告诉我们要⾯向接⼝编程;
• 接口隔离原则告诉我们在设计接⼝的时候要精简单⼀;
• 迪米特法则告诉我们要降低耦合;
• 开闭原则是总纲,告诉我们要对扩展开放,对修改关闭。

相关文章:

【2】基于多设计模式下的同步异步日志系统

6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候&#xff0c;我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数&#xff0c;在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...

npm管理发布包-创建与发布

创建与发布 我们可以将自己开发的工具包发布到 npm 服务上&#xff0c;方便自己和其他开发者使用&#xff0c;操作步骤如下 创建文件夹&#xff0c;并创建文件indexjs&#xff0c;在文件中声明函数&#xff0c;使用 module.exports 暴露npm初始化工具包&#xff0c;package.j…...

基于Spring,SpringMVC,MyBatis的校园二手交易网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的校园二…...

酒店 KPI绩效考核指标及应用

“路遥知马力&#xff0c;日久见人心”&#xff0c;目前国内各类型酒店风起云涌&#xff0c;大有在市场竞争中一比高下之势&#xff0c;各路精英受经济型酒店低投入高回报的市场利益驱动&#xff0c;都分分抢占市场&#xff0c;从而使国内经济型酒店的数量不断增加&#xff0c;…...

WordPress两种方法实现上传媒体图片文件自动重命名

我们发布文章时&#xff0c;会上传一些图片、音频之类的文件。但是WordPress没有自动 给新上传文件重命名的功能&#xff0c;逐个文件去重命名那就太麻烦了&#xff0c;那么我们改如何自动给上传的媒体文件图片重命名呢&#xff1f; 我在网站搜索了些上WordPress上传媒体文件自…...

TZOJ 1405 An easy problem

翻译有些出错&#xff0c;但大概是那个意思 答案&#xff1a; #include <stdio.h> #include <ctype.h> //引用库函数isupper的头文件int main() {int T 0, i 0;scanf("%d", &T); //要输入的行数while (T--) //循环T次{char c;int y 0…...

SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离

一、项目简介 本项目是一套基于SpringBoot实现大学生健康档案管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…...

CCC联盟数字车钥匙(三)——UWB MAC时间网格同步及Hopping

本文继续上一篇UWB MAC时间网格继续介绍UWB MAC中关于时间同步相关内容。 3、MAC时间网格同步 每个测距会话的定义都基于相对的指定时钟参考 U W B t i m e 0 k UWB^k_{time0} UWBtime0k​&#xff0c;相对于发起者的内部时钟定义。 时钟参考 U W B t i m e 0 k UWB^k_{time0} …...

一周上手 steam搬砖项目或成2024年最受欢迎副业

蒸汽砖拆除项目&#xff0c;兼职创业两不误&#xff0c;助你轻松赚钱 你是否想要找到一个既可以兼职又可以创业的项目&#xff1f;蒸汽砖拆除项目正逐渐崭露头角&#xff0c;引起了越来越多人的关注。这个项目不仅门槛低&#xff0c;上手快&#xff0c;而且不用担心卖不出去&am…...

java数据结构(哈希表—HashMap)含LeetCode例题讲解

目录 1、HashMap的基本方法 1.1、基础方法&#xff08;增删改查&#xff09; 1.2、其他方法 2、HashMap的相关例题 2.1、题目介绍 2.2、解题 2.2.1、解题思路 2.2.2、解题图解 2.3、解题代码 1、HashMap的基本方法 HashMap 是一个散列表&#xff0c;它存储的内容是键…...

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…...

计算机软件的分类

以功能进行分类&#xff0c;计算机软件通常可以分为系统软件和应用软件两大类。 系统软件&#xff1a;系统软件是计算机运行和管理的基本软件&#xff0c;包括操作系统、驱动程序、系统工具和服务程序等。操作系统是系统软件的核心&#xff0c;负责管理计算机的硬件资源、提供用…...

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB &#xff08;1&#xff09;概念 …...

服务器配置 jupyter lab,并在本地浏览器免密登陆

一、背景 快速搭建一个jupyter lab 不用每次用ssh登录输入密码 二、步骤 方法1、临时在服务器启动 jupyter lab&#xff0c;并在本地浏览器免密登陆 两句命令解决 pip install jupyterlabnohup jupyter lab --ServerApp.ip"*" --ServerApp.password"" -…...

WebUI自动化学习(Selenium+Python+Pytest框架)002

新建项目 New Project 新建一个python代码文件 file-new-python file 会自动创建一个.py后缀的代码文件 注意:命名规则,包含字母、数字、下划线&#xff0c;不能以数字开头&#xff0c;不能跟python关键字或包名重复。 ********************华丽分割线********************…...

miot-plugin-sdk. npm install安装失败

miot-plugin-sdk-npm install安装失败 最紧公司要开发一台智能设备&#xff0c;经过同事的对比&#xff0c;选中了米家作为云平台&#xff0c;于是&#xff0c;我就负责开发app界面端&#xff0c;根据官方文档教程 下载了miot-plugin-sdk 程序&#xff0c;准备开始开发,结果悲…...

抓取微信好友列表信息

本文实现的是一种较为安全、简洁、高效的抓取微信好友信息的方法。 实现工具&#xff1a;微信pc端、影刀RPA 主要流程&#xff1a; 手动—前期准备&#xff0c;电脑登陆微信&#xff0c;打开联系人页&#xff0c;使得联系人分类“A”显现在微信窗口界面 自动—运行程序&#…...

创建JDK8版本的SpringBoot项目的方法

目录 一.通过阿里云下载 二.通过IDEA创建 1.下载安装JDK17 2.创建SpringBoot 3.X的项目 3.把JDK17改成JDK8 截止到2023.11.24&#xff0c;SpringBoot不再支持3.0X之前的版本&#xff0c;3.0X之后的版本所对应的JDK版本为JDK17&#xff0c;下面介绍如何在idea上继续使用JDK…...

Python【走出棋盘】

要求&#xff1a; 某个人进入如下一个棋盘中&#xff0c;要求从左上角开始走&#xff0c; 最后从右下角出来&#xff08;要求只能前进&#xff0c;不能后退&#xff09;&#xff0c; 问题&#xff1a;共有多少种走法&#xff1f; 0 0 0 0 0 0 0 0 0 0 0 0 0 …...

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…...

Polars 2.0清洗性能天花板在哪?实测对比Dask/Modin/Vaex:单机1TB数据清洗仅需11.3秒(附完整安装脚本)

第一章&#xff1a;Polars 2.0 大规模数据清洗技巧Polars 2.0 引入了更严格的惰性执行模型、增强的字符串与时间处理能力&#xff0c;以及原生支持多线程 I/O 的 LazyFrame API&#xff0c;显著提升了 TB 级数据清洗的吞吐与可控性。相比 Pandas&#xff0c;其列式内存布局与零…...

OpenClaw批量任务队列:百川2-13B-4bits量化版处理百条邮件自动回复

OpenClaw批量任务队列&#xff1a;百川2-13B-4bits量化版处理百条邮件自动回复 1. 为什么需要邮件自动回复系统 上周我收到了一封来自老客户的紧急咨询邮件&#xff0c;当时正在外地参加会议无法及时回复。等三天后回到电脑前&#xff0c;发现邮箱里堆积了127封未读邮件——其…...

抖音批量下载终极指南:免费无水印,一键搞定视频、音乐、合集

抖音批量下载终极指南&#xff1a;免费无水印&#xff0c;一键搞定视频、音乐、合集 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and brows…...

大厂高薪抢手!文科生如何抓住AI时代机遇,实现职业逆袭?

大厂纷纷高薪招聘文科生&#xff0c;引发社会关注。文科生凭借沟通、叙事、逻辑等优势&#xff0c;在大模型理解人类价值观、企业品牌宣传等方面发挥作用。高校也调整专业设置&#xff0c;培养跨学科人才。文章建议文科生根据自身专业&#xff0c;向文案策划、品牌宣传、法务、…...

MIKE URBAN中如何添加污水管水质

管网中的水质一直是管网模型中的一个难题&#xff0c;很多群友也要求小编更新水质方面的内容&#xff0c;一方面&#xff0c;其实水质相关的内容官方资料已经很多了&#xff0c; 觉得没必要重复更新。另一方面&#xff0c;管道水质率定实在太难以率定&#xff0c;很难算的准确。…...

102. 在控制平面主机名更改后恢复 Rancher 配置的 RKE2 集群

Environment 环境 Rancher provisioned RKE2 downstream cluster control plane node hostname changed, without removing the node from the cluster. Rancher 配置了 RKE2 下游集群控制平面节点的主机名更改&#xff0c;但未将该节点从集群中移除。 Procedure 程序It is …...

提升效率:用快马AI一键生成windows18-hd19风格的CSS组件库

提升效率&#xff1a;用快马AI一键生成windows18-hd19风格的CSS组件库 最近在做一个需要windows18-hd19设计风格的项目&#xff0c;这种风格的界面元素特别多&#xff0c;手动编写样式简直让人头大。光是调色板、阴影效果这些基础样式就要折腾半天&#xff0c;更别说那些复杂的…...

DeOldify开发者效率提升:10分钟集成到现有Flask/Django项目中

DeOldify开发者效率提升&#xff1a;10分钟集成到现有Flask/Django项目中 1. 项目简介 你是不是遇到过这样的场景&#xff1a;客户想要一个黑白照片上色的功能&#xff0c;但你完全不懂深度学习&#xff1f;或者想要给老照片修复应用添加AI能力&#xff0c;却被复杂的模型部署…...

揭秘JVM创世过程之Call Stub进入Java世界的门票

前言 本文旨在记录近期研读Java源码的学习心得与疑难问题。由于个人理解水平有限&#xff0c;文中内容可能存在疏漏&#xff0c;恳请读者不吝指正。 前情回顾 在揭秘JVM创世过程之两种语言首席外交官JavaCalls&#xff0c;一文中将JVM看作Java世界中一个拥有两种语言的领事馆…...

若依框架实战:如何优雅地实现静态资源权限校验(附完整代码)

若依框架静态资源权限校验实战指南 在企业级应用开发中&#xff0c;静态资源的安全访问控制是一个常见需求。无论是小程序图片资源管理&#xff0c;还是企业内部文档权限控制&#xff0c;都需要确保只有授权用户才能访问特定资源。本文将深入探讨如何在若依(RuoYi)框架中实现静…...