编程语言命名规范

常见命名法

一、匈牙利命名法【Hungarian】

广泛应用于象Microsoft Windows这样的环境中。

Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。

匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。

匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

匈牙利命名法中常用的小写字母的前缀:

前缀     类型
a        数组 (Array)
b        布尔值 (Boolean)
by       字节 (Byte)
c       有符号字符 (Char)
cb      无符号字符 (Char Byte,没有多少人用)
cr       颜色参考值 (ColorRef)
cx,cy     坐标差(长度 ShortInt)
dw      Double Word
fn       函数
h        Handle(句柄)
i        整型
l       长整型 (Long Int)
lp       Long Pointer
m_     类的成员
n      短整型 (Short Int)
np     Near Pointer
p      Pointer
s      字符串型
sz     以null做结尾的字符串型 (String with Zero End)
w    Word

优点:
在C++中经常使用匈牙利命名法,这在早期是可理解的,那时开发环境(IDE)没有语法亮显和自动显示变量定义的功能,所以使用匈牙利命名法就能一眼看出变量是什么类型的。
缺点:
改变类型时,不仅要改变这个变量的类型,而且要改变这个变量在这其他个函数中的名字。

二、骆驼命名法【camelCase】(小驼峰式命名法)

骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。

当变量名或函式名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母。例如:
printEmployeePaychecks();
骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多。
驼峰式命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,而 Larry Wall 等人所著的畅销书《Programming Perl》(O’Reilly 出版)的封面图片正是一匹骆驼。
驼峰式命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。

三、帕斯卡命名法【PascalCase】(大驼峰式命名法)

​ 与骆驼命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写

​ 如:public void DisplayInfo(); string UserName;

​ 二者都是采用了帕斯卡命名法.

【在C#中,以帕斯卡命名法和骆驼命名法居多。在C#中,简单的变量一般用camelCase规则,而比较高级的命名使用PascalCase。 如.net Framework的公共字段及公共属性。】

简单说
MyData是一個帕斯卡命名的示例。 myData是一個骆驼命名法。
iMyData是一個匈牙利命名法,小些说明了变量的类型或者用途。

四、下划线法命

函数名中的每一个单词之间都有一个下划线。例如:
print_employee_paychecks();
下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。

优缺点:
驼峰的问题在于歧义和繁琐。大小写的切换会降低输入速度,比较繁琐,连续的字母在英文中会产生歧义,比较典型的比如to_ld和Told。
全文搜索,驼峰必须忽略大小写。而下划线命名法做全文搜索可以区别大小写。


函数和方法命名规范

2015-11-12 2459

作者:Erica Sadun,原文链接,原文日期:2015-08-31
译者:天才175;校对:numbbbbb;定稿:numbbbbb

请各位随意批判。同时请看这里这里

简单明了。根据上下文给动词和介词加上名词。请使用removeObject(object, atIndex: index),而不是remove(object, at: index)。不要为了过度的简洁而影响清晰准确性。

避免缩写。使用printError(myError)而不是printErr(myErr)以及setBackgroundImage(myImage)而不是setBGImage(myImg)。虽然苹果提供了一系列“可接受”的缩写,但是请不要在 Swift 中使用像 max 和 min 这样的缩写。

避免歧义。考虑一下函数或者方法的命名是否存在多种解释。举个栗子,在displayName中,display 是名词还是动词呢?如果命名不清晰的话,请重新命名来消除混淆。

保持一致性。在你的应用和库中使用相同的术语来描述概念。避免在一个方法里使用fetchBezierElements(),却在另外一个里使用listPathComponents()

不要引用类型关键字。避免命名中出现 struct、enum、class、instance 以及 object。请使用buildDeckofCards()而不是buildDeckofCardsStruct()

方法命名使用小写。虽然大多数开发者使用小写命名全局函数,但你可以大写,这并不是什么罪过。虽然这种函数命名过时了,但大写的函数名却能立刻将函数与方法区别开来。有一段时间我也改变过想法,但是最终还是决定奋起抗争,使用小写。这种做法曾经和命名空间一样普及,但是突然间就销声匿迹了。就像一百万个喊着大写的人突然沉默。

省略”get”。获取状态信息的函数应该描述他们要返回的东西。请使用extendedExecutionIsEnabled()isExtendedExecutionEnabled()而不是getExtendedExecutionIsEnabled()。通过参数返回数据的函数例外。

使用标签描述参数。建议结合函数名和标签来描述函数本身,这样创建出来的会是包括介词(with、of、between 等等)的描述符。你会”construct color with red, green, and blue”(译者注:使用红绿蓝构建颜色),测试”length of string”(译者注:字符串的长度),或者”test equality between x and y”(译者注:判断 x 和 y 是否相等)。

好的函数名和标签可以告诉人们如何使用函数。结果会是自文档化,不用依靠记忆或查找来确定需要传入的参数。请使用withTag:而不是tag:

使用介词,避免”and”And 是 Apple 特别声称要避免的一个词。避免使用”view and position”,使用”view, position”。

如果你必须使用and,请确保一组参数有语义联系,如使用”red, green and blue”构建颜色。哪怕之后调整了关键字,也显然不可能中断这些项的联系。在这种情况下,即使是代码洁癖患者也不会认为你的代码有问题。

Apple 支持使用 and 的一个例子是在一个方法中描述两种截然不同的动作,比如openFile(withApplication:, andDeactivate:)

在基于类型的名字后面加上value 。请使用toIntValue而不是toInt,以及withCGRectValue而不是withCGRect

使用美国标准短语。由于这些词是由 Apple 提供的,请使用 initialize 而不是 initialise 以及 color 而不是 colour。

有疑惑,找 Apple。使用相似的概念搜索 Apple API 接口并模仿其方法签名。尽量参考 Objective-C 命名,因为 Swift 中的 Apple API 并没有全部通过人工审查。自动转换过来的 API 可能并不是一个好例子。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg


如何写出让同事无法维护的代码?

ITPUB技术小栈 2021-09-02 17:59

原文:http://mindprod.com/jgloss/unmain.html

译者:陈皓 (@左耳朵耗子)

对,你没看错,本文就是教你怎么写出让同事无法维护的代码。

一、程序命名

二、伪装欺诈

三、文档和注释

四、程序设计

五、测试

六、其他

总之,我们的口号是—— Write Everywhere, Read Nowher

— END —


常用缩写词

addition            add            加
subtraction            sub            减
multiplication        mul            乘法
division            div            除法
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        显示
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            消息
number                num            数量、编号
operand                opnd        操作数
optimization        opt            最优
operator            optr        操作
packet                pkt            消息包
positon                pos            位置
previous            pre或prev    以前的
pointer                ptr            指针
record                rcd            记录
receive                recv        收到、接收
result                res            结果
return                ret            返回
source                src            源头
stack                stk            栈
string                str            字符串
table                tab            表
temporary            tmp或temp    临时
total                tot            全部的
time stamp            ts            时间戳
value                val            值

常用的反义词组

add / remove       begin / end        create / destroy
insert / delete       first / last         g et / release
increment / decrement                 put / get
add / delete         lock / unlock      open / close
min / max          old / new         start / stop
next / previous      source / target     show / hide
send / receive       source / destination
cut / paste          up / down

常见算法的英文命名(排序、查找)

一、排序算法:

冒泡排序: bubble_sort
选择排序: selection_sort
简单选择排序: simple_selection_sort
插入排序: insertion_sort
直接插入: direct_insertion_sort
折半插入: half_insertion_sort
希尔排序: shell_sort
快速排序: quick_sort
堆排序: heap_sort
归并(合并)排序: merge_sort
交换排序: exchange_sort
基数排序: radix_sort
外部排序: external_sort

二、查找算法:

顺序查找: sequential_search
二分法查找: binary_search
折半查找: half-interval _search     half_search
分块查找: block_search
b树: btree
散列表: hash_table

三、常见的经典问题

汉诺塔:  hanoitower
八皇后:  eightqueens
斐波那契数列:  fibonacci_sequence
马踏棋盘:  horse_chess
贪心(贪婪)算法; greedy_algorithm
百钱买百鸡:
五家共齐:
鸡兔同笼:
猴子吃桃:
舍罕王赏麦:
窃贼问题: thief_problem
寻找假币:
青蛙过河:
三色旗:
渔夫捕鱼:
兔子产仔:
常胜将军:
爱因斯坦的阶梯:
三色球: tricolors
阶乘: factorial

Microsoft公司的"匈牙利"法命名规则

比较著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入前缀以增进人们对程序的理解"。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。
"匈牙利"法最大的缺点是烦琐,例如
int i, j, k;
float x, y, z;
倘若采用"匈牙利"命名规则,则应当写成
int iI, iJ, ik; // 前缀 i表示int类型
float fX, fY, fZ; // 前缀 f表示float类型
如此烦琐的程序会让绝大多数程序员无法忍受。
据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是"成败悠关"的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。

3.1 共性规则
本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。

【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行"解码"。
标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。

【规则3-1-2】标识符的长度应当符合"min-length&& max-information"原则。
几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。

【规则3-1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
例如Windows应用程序的标识符通常采用"大小写"混排的方式,如AddChild。而Unix应用程序的标识符通常采用"小写加下划线"的方式,如add_child。别把这两类风格混在一起用。

【规则3-1-4】程序中不要出现仅靠大小写区分的相似的标识符。
例如:
int x, X;// 变量x 与 X 容易混淆
void foo(int x);// 函数foo 与FOO容易混淆
void FOO(float x);

【规则3-1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。

【规则3-1-6】变量的名字应当使用"名词"或者"形容词+名词"。
例如:
float value;
float oldValue;
float newValue;

【规则3-1-7】全局函数的名字应当使用"动词"或者"动词+名词"(动宾词组)。类的成员函数应当只使用"动词",被省略掉的名词就是对象本身。
例如:
DrawBox();// 全局函数
box->Draw();// 类的成员函数

【规则3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
例如:
intminValue;
intmaxValue;

intSetValue(…);
intGetValue(…);

2【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导

3.2 简单的Windows应用程序命名规则
作者对"匈牙利"命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。

【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。
例如:
class Node;// 类名
class LeafNode;// 类名
void Draw(void);// 函数名
void SetValue(int value);// 函数名

【规则3-2-2】变量和参数用小写字母开头的单词组合而成。
例如:
BOOL flag;
int drawMode;

【规则3-2-3】常量全用大写的字母,用下划线分割单词。
例如:
const int MAX = 100;
const int MAX_LENGTH = 100;

【规则3-2-4】静态变量加前缀s_(表示static)。
例如:
void Init(…)
{
static int s_initValue;// 静态变量

}

【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
例如:
int g_howManyPeople;// 全局变量
int g_howMuchMoney;// 全局变量

【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
例如:
void Object::SetValue(int width, int height)
{
m_width = width;
m_height = height;
}

【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。


Util/Utils 和 Helper 类的区别

我们在代码中常看到Utils、Helper类,在调用第三方api时也常调用到。但是他们有什么区别呢?如果你搜索一下中文社区,一般偏向于区别不大,用哪个都可以。但其实老外还是很讲究的,用英文搜一下能找到答案。比如:
what are the differences between helper and utility classes

A Utility class is understood to only have static methods and be stateless. You would not create an instance of such a class.
A Helper can be a utility class or it can be stateful or require an instance be created.
翻译一下。
Util类,一般是无状态的,只包含静态方法。使用时无需创建类的实例。
Helper类,可以有状态(类的成员变量),一般需要创建实例才能使用。