编程命名中的7+1个提示

编程命名中的7+1个提示

前几天Neo写过《编程中的命名设计那点事》,这里也有另外一篇和程序命名的文章,可以从另一个角度看看。

1.- 变量应该是尽可能的望文知意。千万不要使用教材中的命名方式。

  • 好的变量 daysDateRange, flightNumber, carColor.
  • 坏的变量: days, dRange, temp, data, aux…

在我们的日常工作中,有很大数量的开发人员喜欢使用短的变量名,而不是有含义的变量名。这主要是因为我们大学教科书的那些示例所造成的,人都是先入为主,所以,教科书中的那些很抽象,带着演示的变量命名影响了我们一代又一代的程序员,并影响了他们很多年。虽然那些短的,教材式的变量名,可能会让你少打一些字,但其实,这是非常非常不好的。因为软件的维护成本远远大于了软件的开发成本,如果你不取一个好的一点的变量名,那么当进行代码评审时,当进行bug fixing时,当进行代码重构时,当进行代码维护时,你的某个变量名可能会让你一头雾水,不知道所措,还可以会让你走入陷阱,造成更大的时间成本。所以,一个可阅读的代码必然和那些不错的变量名分不开,而这也能让你的软件间接上有更好的质量。

2.- 变量名不要太长,尽可能地简短

只有简单和简短的变量名才是容易阅读的。因为你的变量名一定会用于程序语句中,所以,为了让你的程序语句看起来的简短,你的变量名也应该短一点,不然写出来的一个表达式就会显得很复杂。

当然,在有些时候,一个有含义的变量名和一个简短的变量名可能存在一些冲突。这相当锻炼我们的语言能力——如果有最精炼的词语来表达最丰富的含义。如果实在做不到,那么,取一个有含义的变量名要比取一个简短的变量名更好一些。不管怎么样,我们希望即简短又有丰富的含义,但如果不能两全,那有含义优先级更高一些。

  • 坏的变量:howLonDoesItTakeToOpenTheDoor, howBigIsTheMaterial…
  • 好的变量:timeToOpenTheDoor, MaterialSize.

3.- 可以使用缩写,但需要有一些注释

有一些时候,我们需要使用一些缩写来命名变量,比如:用usr来表示user,用gp来表示group,用conf来表示configuration,用cwd来表示current working directory,用ptr来代码point to reference,等等,等等。缩写一般要用在大家可以看得懂的,而不是为了缩写而缩短一个单词,当然,如果你把缩写后的变量名加上注释,那就更加稳妥了。关于一些约定俗成的缩写,可参看本文的附录一

4.- 使用合适的匈牙利命名规则

这里有一篇非常不错的英文文章告诉你 《什么是合适的匈牙利命名 》,这篇文章同时还告诉你如何去用他。基本上来说,匈牙利命名法主要是为变量加上某种前缀以标识这个变量的类型,或是一种方法的功能。其基本原则是:变量名=属性+类型+对象描述。

比如:在描述类型方面:指针p,函数fn,长整型 l,布尔b,浮点型(有时也指文件)f,双字 dw,字符串 sz,短整型 n,双精度浮点 d,无符号 u……等等。关于更多的命名规范,请参见附录二

注意,匈牙利命名也是有不好的地方的,比如你要把一个整形改成一个浮点型,你除了要改变这个变量的类型,你还要改变这个变量的名字。这是相当麻烦的。而且,在某些时候,这种前缀式的命名可以反而让你不知所措。另外,在C++中,有了类以后,这种命名方法就显得不容易去实施了。所以,合适地使用匈牙利命名方式背后的思想是很关键的。

5.- 不要使用反逻辑来命名

  • 好的命名:  IsEnabled.
  • 坏的命名: IsNotEnabled.

在阅读的时候,我们更喜欢正向的逻辑,而不是反向逻辑。这一规则不单单的命名,在条件语句中,我们也是要尽量不要使用这种反面的逻辑。如:if (! (isAdmin || isUser)),这样的语句很不符合人读代码的习惯,写成这样会更好一些——if (!isAdmin && !isUser)。

6.- 保持一致性

保持所有代码的一致性。使用相同的命名规则。这外世界上没有最好的命名规范。但有一点是可以确认的,那就是在一个代码库中,应该使用一致的命名规则,即使这个规则不那么好,但整个团队使用一致的就是好的。

7.- 附和应用程序的领域术语

在不同的领域中,不同的观念会有非常特别和不同的意思。例如:单词“order”并不总是意味着“次顺”,有些时候,其意味着“订单”,有些时候,意味着“命令”,有些时候,意为着“规则”。所以,在某个领域中,某些单词会有不同的含义,所以,这需要我们的命令去附和这些领域。

黄金法则- 花一些时间去思考去权衡一下你的变量名

当你设计好一个的变量名一个函数名的时候,别着急去使用他,停下来,想一想,这个变量名是否合适,是否还有更好的?也许你正在使用的是一个很不好的变量名。有些时候,需要我们权衡利弊一下,可能还要去和同事讨论一下。

总之,变量名是编程的第一步,第一步走好了,后面才走得好。试想,无论是你或你的同事在使用一些好的变量名编程是一件多么轻松的事啊。

附录:部分的缩写规范

完整单词 缩写
A  
average avg
B  
back bk
background bg
break brk
buffer buf
C  
color cr,clr
control ctrl
D  
data dat
delete del
document doc
E  
edit edt
error err
escape esc
F  
flag flg
form frm
G  
grid grd
I  
increment inc
information info
initial init
insert ins
image img
L  
lable lab
length len
list lst
library lib
M  
manager mgr,mngr
message msg
O  
Oracle Ora
P  
panorama pano
password pwd
picture pic
point pt
position pos
print prn
program prg
S  
server srv
source src
statistic stat
string str
Sybase Syb
T  
temp tmp
text txt
U  
user usr
W  
window win,wnd

附录二、匈牙利命名法

  a       Array                       数组
  b       BOOL (int)                  布尔(整数)
  by      Unsigned Char (Byte)        无符号字符(字节)
  c       Char                        字符(字节)
  cb      Count of bytes              字节数
  cr      Color reference value       颜色(参考)值
  cx      Count of x (Short)          x的集合(短整数)
  dw      DWORD   (unsigned long)     双字(无符号长整数)
  f       Flags                       标志(一般是有多位的数值)
  fn      Function                    函数
  g_      global                      全局的
  h       Handle                      句柄
  i       Integer                     整数
  l       Long                        长整数
  lp      Long pointer                长指针
  m_      Data member of a class      一个类的数据成员
  n       Short int                   短整数
  p       Pointer                     指针
  s       String                      字符串
  sz      Zero terminated String      以0结尾的字符串
  tm      Text metric                 文本规则
  u       Unsigned int                无符号整数
  ul      Unsigned long (ULONG)       无符号长整数
  w       WORD (unsigned short)       无符号短整数
  x,y     x, y coordinates (short)    坐标值/短整数
  v       void                        空

有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。

前缀       类型        例子
g_      全局变量       g_Servers
C       类或者结构体   CDocument,CPrintInfo
m_      成员变量       m_pDoc,m_nCustomers

VC常用前缀列表:

前缀   类型   描述                      例子
ch     char    8位字符                   chGrade
ch     TCHAR   16位UNICODE类型字符       chName
b      BOOL    布尔变量                  bEnabled
n      int     整型                      nLength
n      UINT    无符号整型                nLength
w      WORD    16位无符号整型            wPos
l      LONG    32位有符号整型            lOffset
dw     DWORD   32位无符号整型            dwRange
p      *       内存模块指针,指针变量   pDoc
lp     FAR*    长指针                    lpDoc
lpsz   LPSTR   32位字符串指针           lpszName
lpsz   LPCSTR  32位常量字符串指针       lpszName
lpsz   LPCTSTR 32位UNICODE类型常量指针  lpszName
h      handle  Windows对象句柄           hWnd
lpfn   (*fn)() 回调函数指针              lpfnAbort

Windows对象名称缩写:

Windows对象 例子变量  MFC类       例子对象
HWND        hWnd;      CWnd*       pWnd;
HDLG        hDlg;      CDialog*    pDlg;
HDC         hDC;       CDC*        pDC;
HGDIOBJ     hGdiObj;   CGdiObject* pGdiObj;
HPEN        hPen;      CPen*       pPen;
HBRUSH      hBrush;    CBrush*     pBrush;
HFONT       hFont;     CFont*      pFont;
HBITMAP     hBitmap;   CBitmap*    pBitmap;
HPALETTE    hPalette;  CPalette*   pPalette;
HRGN        hRgn;      CRgn*       pRgn;
HMENU       hMenu;     CMenu*      pMenu;
HWND        hCtl;      CStatic*    pStatic;
HWND        hCtl;      CButton*    pBtn;
HWND        hCtl;      CEdit*      pEdit;
HWND        hCtl;      CListBox*   pListBox;
HWND        hCtl;      CComboBox*  pComboBox;

(全文完)
时间: 2024-10-11 18:30:53

编程命名中的7+1个提示的相关文章

编程风格——整洁代码的4个提示

整洁代码的4个提示 虽然这样的文章非常的多,并且,就算是对于编程新手来说,也是非常的简单和显而见,但是,在我们进行Code Review过程中,我们还是能够看到那些非常混乱的代码,所以,有些时候,你会在想,是不是这样的规则太多了,导致我们的程序员记不住.虽然我们在以前的文章中一遍又一遍的说过(比如:<优质代码的十诫>),千言万语总结一下,无论你用什么样的语言,最最基本的编程原则就是下面这四条. 1 – 简短的方法 简单才会易读,简单才会容易,简单才能重用,简单才能保证质量.把一件事搞复杂,是一

在编程实践中不可对英文提示视而不见【转】

近日,越来越多的同学调程序中的一个行为引起了我的注意:遇到了问题不看提示,直接蒙头看代码.提示信息不一定准确,但是最重要的参考之一,有的能直接告诉我们问题所在,有的至少能给我们启发.不看的原因据说是看不懂英文提示. 与同学们交流后给我的结论是,看不懂只是因为没有看.英语学了N年,到真正用英语的时候了,先给自己扣个大帽子——英语不好,然后就舒舒服服地对程序中 出现的问题胡猜乱蒙去了.真的舒服吗?学编程序要在用中学,英语的学习也要用中学.现在每天都有去用英语的必要和需要,却不去主动挑战一下那个所谓的

[转]Windows编程命名规则

匈牙利命名法是一种编程时的命名规范.基本原则是:变量名=属性+类型+对象描述.其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分.命名要基于容易记忆容易理解的原则.目前在Windows程序开发和MFC程序开发中常用的命名规则是匈牙利命名法.下面就是HN命名法的一般规则. 属性部分 全局变量 g_ const常量  c_ c++类成员变量 m_ 静态变量 s_ 类型部分 指针 p 函数 fn 无效 v 句柄 h 长整型 l 布尔 b 浮点型(有时也指文件) f 双字 dw 字符串

阿里巴巴Java开发手册上常规的编程命名总结

阿里巴巴Java开发手册上常规的编程命名总结:1.类名必须驼峰.例子:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 2.方法名.参数名.成员变量.局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式.例子:localValue / getHttpMessage() / inputUserId 3.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长.例子:MAX_STOCK_COUNT

JAVA编程思想中总结的与C++的区别

(1) 最大的障碍在于速度:解释过的Java要比C的执行速度慢上约20倍.无论什么都不能阻止Java语言进行编译.写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度.当然,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决的. (2) 和C++一样,Java也提供了两种类型的注释.(3) 所有东西都必须置入一个类.不存在全局函数或者全局数据.如果想获得与全局函数等价的功能,可考虑将static方法和stati

asp网络编程:ASP中实现分页显示的七种武器

在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便.自由.而在Visual InterDev6.0(以下简称VI6.0)中,由于Script Object Model(以下简称SOM).Design-Time Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便. 因为主题方面的原因,关于

03--(二)编程实践中C语言的一些常见细节

编程实践中C语言的一些常见细节(转载) 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见,省略了异常处理.我不希望读者死记硬背这些细节,而是能在自己的平台上进行实验从而获得对应的结果.另外,本文仅仅关注于C,可能会考虑C++的表现,但在C++和C#环境下的编译器所获得的看似C代码而实不同的结果不作为参考.基础的东西比如“函数参数传值”.“转义字符”

Trie(字典树)解析及其在编程竞赛中的典型应用举例

摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用有些? 例题解析 什么是Trie? 术语取自retrieval中(检索,收回,挽回)的trie,读作"try",也叫做前缀树或者字典树,是一种有序的树形数据结构.我们常用字典树来保存字符串集合(但不仅限于字符串),如下图就是一个字典树. 它保存的字符集合是{to,te,tea,ted,te

myeclipse中配置spring xml自动提示

这是一篇分享技巧的文章:myeclipse中配置spring xml自动提示. ① window -> preferences -> MyEclipse -> Files and Editors -> XML -> XML Catalog ② 选择User Specified Entries,点击add按钮弹出一个选框,填入以下三项 i. Location: D:\baiduyun\Spring\spring_doc\soft\spring-framework-2.5.6\d