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

面向对象设计原则 - SOLID原则 (基于C++)

SOLID 是面向对象编程中的一组五个设计原则,这些原则旨在帮助开发者创建更灵活、可维护和可扩展的软件系统。它们最初由 Robert C. Martin 提出,并在 2000 年左右被广泛接受。每个字母代表一个不同的原则:

  1. 单一职责原则 (Single Responsibility Principle, SRP)
  2. 开闭原则 (Open-Closed Principle, OCP)
  3. 里氏替换原则 (Liskov Substitution Principle, LSP)
  4. 接口隔离原则 (Interface Segregation Principle, ISP)
  5. 依赖反转原则 (Dependency Inversion Principle, DIP)

下面我们将逐一详细讲解每个原则,并通过 C++ 示例来说明如何应用这些原则。


1. 单一职责原则 (SRP)

定义: 一个类应该只有一个引起它变化的原因,即一个类只负责一项功能或职责。

解释: 如果一个类承担了太多的责任,那么当需求发生变化时,这个类可能会因为多个原因而需要修改,这样会增加代码的复杂性和维护难度。因此,我们应该将不同的职责分配给不同的类。

示例:

// 错误示例:违反了单一职责原则
class User {
public:void registerUser() {// 注册用户逻辑}void sendEmail() {// 发送邮件逻辑}
};// 正确示例:符合单一职责原则
class UserRegistration {
public:void registerUser() {// 注册用户逻辑}
};class EmailSender {
public:void sendEmail() {// 发送邮件逻辑}
};

2. 开闭原则 (OCP)

定义: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

解释: 这意味着我们应该能够通过添加新的功能来扩展现有代码的行为,而不需要修改已有的代码。这可以通过使用继承、多态等方式来实现。

示例:

// 错误示例:违反了开闭原则
class Shape {
public:virtual double area() = 0;
};class Circle : public Shape {
public:double radius;double area() override {return 3.14 * radius * radius;}
};class Rectangle : public Shape {
public:double width, height;double area() override {return width * height;}
};void printArea(Shape* shape) {std::cout << "Area: " << shape->area() << std::endl;
}// 添加新形状时需要修改已有代码
class Triangle : public Shape {
public:double base, height;double area() override {return 0.5 * base * height;}
};// 正确示例:符合开闭原则
void printArea(Shape* shape) {std::cout << "Area: " << shape->area() << std::endl;
}

3. 里氏替换原则 (LSP)

定义: 子类必须能够替换其基类而不影响程序的正确性。

解释: 这意味着子类应该能够在不改变程序行为的前提下,替代父类出现的地方。如果子类改变了父类的行为,可能会导致程序产生意想不到的结果。

示例:

// 错误示例:违反了里氏替换原则
class Rectangle {
public:virtual void setWidth(double w) { width = w; }virtual void setHeight(double h) { height = h; }
protected:double width, height;
};class Square : public Rectangle {
public:void setWidth(double w) override {width = height = w;}void setHeight(double h) override {width = height = h;}
};void test(Rectangle* r) {r->setWidth(5);r->setHeight(10);std::cout << "Expected area: 50, Actual area: " << r->getWidth() * r->getHeight() << std::endl;
}// 正确示例:符合里氏替换原则
// 应该重新设计Square类,使其不违背LSP

4. 接口隔离原则 (ISP)

定义: 客户端不应该被迫依赖于它们不使用的接口。

解释: 这意味着我们不应该将多个无关的功能打包到一个接口中,而是应该将它们拆分为多个小的、专注的接口。这样可以避免客户端被迫实现不必要的方法。

示例:

// 错误示例:违反了接口隔离原则
class MultiFunctionPrinter : public IPrinter, IScanner, IFax {// 实现所有功能
};// 正确示例:符合接口隔离原则
class IPrinter {
public:virtual void print() = 0;
};class IScanner {
public:virtual void scan() = 0;
};class IFax {
public:virtual void fax() = 0;
};class SimplePrinter : public IPrinter {
public:void print() override {// 打印逻辑}
};class AdvancedPrinter : public IPrinter, IScanner, IFax {
public:void print() override {// 打印逻辑}void scan() override {// 扫描逻辑}void fax() override {// 传真逻辑}
};

5. 依赖反转原则 (DIP)

定义: 高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

解释: 这意味着我们应该尽量避免直接依赖具体的实现类,而是通过接口或抽象类来建立依赖关系。这样可以提高代码的灵活性和可测试性。

示例:

// 错误示例:违反了依赖反转原则
class Database {
public:void connect() {// 数据库连接逻辑}
};class UserService {
private:Database db;public:void addUser() {db.connect();// 添加用户逻辑}
};// 正确示例:符合依赖反转原则
class IDatabase {
public:virtual void connect() = 0;
};class Database : public IDatabase {
public:void connect() override {// 数据库连接逻辑}
};class MockDatabase : public IDatabase {
public:void connect() override {// 模拟数据库连接逻辑}
};class UserService {
private:IDatabase* db;public:UserService(IDatabase* db) : db(db) {}void addUser() {db->connect();// 添加用户逻辑}
};

总结

SOLID 原则为面向对象设计提供了重要的指导方针,帮助开发者编写更加灵活、可维护和可扩展的代码。通过遵循这些原则,我们可以避免常见的设计问题,并使代码更容易理解和修改。

希望这篇文章能够帮助你更好地理解 SOLID 原则,并在实际项目中应用这些原则来提升代码质量。

如果你有任何问题或需要进一步的帮助,请随时留言讨论!

相关文章:

面向对象设计原则 - SOLID原则 (基于C++)

SOLID 是面向对象编程中的一组五个设计原则&#xff0c;这些原则旨在帮助开发者创建更灵活、可维护和可扩展的软件系统。它们最初由 Robert C. Martin 提出&#xff0c;并在 2000 年左右被广泛接受。每个字母代表一个不同的原则&#xff1a; 单一职责原则 (Single Responsibil…...

ChatGPT 搜索测试整合记忆功能

据 TestingCatalog 报道&#xff0c;OpenAI 正在测试 ChatGPT 搜索的整合记忆功能&#xff0c;被命名为 “Memory in search”2。以下是关于该功能的具体情况123&#xff1a; 功能特点 个性化搜索&#xff1a;启用该功能后&#xff0c;ChatGPT 能利用存储的记忆数据&#xff0…...

PWM频率测量方法

测量PWM&#xff08;脉宽调制&#xff09;信号的频率是嵌入式系统中的常见需求&#xff0c;尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法&#xff1a;测频法与测周法。 1、测频&#xff08;率&#xff09;法 原理&#xff1a;在闸门…...

【B站保姆级视频教程:Jetson配置YOLOv11环境(一)镜像下载与烧录】

b站同步视频教程&#xff1a;https://www.bilibili.com/video/BV11r6oYkEFb/ 一、引言 在人工智能与计算机视觉快速发展的当下&#xff0c;Jetson系列开发板凭借强大的性能&#xff0c;成为众多开发者进行深度学习项目的热门选择。YOLOv11作为目标检测领域的先进算法&#xf…...

使用QSqlQueryModel创建交替背景色的表格模型

class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role Qt.BackgroundRole…...

计算机网络__基础知识问答

Question: 1&#xff09;在计算机网络的5层结构中&#xff0c;每一层的功能大概是什么&#xff1f; 2&#xff09;交换机的功能&#xff1f;https://www.bilibili.com/video/BV1na4y1L7Ev 3&#xff09;路由器的功能&#xff1f;https://www.bilibili.com/video/BV1hv411k7n…...

C语言数组详解:从基础到进阶的全面解析

在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中&#xff0c;数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…...

微前端架构在前端开发中的实践与挑战

随着单页面应用&#xff08;SPA&#xff09;和前端框架如 React、Vue、Angular 的快速发展&#xff0c;现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时&#xff0c;单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战&#xff0c;微前端架构…...

国内flutter环境部署(记录篇)

设置系统环境变量 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn使用以下命令下载flutter镜像 git clone -b stable https://mirror.ghproxy.com/https://github.com/<github仓库地址>#例如flutter仓…...

Julia DataFrames.jl:深入理解和使用

随着数据科学和机器学习的发展&#xff0c;数据框架广泛应用于数据处理与分析工作中。在 Julia 语言中&#xff0c;DataFrames.jl 是一个强大且灵活的数据框库&#xff0c;为数据操作提供了丰富的功能。本文旨在系统地介绍 DataFrames.jl 的基础概念、使用方法、常见实践和最佳…...

上位机知识篇---DDSSDK

文章目录 前言第一部分&#xff1a;DDS核心特性1.以数据为中心2.发布-订阅模型3.质量服务4.多语言支持 关键概念1.主题2.发布者3.订阅者4. 数据写入者5.数据读取者6.域参与者7.域 DDS的优势1.可伸缩性2.实时性3.可靠性4.容错性 DDS的应用场景1.军事通信系统2.航空航天3.工业自动…...

基于DeepSeek在藏语学习推广和藏语信息化方面可以做哪些工作?

基于DeepSeek对藏语的技术优势&#xff0c;您可在以下三大方向开展创新性工作&#xff0c;以下是20具体落地方案&#xff1a; 一、藏语智能教育工具开发 《三十颂》AI语法教练 开发虚拟助教自动解析藏文句子结构&#xff08;标注格助词/时态变化&#xff09;错误检测系统&…...

如何把obsidian的md文档导出成图片,并加上文档属性

上篇关于这个插件PKMer_Obsidian 插件&#xff1a;Export Image plugin 一键将笔记转换为图片分享的文章 如何把obsidian的md文档导出成图片&#xff0c;并加上水印-CSDN博客 如何导出图片的时候让文档属性也显示出来&#xff0c;啊啊&#xff0c;这个功能找了一晚上&#xf…...

AUTOSAR从入门到精通-车身控制系统BCM(三)

目录 前言 算法原理 什么是车身控制模块BCM 1. BCM ECU的工作原理 a. 硬件架构 b. 控制逻辑 BCM带来的好处 车身控制模块(BCM)的功用 车身控制模块(BCM)能够控制的车身功能系统 BCM的各项功能 1.1内外部灯光控制 1.2 雨刮系统 1.3 车身防盗报警系统 1.4 车锁…...

删除全表数据sql

-- 删除 employees 表中的所有数据 DELETE FROM employees;-- 清空 employees 表中的所有数据 TRUNCATE TABLE employees;TRUNCATE 操作不记录每一行的删除操作&#xff0c;而是直接释放数据页&#xff0c;所以执行速度通常比 DELETE 快。不过它不能和 WHERE 子句一起使用&…...

Winform如何取消叉号,减号和放大(两种)

方法一: 找到窗体属性 MaximizeBoxFalse; MinimizeBoxFalse; ControlBoxFALSE; 方法二: 点击Form 在From里面找到Form-Closing 这个事件 写入 if(e.CloseReasonCloseReason.UserClosing) { MessageBox.Show("对不起,你不能关闭") e.Cancel true; }...

Couchbase UI: Query

Couchbase 的 Query 页面在 UI 中是一个核心功能模块&#xff0c;支持 N1QL 查询的编写、调试和优化。同时&#xff0c;它也扩展了与查询相关的功能&#xff0c;比如 Workbench、Monitor 和 UDF 管理。这些功能让开发者和管理员能够更加高效地管理数据查询和性能优化。 以下是…...

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…...

Go优雅实现redis分布式锁

前言 系统为了保证高可用&#xff0c;通常会部署多实例&#xff0c;并且会存在同时对共享资源并发读写&#xff0c;这时候为了保证读写的安全&#xff0c;常规手段是会引入分布式锁&#xff0c;本文将介绍如何使用redis设计一个优雅的Go分布式锁。 设计 redis分布式锁是借助…...

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…...

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …...

自动化运维在云环境中的完整实践指南

随着云计算的普及,越来越多的企业将业务迁移到云上。云环境的高动态性和复杂性使得传统的手动运维方式难以应对,自动化运维成为提升效率、降低成本、保障系统稳定性的关键。本文将详细介绍如何在云环境中实施自动化运维,涵盖工具选择、实施步骤和最佳实践。 © ivwdcwso…...

electron typescript运行并设置eslint检测

目录 一、初始化package.json 二、安装依赖 三、项目结构 四、配置启动项 五、补充&#xff1a;ts转js别名问题 一、初始化package.json 我的&#xff1a;这里的"main"没太大影响&#xff0c;看后面的步骤。 {"name": "xloda-cloud-ui-pc"…...

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法&#xff0c;利用光流信息和相邻帧的信息来恢复纹理和对象&#xff0c;同时通过视觉Transformer完成被遮挡区域的修复。然而&#xff0c;这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…...

《Operating System Concepts》阅读笔记:p1-p1

《Operating System Concepts》学习第 1 天&#xff0c;p1-p1 总结&#xff0c;总计 1 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;1) 1.intermediary (1)intermediary: inter-(“between, among”) medius(“middle”) c.intermediary originally referred …...

9.8 实战:使用 GPT Builder 开发定制化 ChatGPT 应用

实战:使用 GPT Builder 开发定制化 ChatGPT 应用 引言:打造属于你的智能助手 定制化 ChatGPT 应用正在成为解决具体问题和提升生产力的关键工具。GPT Builder 提供了一个灵活、直观的平台,让开发者和非技术用户都能快速创建满足特定需求的智能助手。本文将通过一个实战案例…...

团体程序设计天梯赛-练习集——L1-024 后天

前言 首先祝大家新年快乐&#xff0c;然后博主今点炮让炮崩了一下&#xff0c;水一天 这道题5分非常简单&#xff0c;有不少的做法 L1-024 后天 如果今天是星期三&#xff0c;后天就是星期五&#xff1b;如果今天是星期六&#xff0c;后天就是星期一。我们用数字1到7对应星期…...

基于STM32的智能语音控制灯光系统设计

目录 引言系统设计 硬件设计软件设计 系统功能模块 语音识别模块灯光控制模块模式切换与场景管理模块用户交互与显示模块远程控制与数据上传模块 控制算法 语音识别与命令解析算法灯光强度与颜色调节算法数据记录与远程反馈算法 代码实现 语音识别与灯光控制代码场景模式与定时…...

Redis部署方式全解析:优缺点大对比

Redis部署方式全解析&#xff1a;优缺点大对比 一、引言 Redis作为一款高性能的内存数据库&#xff0c;在分布式系统、缓存、消息队列等众多场景中都有着广泛的应用。选择合适的Redis部署方式&#xff0c;对于系统的性能、可用性、可扩展性以及成本等方面都有着至关重要的影响…...

Java实现FIFO缓存策略实战

实现FIFO模型选择FIFO模型实现过程FIFO模型完整代码下面看一下先进先出的示例过程总结FIFO(First In First Out,先进先出)策略是一种基本的数据处理和存储管理方法,在Java中,这种策略通常用于管理那些需要按照顺序处理的数据项,比如任务的队列、数据的传输缓冲区等。在Ja…...

把markdown转换为pdf的方法

将 Markdown 文件转换为 PDF 有多种方法&#xff0c;以下是几种常见的方式&#xff1a; 1. 使用 VS Code 和 Markdown 插件 VS Code 是一款流行的代码编辑器&#xff0c;支持通过插件将 Markdown 转换为 PDF。 步骤&#xff1a; 安装 VS Code&#xff1a; 下载地址&#xff…...

Java Web 开发基础介绍

Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化时代&#xff0c;Web 应用无处不在。Java 凭借其强大的功能、良好的跨平台性和丰富的开发框架&#xff0c;成为 Web 开发领域的热门选择之一。Java Web 开发允许开发者构建动态、交互式的 Web 应用程序&#x…...

自定义数据集,使用 PyTorch 框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

在本文中&#xff0c;我们将展示如何使用 NumPy 创建自定义数据集&#xff0c;利用 PyTorch 实现一个简单的逻辑回归模型&#xff0c;并在训练完成后保存该模型&#xff0c;最后加载模型并用它进行预测。 1. 创建自定义数据集 首先&#xff0c;我们使用 NumPy 创建一个简单的…...

LangChain概述

文章目录 为什么需要LangChainLLM应用开发的最后1公里LangChain的2个关键词LangChain的3个场景LangChain的6大模块 为什么需要LangChain 首先想象一个开发者在构建一个LLM应用时的常见场景。当你开始构建一个新项目时&#xff0c;你可能会遇到许多API接口、数据格式和工具。对于…...

Ubuntu 16.04安装Lua

个人博客地址&#xff1a;Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua&#xff1a; curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz cd lua-5.3.3 make linux test 安装make 编译过程如果提示以下信息…...

独立开发者产品日刊:将 Figma 设计转化为全栈应用、对话 PDF生成思维导图、视频转 AI 笔记、AI问答引擎、Mac 应用启动器切换器

独立开发者产品日刊&#xff0c;每日汇集 ProductHunt 热榜产品介绍&#xff0c;用一个 Slogan 帮你概括产品内容&#xff0c;期望能够让你快速浏览get最新产品创意&#xff0c;激发在产品上的灵感。 Lovable Builder.io Slogan&#xff1a;将 Figma 设计转化为全栈应用 类别…...

【算法】经典博弈论问题——威佐夫博弈 python

目录 威佐夫博弈(Wythoff Game)【模板】 威佐夫博弈(Wythoff Game) 有两堆石子&#xff0c;数量任意&#xff0c;可以不同&#xff0c;游戏开始由两个人轮流取石子 游戏规定&#xff0c;每次有两种不同的取法 1)在任意的一堆中取走任意多的石子 2)可以在两堆中同时取走相同数量…...

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…...

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…...

1.23学习记录

web XYNU2024信安杯 哎~想她了 源代码找到提示&#xff0c;访问页面第一层数组绕过&#xff0c;第二层发现ls /可以执行&#xff0c;接着用less代替tac和cat less /fl[a-z]g exp&#xff1a; URL/?fj1[]1&fj2[]2&cmdless /fl[a-z]gmisc [SWPU 2020]套娃 下载附件…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…...

NeetCode刷题第17天(2025.1.27)

文章目录 086 Course Schedule II 课程安排二087 Graph Valid Tree 图有效树088 Number of Connected Components in an Undirected Graph 无向图中的连接组件数量 086 Course Schedule II 课程安排二 您将获得一个数组 prerequisites &#xff0c;其中 prerequisites[i] [a,…...

Seed Edge- AGI(人工智能通用智能)长期研究计划

Seed Edge 是字节跳动豆包大模型团队推出的 AGI&#xff08;人工智能通用智能&#xff09;长期研究计划12。以下是对它的具体介绍1&#xff1a; 名称含义 “Seed” 即豆包大模型团队名称&#xff0c;“Edge” 代表最前沿的 AGI 探索&#xff0c;整体意味着该项目将在 AGI 领域…...

企业知识管理推动企业整体效能提升与创新能力发展的路径探索

内容概要 企业知识管理是指通过对组织内外部知识的识别、获取、整合与应用&#xff0c;提升企业整体运营效能与竞争力的一系列管理活动。其重要性在于&#xff0c;知识作为一种无形资产&#xff0c;能够显著影响企业的决策质量和创新能力。在当今快速发展的市场环境中&#xf…...

【gopher的java学习笔记】一文讲懂controller,service,mapper,entity是什么

刚开始上手Java和Spring时&#xff0c;就被controller&#xff0c;service&#xff0c;mapper&#xff0c;entity这几个词搞懵了&#xff0c;搞不懂这些究竟代表什么&#xff0c;感觉使用golang开发的时候也没太接触过这些名词啊~ 经过两三个月的开发后&#xff0c;逐渐搞懂了这…...

ZZNUOJ(C/C++)基础练习1000——1010(详解版)

目录 1000 &#xff1a; AB Problem C语言版 C版 1001 &#xff1a; 植树问题 C语言版 C版 1002 &#xff1a; 简单多项式求和 C语言版 C版 1003 &#xff1a; 两个整数的四则运算 C语言版 C版 1004 &#xff1a; 三位数的数位分离 C语言版 C版 补充代…...

volatile之四类内存屏障指令 内存屏障 面试重点 底层源码

目录 volatile 两大特性 可见性 有序性 总结 什么是内存屏障 四个 CPU 指令 四大屏障 重排 重排的类型 为什么会有重排&#xff1f; 线程中的重排和可见性问题 如何防止重排引发的问题&#xff1f; 总结 happens-before 和 volatile 变量规则 内存屏障指令 写操作…...

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…...

Lesson 121 The man in a hat

Lesson 121 The man in a hat 词汇 customer n. 顾客&#xff0c;回头客 相关&#xff1a;Customs 注意大写 n. 海关&#xff0c;关税    custom n. 1. 风俗习惯【通常是复数】    例句&#xff1a;这些是中国人的习俗。       These are Chinese customs.    …...

Excel中LOOKUP函数的使用

文章目录 VLOOKUP&#xff08;垂直查找&#xff09;&#xff1a;HLOOKUP&#xff08;水平查找&#xff09;&#xff1a;LOOKUP&#xff08;基础查找&#xff09;&#xff1a;XLOOKUP&#xff08;高级查找&#xff0c;较新版本Excel提供&#xff09;&#xff1a; 在Excel中&…...