C/C++ 名正则言顺
本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50532701
名称所表达的含义极其丰富,你也许并不生活在对它们的恐惧中,不过绝不要低估名称的力量。
名称的重要性无可估量,作为程序员,我们在对各种构造进行命名时,将行使这项重大的权力。一个命名糟糕的实体,不仅很不方便,而且会产生误导,甚至非常危险。
一个对象名应该清晰地描述这个对象。
那么究竟应该如何进行命名呢?为对象命名的方式取决于你所遵循的任何编码标准。不过,虽然标准可能要求适用某种命名约定,但是并不会具体到足以指导如何为程序的每个部分都恰当地命名。
为了恰当地命名,在为每个对象相出名称之前,必须准确了解这个对象是什么!如果你都不知道你所命名对象是什么,它的用途和存在的理由也不清楚,那么你怎么能够赋予它一个有意义的名称呢?那么这样命名得到的实体,绝对是一个命名糟糕的实体。
好的对象名称往往具有以下四个品质:
- 技术上正确
- 符合语言习惯
- 描述性
- 恰当
下面我们逐一进行分析。
技术上正确
现代编程语言对于如何命名都规定了一些准则。以C/C++为例,最基础的四条原则是:
- 变量名只能是字母(
A-Z,a-z)和数字(0-9)或下划线_组成; - 第一个字母必须是字母或者下划线;
- 不能使用C/C++关键字来命名变量,以免冲突;
- 变量名区分大小写。
这里需要补充的是,在前两条原则下,命名对象可以是以下四种组合方式:纯字母(myName),或字母与数字的组合(myName1, m2n),或字母与下划线的组合(_myName, myName_, _myName_, …),或下划线与数字的组合(_1, _1_, …)。
还有一些其他技术限制,例如C/C++标准中预留了一些特定的名称:你不应该使用任何以str作为开头后面跟一个小写字母或者以下划线开头的全局标识符,以及任何名为std的命名空间中的标识符。知道这些限制,对于我们编写鲁棒和正确的代码非常重要。
符合语言习惯
仅仅因为一种语言允许某个特定的字符组合,并不能表示这个组合就是一个好的名称。清晰明了的名称,应该遵循读者所期望的约定,即各种语言习惯。某些语言具有一个公共命名约定,如庞大的Java库建立了一个不能忽视的先前技术(prior art),而C/C++等语言则没有这样一个通用命名约定。
虽然没有通用的命名约定,但是有些被业内广泛接受并认可的规则或约定,例如匈牙利命名法,Google C++编程命名约定,华为 C编程命名约定等,都是值得参考的
描述性
显而易见,名称必须是描述性的。这也是使用名称的原因,即用来描述某个事物。然而我们通常会见到一些令人迷惑的标识符,其含义与其描述的对象并不相符,甚至相悖。
即使是使用准确的名称也会有局限性。虽然说不要望文生义,但人们还是通常坚持他们对于一个概念最初的理解。因此,通过谨慎地命名来表达正确的第一印象非常重要。那么,就有必要从一个外行读者的角度来选择名称,而不是从一个内行的角度来选择。
有时,找到一个恰当的描述非常困难。如果你无法想出合适恰当的名称,那么你也许就要改变你的设计了。这往往是什么地方不对劲的征兆。
恰当
首先,是长度。虽然限制很多编程语言对于标识符的长度已不再有任何明显的限制了,但是这并不代表我们可以为了解释清楚对象的含义,而对其名称长度不加限制,随意设定。而要创建清晰明了,描述性的名称,那么就必须适用自然语言的词语。对于这些词语,程序员们都有一种内在的简写和缩短它们的欲望,但这有时也会造成令人困惑的杂乱名称。因此,过度冗余或缩减都是不可取的,例如适用a来代替apple_count显然不妥,但是使用apple_count_of_my_apple_funtion就显得非常傻。
进行命名时,重点在于清晰而非简洁。
其次,是格调。就像粗鲁的笑话在葬礼上非常不合时宜一样,欠考虑的名称也会破坏代码的职业性。有这么严重吗?是的。无聊的名称会使读者怀疑代码作者的能力。
应该记住,避免使用一些类似blah或wibble不严肃的名称,或者foo和bar等古怪的名称。它们很容易悄悄混入代码,虽然一开始人们会觉得挺有趣,但是以后会造成很多混乱。显而易见的是,职业化就意味着在命名时不要使用语气助词。
始终在第一次就给对象起好名字。
附上一些相关的内容:
- 匈牙利命名法:是一种有争议的命名约定,他将关于变量或函数的类型信息编入它们的名称,认为这样会使代码更易于阅读和维护。这种命名法最初是在20世纪80年代在Microsoft公司中出现,并在该公司的Win32 API和MFC中得到广泛使用,这也是这种命名法流行的主要原因。之所以被称为“匈牙利命名法”,是因为它的创始人是以为匈牙利程序员,Charles Simonyi。此外,变量名看起来好像是使用匈牙利语书写的,也是其得名的原因。
- 大写字母约定:大多是语言禁止我们在标识符中使用空白和标点,所以我们要采用一种约定来连接多个词语。这些大写字母的约定就像没完没了的“编辑器圣战”一样,使许多程序员相互拳脚相加。在现代的代码中你会看到很多常用的方法:
camelCase: 其在Jave语言库以及许多C++代码库中得到广泛应用。这种方法得名于其大写字母的布局很像骆驼的驼峰,并且可能是在20世纪70年代早期在Smalltalk中第一次使用的。ProperCase:这种方法与camelCase很接近,唯一的区别是其第一个字母也是大写的。有时这种方法有时也被成为PascalCase。这两种约定常常一起使用。例如Java语言的类名以ProperCase方式书写,而成员名则以camelCase方式书写。Windows API和.NET使用的是ProperCase。using_underscores:这种风格的支持者是C++标准库(看看所有std命名空间中的名称)和GUN Foundation的实现人员。
此外,还有很多其他形式。
- 良好的结尾:选择后缀是文件命名的一个组成部分,C/C++的编译器对于后缀没有要求,但是将头文件命名为
something.h是一种普遍约定,如果不这么做,就会想在你眼睛里钉钉子一样难受。由于缺乏严格的规定,我们确实感到有些痛苦,对于C++实现的文件名存在一些约定,如常见的后缀.C,.cc,.cpp,.cxx和.c++等。以.hpp为后缀的C++文件虽然不常见,但是也会遇到。你的选择可能取决于编译器,个人偏好或编码标准。关键是保持一致性。选择一种后缀方案,然后坚持使用下去。 - 不应做的:不要创建具有以下特征的名称:
- 含义模糊:方式有千万种,首字母缩略和简写会显得很随意,而单个字母的名称则太神秘。
- 啰嗦:避免使用过于简洁的名称,但是也不有创建像
the_number_of_apples_before_I_start_eating这样的变量,这样既无趣又无聊。 - 不准确或使人误解:显而易见,应该使你的名称准确,另外错误的拼写会开辟出一块困惑的雷区。
- 有歧义或含糊不清:不要使用可以用多种方式解释的名称,例如使用
data或value这种含糊不清的名称,除非它们代表的是什么非常清楚;避免使用temp或tmp等含糊不清的名称,除非你真的必须这么做;不要通过大小写或单个字符来区分名称;不要无故创建其名称与外部范围某个对象相同的局部变量。 - 太做作:有趣的小缩写,很难记住的聪明的简写以及对数字的解释性使用都应该被避免。对于没有经验的人来说,
internationalization的一种常见缩写il8n看起来会显得毫无意义。应该创建清晰,具体,简洁,准确和无歧义的名称,使用公共的术语和参照标准。
C/C++ 名正则言顺的更多相关文章
- Git之(一)Git是什么
为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...
- Verilog语言:还真的是人格分裂的语言
人气腹语术师天愿在现场披露了被人偶搭档夺取灵魂的腹语术师将妻子杀害的表演节目.天愿真的陷入了多重人格,命令自己杀害妻子和子的人偶的人格出现了.为了不(让自己)杀害和弟子登川有外遇的妻子,天愿提出委托想 ...
- Git之(一)Git是什么[转]
为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...
- REST当道,NO MVC
前世今生 B/S开发经历了几个时代,如今已经是后MVC时期了. MVC体现了分层和解耦合的概念.从功能和理念上都做出过巨大贡献,使Java B/S开发在面对大型项目时从容不迫,说成是上个十年Java ...
- JavaScript中登录名的正则表达式及解析(0基础)
简言 在JavaScript中,经常会用到正则表达式来进行模式匹配.例如,登录名验证,密码强度验证,字符串查找或替换等操作.现在就开始吧,零基础写出你的第一个正则表达式! 在做用户注册时,都会用到登录 ...
- PCB SQL SERVER 正则应用实例
我们用过SQL SERVER的都知道,SQL SERVER它本身是不自带正则表达式的,因为没有,所以基本都没用过啊, 但我们在C#中对文本匹配用正则的方式处理非常好用,省得你写一堆代码实现匹配,多简洁 ...
- Spring boot 基于Spring MVC的Web应用和REST服务开发
Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...
- Python基础(11)--面向对象1
面向对象设计与面向对象编程的关系 面向对象设计(OOD)不会特别要求面向对象编程语言.事实上,OOD 可以由纯结构化语言来实现,比如 C,但如果想要构造具备对象性质和特点的数据类型,就需要在程序上作更 ...
- Deformity PHP Webshell、Webshell Hidden Learning
目录 . 引言 . webshell原理介绍 . webshell的常见类型以及变种方法 . webshell的检测原理以及检测工具 . webshell隐藏反检测对抗手段 0. 引言 本文旨在研究W ...
随机推荐
- mysql在windows下主从同步配置
mysql主从同步: 1.为什么要主从同步? 在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一.尤其是在大规模系统中,数据库集群已经成为必备的配置之一.集群的好处主要有:查询负载. ...
- 文件上传前端操作-增加文件与删除文件按钮(jquery实现)
初始 删除与添加 <!DOCTYPE html> <html> <head> <title></title> <meta charse ...
- Android网络编程(十)Retrofit2后篇[注解]
G相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 An ...
- Ruby按照换行符进行分割
Ruby按照换行符进行分割 string.split(/\n/)
- 【Hibernate步步为营】--单向关联一对一映射
上篇文章对多对一的关联映射做了具体的分析,它在实现上能够有两种方式,而且这两种方式实现也非常easy,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系.这样的映 ...
- kentico在使用局域网ip访问的时候提示Missing license或者Invalid website
Missing license Requested URL: http://172.31.212.20/kentico10/ License status: Missing license If yo ...
- Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)
在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...
- 移动端H5页面编辑器开发实战--原理结构篇
很久前的写的文章了,转载下发到这里 原文地址: https://blog.csdn.net/tech_meizu/article/details/52288797
- Core Bluetooth的基本常识
每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的 一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征 特征是与外界交互的最小单位 比如说,一 ...
- flask之jinji2模板介绍
1.1.模板传参 (1)主程序 from flask import Flask,render_template app = Flask(__name__) @app.route('/') def ...