程序命名规则

摘要:
只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。事实上,很多程序设计者在实际命名时会将骆驼命名法和帕斯卡结合使用,例如变量名采用骆驼命名法,而函数采用帕斯卡命名法。另一种流行的命名规则称为下划线命名法。本章所述的命名规则主要基于下划线命名法发展而来。而这多种命名规则也确实各有利弊。据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。
标识符主要包括变量名、函数名和宏名。

1 常见命名规则
比较著名的命名规则首推匈牙利命名法,
这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。
其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;
前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
例如:lpszStr, 表示指向一个以'\0'结尾的字符串(sz)的长指针(lp)变量。
驼(Camel)命名法近年来越来越流行
在许多新的函数库和Java这样的平台下使用得当相多。
骆驼命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。
其中第一个单词首字母小写,余下的单词首字母大写。
例如:printEmployeePaychecks(),函数名中每一个逻辑断点都有一个大写字母来标记。
帕斯卡(Pascal)命名法与骆驼命名法类似。
只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。
例如:DisplayInfo()和UserName都是采用了帕斯卡命名法。
在C#中,以帕斯卡命名法和骆驼命名法居多。
事实上,很多程序设计者在实际命名时会将骆驼命名法和帕斯卡结合使用,
例如变量名采用骆驼命名法,而函数采用帕斯卡命名法。
另一种流行的命名规则称为下划线命名法。
下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX这样的环境,以及GNU代码中使用非常普遍。
本章所述的命名规则主要基于下划线命名法发展而来。
2 函数的命名
函数名使用下划线分割小写字母的方式命名:
设备名_操作名()
操作名一般采用:谓语(此时设备名作为宾语或者标明操作所属的模块)或者
谓语+宾语/表语(此时设备名作为主语或者标明操作所属的模块) 等形式,如:
tic_init()
adc_is_busy()
uart_tx_char()
中断函数的命名直接使用 设备名_isr() 的形式命名,如:
timer2_isr()
3 变量的命名
变量的命名也采用下划线分割小写字母的方式命名。
命名应当准确,不引起歧义,且长度适中。如:
int length;
uint32 test_offset;
单字符的名字也是常用的,如i, j, k等,它们通常可用作函数内的局部变量。
tmp常用做临时变量名。
局部静态变量,应加s_词冠(表示static),如:
static int s_lastw;
全局变量(尤其是供外部访问的全局变量),应加g_词冠(表示global),如:
void (* g_capture_hook)(void);
4 常量及宏的命名
采用下划线分割大写字母的方式命名,一般应以设备名作为前缀,
防止模块间命名的重复。如:
#define TIMER0_MODE_RELOAD2
#define TIMER2_COUNT_RETRIEVE(val)((uint16)(65536 - (val)))
当然,看作接口的宏可以按照函数的命名方法命名,例如:
#define timer2_clear()(TF2 = 0)
#define timer0_is_expired()(TF0)

5 常用缩写词

原词 缩写

addition add
answer ans
array arr
average avg
buffer buf或buff
capture cap或capt
check chk
count cnt
column col
control ctrl
decode dec
define def
delete del
destination dst或dest
display disp
division div
encode enc
environment env
error err
float flt
frequency freq
header hdr
index idx
image img
increment inc
initalize init
iteration itr
length len
memory mem
middle mid
make mk
message msg
multiplication mul
number num
operand opnd
optimization opt
operator optr
packet pkt
positon pos
previous pre或prev
payload type pt
pointer ptr
return code rc
record rcd
receive recv
result res
return ret
source src
stack stk
string str
subtraction sub
table tab
temporary tmp或temp
total tot
time stamp ts
value val

6 结语
没有一种命名规则可以让所有的程序员赞同。而这多种命名规则也确实各有利弊。
没有必要花太多的精力试图发明最好的命名规则,
而是应当制定一种令大多数项目成员满意的命名规则并切实执行。
标识符命名的一致性自然会体现出代码的优雅。
当然,如果你的程序使用了第三方的代码,而这些模块经验证确实是正确无误的。
那么也没有必要一味追求命名的一致性,而去修改这些已经定型的模块中的函数和变量名。
比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。

aArray数组

bBOOL (int)布尔(整数)

byUnsigned Char (Byte)无符号字符(字节)

cChar字符(字节)

cbCount of bytes字节数

crColor reference value颜色(参考)值

cxCount of x (Short)x的集合(短整数)

dwDWORD(unsigned long)双字(无符号长整数)

fFlags(usually multiple bit values)标志(一般是有多位的数值)

fnFunction函数

g_global全局的

hHandle句柄

iInteger整数

lLong长整数

lpLong pointer长指针

m_Data member of a class一个类的数据成员

nShort int短整数

pPointer指针

sString字符串

szZero terminated String以0结尾的字符串

tmText metric文本规则

uUnsigned int无符号整数

ulUnsigned long (ULONG)无符号长整数

wWORD (unsigned short)无符号短整数

x,yx, y coordinates (short)坐标值/短整数

vvoid空


“匈牙利”法最大的缺点是烦琐,例如
inti,j,k;
floatx,y,z;
倘若采用“匈牙利”命名规则,则应当写成
intiI,iJ,ik;//前缀i表示int类型
floatfX,fY,fZ;//前缀f表示float类型
如此烦琐的程序会让绝大多数程序员无法忍受。
据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。
3.1共性规则
本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。
l【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。
标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。
l【规则3-1-2】标识符的长度应当符合“min-length&&max-information”原则。
几十年前老ANSIC规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得!例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。
l【规则3-1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。
l【规则3-1-4】程序中不要出现仅靠大小写区分的相似的标识符。
例如:
intx,X;//变量x与X容易混淆
voidfoo(intx);//函数foo与FOO容易混淆
voidFOO(floatx);
l【规则3-1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
l【规则3-1-6】变量的名字应当使用“名词”或者“形容词+名词”。
例如:
floatvalue;
floatoldValue;
floatnewValue;
l【规则3-1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
例如:
DrawBox();//全局函数
box->Draw();//类的成员函数
l【规则3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
例如:
intminValue;
intmaxValue;
intSetValue(…);
intGetValue(…);
2【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
3.2简单的Windows应用程序命名规则
作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。
l【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。
例如:
classNode;//类名
classLeafNode;//类名
voidDraw(void);//函数名
voidSetValue(intvalue);//函数名
l【规则3-2-2】变量和参数用小写字母开头的单词组合而成。
例如:
BOOLflag;
intdrawMode;
l【规则3-2-3】常量全用大写的字母,用下划线分割单词。
例如:
constintMAX=100;
constintMAX_LENGTH=100;
l【规则3-2-4】静态变量加前缀s_(表示static)。
例如:
voidInit(…)
{
staticints_initValue;//静态变量

}
l【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
例如:
intg_howManyPeople;//全局变量
intg_howMuchMoney;//全局变量
l【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
例如:
voidObject::SetValue(intwidth,intheight)
{
m_width=width;
m_height=height;
}
l【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。

免责声明:文章转载自《程序命名规则》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Sqlserver 使用同义词跨服务器数据库连表查询Python学习日记(十九) 模块导入下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[0] C#软件项目版本号的命名规则及格式介绍

版本控制比较普遍的 3 种命名格式 :  一、GNU 风格的版本号命名格式 :  主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]  英文对照 : Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]  示例 : 1.2.1, 2.0, 5.0....

PCB命名规则-allegro

一、焊盘命名规则 1、 贴片矩形焊盘 命名规则:SMD+长(L)+宽(W)(mil) 举例:SMD90X60 2、 贴片圆焊盘 命名规则:SMDC+焊盘直径(D)(mil) 举例:SMDC50 3、 贴片手指焊盘 命名规则:SMDF+长(L)+宽(W)(mil) 举例:SMDF30X10 4、 通孔圆焊盘 命名规则:PAD+焊盘外径(mil)+C+孔径(m...

软件项目版本号的命名规则及格式介绍

版本控制比较普遍的 3 种命名格式 : 一、GNU 风格的版本号命名格式 : 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] 英文对照 : Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]] 示例 : 1.2.1, 2.0, 5.0.0 bu...

c# AutoMapper踩坑

AutoMapper中的before和ForMember和after的区别 我这里准备了一个测试用例,我们正常实体转dto都是直接试用一些方法 CreateMap<TestEntity, TestDto>(); 但是实际难免需要一些字段类型的改变,这里介绍before和ForMember还有after的区别 一、before的使用 before...

checkstyle配置文件说明

属性说明 basedir代码所在的位置 AbstractClassNameformat: 定义抽象类的命名规则 PackageNameformat: 定义包名的命名规则 TypeNameformat: 定义类和接口的命名规则tokens: 定义规则适用的类型,例如:CLASS_DEF表示类,INTERFACE_DEF 表示接口 ParameterNamef...

命名规则与代码规范

命名规则 标识符 C++的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头,不能以数字开头。 标识符的长度没有限制,但是对大小写字母敏感。 C++为标准库保留了一些名字,不能使用这些保留字作标识符。 用户自定义的标识符最好不要连续出现两个下划线,也不要以下划线紧连大写字母开头。 基本命名规则 文件命名 文件名全部小写,可以含下划线或连字符,按...