C++学习笔记----2、使用C++进行优雅编程(五)----命名
C++编译器对于命名有如下规则:
- 命名中可以有大小写字母、数字、下划线。
- 字母不限于英文字符,可以是任意国家语言的字母,例如日文,阿拉伯文等。
- 不能以数字开头,例如9to5。
- 包含双下划线的被标准库保留不可使用,如my__name。
- 以下划线开头,后线大写字母的被标准库保留不可使用,如_Name。
- 全局命名空间中以下划线开头的为系统保留不可使用,如_name。
除了这些规则之外,既有的名字只是为了帮助你和程序员好好地写出程序需要的各个要素,基于这个目的,程序员去使用非特定的或者不合适的名字就经常令人吃惊了。
1、选一个好名字
对于变量、成员函数、函数、参数、类、命名空间等等的最好的名字就是准确地表明了这些元素的目的。名字也包含了额外的信息,如类型与特定用法。当然了,实践是检验真理的唯一标准,真正的考验是其他程序员是否理解的你的名字想要表达的意思。
对于命名没有放之四海而皆准的规则,也不见得有适合你公司的命名方法。我们不知道什么是最合适的,但我们知道什么是不合适的,下面列出了一些好的命名与不好的命名的一些例子:
| 好的命名 | 不好的命名 |
| sourceName, destinationName 区分出来两个对象 | thing1, thing2 太通用了 |
| m_nameCounter 表达了数据成员的状态 | m_NC 太抽象,太短 |
| calculateMarigoldOffset() 简单、准确 | doAction() 太通用,不明确 |
| m_typeString 一眼就能看明白 | typeSTR256 恐怕只有计算机才认得 |
| g_settings 表达了全局的状态 | m_IHateLarry 不可接受的知情人才听得懂的笑话 |
| errorMessage 描述性的名字 | string 非描述性的名字,系统保留字 |
| sourceFile, destinationFile 没有简写 | srcFile, dstFile 简写 |
2、命名规范
选择一个名字并不总是需要考虑半天或者需要什么创造性。很多情况下,你可能想用一些命名技巧。以下是一些数据类型可以使用的标准名字。
2.1计数器
在编程的早期阶段,大家基本都在用 i 做计数器的变量名字,约定俗成地 i 与 j 就成为了外部计数器与内部计数器。当然了,在使用时,不要将两者弄混了。在二维矩阵中,用 row 与 column当作索引要比 i 与 j 要易于使用。有些程序员使用outerLoopIndex与innerLoopIndex做计数器,甚至有些程序员一看到 i 和 j 做循环计数器就皱眉头,不过,这只是仁者见仁,智者见智的观点,都可以,至少可以获得业界的认可。
2.2前缀
许多程序员习惯于将变量以字符开头,该字符提供了一些关于变量类型与用途的信息。另一方面,更多的程序员不认可这种前缀,因为这可能会使代码在将来不好维护。举个例子,如果一个成员变量从static变成了non-static,你就不得不对这个变量进行重命名,否则的话,变量表面上要表达的意思与实际的意思就不一致了,尤其是这种相反的变量与实际含义的可读性极差,根本无法维护。甚至比没有含义带来的恶果还要糟糕。
但是,我们别无选择,应该遵从公司的命名指导或者说编码规范的命名规范,下表就是可能的一些前缀:
| 前缀 | 举例 | 文本前缀意思 | 用法 |
| m m_ | mData m_data | "member" | 类中的数据成员 |
| s ms ms_ | sLookupTable msLookupTable ms_lookupTable | "static" | 静态变量或数据变量 |
| k | kMaximumLength | "konstant"(常量的德语) | 常量。有些程序员省略前缀表达常量 |
| b is | bCompleted isCompleted | "Boolean" | 表明一个布尔值 |
2.3匈牙利命名法
匈牙利命名法就是一个亦是与数据成员的命名规范,对于Windows程序员来讲,使用比较普遍。基本意思就是不用单个字母如m做前缀,用更长的前缀表达更多的信息。举例如下:
char* pszName; // psz means "pointer to string, zero-terminated"
匈牙利命名法兴起于它的发明者Charles Simonyi是匈牙利人的事实。有些人说实际上是反映了使用匈牙利命名法的程序看起来像是用外文写的事实。基于后一种原因,有些程序员不喜欢匈牙利命名法。我们还是会用前缀,但不使用匈牙利命名法。除了前缀,要准确地命名变量并不需要额外的附加上下文信息。例如,一个数据变量使用m_name就足够了。好的名字是要达到传达信息的目的,且不能使代码不可读。
2.4 get与set
在大部分类中都会包含数据成员,例如m_status,通常情况下,对这类成员的操作都是通过getStatus()和setStatus()来实现的。而对于布尔型的成员变量的操作就不是使用get而是使用前缀,例如isRunning()。C++语言本身没有对这些函数预先的名字,但是你所在的公司可能想这样或者使用类似的命名格式。
2.5 首字母大写
在代码中有许多不同的方式将名字中的首字母大写。对于大部分元素的编码风格,使用一种标准的方法是很重要的,统一即可,不要在代码中使用不同风格的命名方式。将命名中的所有字母都用小写可能使代码看起来杂乱。可以比较一下如下的命名方式:
priority_queue
PriorityQueue
priorityQueue
这三种方式其实都可以,只是统一就可以了。
2.6 命名空间常量
想像一下,在图形界面下写程序,主菜单中有File,Edit,Help。Help菜单的ID你可能会用Help,在主菜单下的加一个Help的按钮,你还需要一个Help的ID,这时候发现Help已经被使用了。
怎么解决这个问题,这就需要使用namespace命名空间了,Menu::Help与Button::Help就可以完美解决了。当然,你也可以使用前缀的方式,这里就不赘述了。
相关文章:
C++学习笔记----2、使用C++进行优雅编程(五)----命名
C编译器对于命名有如下规则: 命名中可以有大小写字母、数字、下划线。字母不限于英文字符,可以是任意国家语言的字母,例如日文,阿拉伯文等。不能以数字开头,例如9to5。包含双下划线的被标准库保留不可使用,…...
Element UI顶部导航栏与左侧导航栏联动实现~
需求:点击顶部导航栏的不同栏位实现左侧导航栏菜单的不同展示实现联动效果。 点击顶部导航栏按钮将对应的左侧导航栏数据传递给vuex,并在左侧导航栏父组件中接收并传递给左侧导航栏子组件,使用递归组件实现渲染等,具体的优化可以看下面的注释…...
ECMAScript6模板字面量:反引号、${}占位符的使用
ECMAScript 6 中引入了模板字面量,主要通过多行字符串和字符串占位符对字符串进行增强操作。如下: //使用ECMAScript6模板字面量拼接字符串,例如:2024年8月12日 15:38:28 星期一 let dateRet ${Year}年${Month}月${Dates}日 ${H…...
网关与AWS云心跳周期,网关断电或者网络不稳定的离线机制
当mqtt连线建立时, 需要指定keep alive参数,当 iot core在1.5倍 keep alive timeout时长内都没收到任何来自设备端的操作, 例如 ping, subscribe, publish ,则会主动将连线中断。如果iot core检测到tcp 连接中断, 会立即中断;如果未检测到则会等到1.5倍 …...
【代码随想录训练营第42期 Day26打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和
目录 一、贪心 二、题目与题解 题目一:455.分发饼干 题目链接 题解:排序双指针贪心 题目二:376. 摆动序列 题目链接 题解:贪心 题目三:53. 最大子序和 题目链接 题解1:暴力(失败&…...
利用有限元法(FEM)模拟电磁场与样品的相互作用
一、引言 电磁场与物质的相互作用是理解光学现象的基础。在实际应用中,激光光束与样品的相互作用通常涉及复杂的电磁场分布,尤其在微纳尺度结构中。因此,使用数值模拟方法如有限元法(FEM)来模拟电磁场的分布和传播&…...
如何保持git主分支树的整洁
经典应用展示Git版本控制用法 本章将列举Git的一些闪亮特性,期待能够让您爱上Git 文章目录 经典应用展示Git版本控制用法前言一、分支是什么?二、主-分支合并merge三、cherry-pick(精挑细选)四、Rebase(变基)4.1 合并本地分支到主分支4.2 合并本地分支从指定commit开始的…...
Datawhale X 魔搭 AI夏令营 Task1 从零入门AI生图原理实践笔记
赛题内容 参赛者需在可图Kolors模型的基础上训练LoRA模型,生成无限风格,如水墨画风格、水彩风格、赛博朋克风格、日漫风格… 基于LoRA模型生成8张图片组成连贯故事,故事内容可自定义;基于8图故事,评估LoRA风格的美感度…...
Python中将代码打包成exe文件
在Python中将代码打包成exe文件,可以使用PyInstaller工具。以下是使用PyInstaller将Python脚本打包成exe的步骤: 安装PyInstaller: pip install pyinstaller使用PyInstaller打包Python脚本: pyinstaller --onefile your_script…...
【C++ 面试 - 基础题】每日 3 题(十三)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
Android中的Binder
binder是Android平台的一种跨进程通信(IPC)机制,从应用层角度来说,binder是客户端和服务端进行通信的媒介。 ipc原理 ipc通信指的是两个进程之间交换数据,如图中的client进程和server进程。 Android为每个进程提供了…...
记录一次.gitignore 失效问题
前言 今天使用git同步同事的代码时,出现一个问题,.gitignore限制失效,导致我本地生成的临时缓存文件被跟踪到了commit中,执行 git rm --cache .后再add commit也不行,很奇怪就研究了一下,下面将我的解决方…...
Eclipse 工作空间
Eclipse 工作空间 Eclipse 工作空间(Workspace)是 Eclipse IDE 中一个核心概念,它指的是一个用于组织和存储开发项目及相关文件的目录。在 Eclipse 中,所有开发活动都是围绕工作空间展开的。本文将详细介绍 Eclipse 工作空间的概…...
[240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能
目录 📃Changelog✨ gtb✨ cd✨ chat✨ hashdir 📃Changelog ✨ gtb 调整了 fzf 预览窗口中书籍文本的显示效果,通过识别文本中的特殊字符、日期、章节标题等信息,为其赋予不同的颜色。 ✨ cd cd 模块新增功能:在找…...
Flutter中的异步编程
目录 前言 1. Future 和 async/await 1.Future 1.什么是Future? 2.Flutter的三种状态 1.未完成(Uncompleted) 1.定义 2.处理未完成的Future 2.已完成(Completed with a value) 1.概念 2.处理已完成的Future 3.使用async/await 4.Fu…...
vue3 路由带传参跳转;刷新后消失。一次性参数使用。
解决vue3 怎么做到路由跳转传参刷新后消失 解决路由跳转传参去除问题 想要跳转后根据参数显示对应的tab,但url传参刷新会持续保留无法重置。 router.replace替换又会导致显示内容为router.replace后的,传参目的丢失。 业务逻辑: 完成对应操作…...
Unity新输入系统结构概览
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 在学习新输入系统之前,我们需要对其构成有个印象 1.输入动作(Inputaction) 是定义输…...
18104 练习使用多case解题
### 伪代码 1. 读取第1批测试数据的CASE数量。 2. 处理第1批测试数据,计算每个CASE的最小公倍数并输出。 3. 输出“group 1 done”。 4. 处理第2批测试数据,直到遇到两个0,计算每个CASE的最小公倍数并输出。 5. 输出“group 2 done”。 6. 处…...
【AI人工智能】文心智能体 - 你的专属车牌设计师
引言 自AI盛行以来,不断有各种各样的人工智能产品崭露头角。我们逐步跟着不断产生的人工智能来使自己的工作和生活变得更加智能化!那么我们是否能够创造一款专属于自己的人工智能产品呢? 文心智能体平台就给我们提供了这样的机会,…...
Linux-服务器硬件及RAID配置实验
系列文章目录 提示:仅用于个人学习,进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 8.Linu…...
深入剖析mini-swe-agent:100行核心代码如何实现高效编程助手
1. 初识mini-swe-agent:极简主义的力量 第一次看到mini-swe-agent的GitHub仓库时,我完全被它的极简设计震撼了。作为一个常年与复杂代码库打交道的开发者,很难想象一个能解决真实编程问题的AI助手,核心逻辑竟然只有100行Python代码…...
# 005、通信栈深度解析:COM、PDU Router与网络管理
从一次诡异的网络丢包说起 上个月在客户现场蹲到凌晨三点,问题现象是ECU在总线唤醒后前两帧数据总是丢。示波器抓波形完全正常,Trace看PDU也的确发到了总线上,可对端节点就是收不到。熬到后半夜,盯着AUTOSAR配置工具里那几十个PDU路由表,突然意识到问题出在PDU Router的时…...
Agent时代:模型是 Agent,代码是 Harness
第13篇 | Agent 时代:模型是 Agent,代码是 Harness 本系列完。 前12篇我们一直在拆解技术:循环怎么转、工具怎么接、上下文怎么管、团队怎么协作。这一篇往后退一步,聊聊技术之外的事。 Agent 不是一个遥远的概念。Claude Code…...
30分钟搭建个人AI助手:OpenClaw+千问3.5-35B-A3B-FP8极速体验
30分钟搭建个人AI助手:OpenClaw千问3.5-35B-A3B-FP8极速体验 1. 为什么选择这个组合? 上周六下午,我盯着电脑里散落的会议纪要、待办事项和未整理的截图发愁时,突然意识到:与其手动处理这些琐事,不如让AI…...
QQ 第三方登录(Django)
QQ 第三方登录(Django) 本篇教程完全面向 Django 开发者,从 QQ 互联原理、三端交互流程,到完整代码实现,一步到位,新手可直接复制粘贴跟着操作,避开所有常见踩坑点,兼顾教学和实战需…...
OpenClaw+千问3.5-9B数据清洗:Excel表格异常值检测与修复
OpenClaw千问3.5-9B数据清洗:Excel表格异常值检测与修复 1. 为什么需要AI辅助数据清洗? 上周处理一份客户调研数据时,我遇到了典型的数据清洗难题——表格里混杂着空值、格式混乱的日期、重复记录和错误拼写。手动处理不仅耗时,…...
[具身智能-230]:大模型编程的一个最佳实践:先通过自然语言让大模型编写Python语言代码,功能和性能调通后,再让大模型把python程序转换成C++或其他语言的程序
这种“Python 原型验证 C 性能落地”的开发模式,完美契合了大模型(LLM)的能力特点以及现代软件工程的需求。结合最新的行业实践和技术原理,我为你深度解析为什么这种工作流如此有效,以及在实际操作中需要注意的关键点…...
AI率超80%不要慌,这样处理比自己改快10倍
看到AI率80%,第一反应是慌乱,这完全正常。但慌乱之后,做什么决定很关键。 这篇文章只说一件事:为什么用工具处理比自己改快10倍,怎么用工具最快解决这个问题。 手动改写的真实速度 先来做一个计算。 一个写作速度正…...
Node.js——dns模块
dns模块1、resolve方法将域名解析为DNS记录2、lookup方法查询IP地址3、reverse方法反向解析IP地址4、dns模块中的各种错误代码在网络编程中,开发者更倾向于使用域名,而不是IP地址来指定网络连接的目标地址。在Node.js中,提供dns模块ÿ…...
轨道角动量OAM超表面与自旋-轨道角动量耦合结构设计的FDTD仿真案例
轨道角动量 OAM 超表面 自旋-轨道角动量耦合结构设计 fdtd仿真 复现2017 OE:Spin-to-orbital angular momentum conversion in dieletric metasurface 介绍:自旋-轨道角动量转换超表面,入射自旋角动量光束,即左右旋圆偏振光时&…...
