• 程序命名规则


    标识符主要包括变量名、函数名和宏名。

    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_RELOAD        2
    #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开头,则表明它是指向字符指针的指针。 
     

      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   (usually multiple bit values)   标志(一般是有多位的数值)

      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                                  空



    “匈牙利”法最大的缺点是烦琐,例如 

    int i, j, k; 

    float x, y, z; 

    倘若采用“匈牙利”命名规则,则应当写成 

    int iI, iJ, ik; // 前缀 i表示int类型 

    float fX, fY, fZ; // 前缀 f表示float类型 

    如此烦琐的程序会让绝大多数程序员无法忍受。 

    据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。 
    3.1 共性规则 

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

    l 【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。 

    标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。 

    l 【规则3-1-2】标识符的长度应当符合“min-length && max-information”原则。 

    几十年前老ANSI C规定名字不准超过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】程序中不要出现仅靠大小写区分的相似的标识符。 

    例如: 

    int x, X; // 变量x 与 X 容易混淆 

    void foo(int x); // 函数foo 与FOO容易混淆 

    void FOO(float x); 

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

    l 【规则3-1-6】变量的名字应当使用“名词”或者“形容词+名词”。 

    例如: 

    float value; 

    float oldValue; 

    float newValue; 

    l 【规则3-1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。 

    例如: 

    DrawBox(); // 全局函数 

    box->Draw(); // 类的成员函数 

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

    例如: 

    int minValue; 

    int maxValue; 

    int SetValue(…); 

    int GetValue(…); 

    2 【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。 
    3.2 简单的Windows应用程序命名规则 

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

    l 【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。 

    例如: 

    class Node; // 类名 

    class LeafNode; // 类名 

    void Draw(void); // 函数名 

    void SetValue(int value); // 函数名 

    l 【规则3-2-2】变量和参数用小写字母开头的单词组合而成。 

    例如: 

    BOOL flag; 

    int drawMode; 

    l 【规则3-2-3】常量全用大写的字母,用下划线分割单词。 

    例如: 

    const int MAX = 100; 

    const int MAX_LENGTH = 100; 

    l 【规则3-2-4】静态变量加前缀s_(表示static)。 

    例如: 

    void Init(…) 



    static int s_initValue; // 静态变量 

    … 



    l 【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。 

    例如: 

    int g_howManyPeople; // 全局变量 

    int g_howMuchMoney; // 全局变量 

    l 【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。 

    例如: 

    void Object::SetValue(int width, int height) 



    m_width = width; 

    m_height = height; 



    l 【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。
  • 相关阅读:
    网络并发服务器设计
    linux脚本编程技术
    守护进程学习
    UDP通讯程序设计
    TCP通讯程序设计
    linux中socket的理解
    linux网络协议
    kafka ProducerConfig 配置
    crontab定时执行datax
    crontab
  • 原文地址:https://www.cnblogs.com/youxin/p/2989180.html
Copyright © 2020-2023  润新知