UNIX 风格的命名习惯

作者: 阙荣文 (querw) / [email protected]

     有一个标准的编程风格非常重要,真的非常重要,千万不要不以为然, 尤其是大团队合作. 同时,遵循统一的命名规则, 程序代码看起来也更漂亮,更容易读懂.

     主要有2种命名规则,一是Windows风格的匈牙利命名法. 我做了好几年的MFC开发. 我感觉匈法挺好的,不像一些人说的那样, 不可否认微软也出好东西. 匈法的优点在于类型,作用域一目了然, 也非常完善,规则覆盖了变量名,函数名,类名,类的数据成员等. 这对于公司内部学习和规范化是非常好的, 有现成的范本可以依照. 另一种就是所谓的 unix风格. 主要是一些经典C程序的惯用规则. 并没有一套非常明确的说法. 所以在网上搜匈法很容易,但是专门说unix风格的就很少, 我认为所谓"unix风格"都是一些被普遍接受的习惯 , 隐藏在大众的各个源代码中,并没有固定的,硬性的规则 (所以,前面我称之为习惯), 小子不自量力, 来尝试总结一下, 欢迎斧正和补充.

习惯1 - 变量名/函数名 以小写的单词用下划线连接 (又被形象的称为驼峰式命名). 比如 用户名  user_name , 总数  total_count. 单词选择首先要贴切,其次才考虑长短. 可以视情况采用缩写,但是不应过度缩写. 比如习惯上常用的 min, max 等都是非常好的缩写 (类似的还有 sum, num, str...) 总而言之,要做到望文知意, 否则宁愿用长一点的单词.

注1: 也有一种命名函数名的风格是 首字母小写,后面单词首字母大写,中间不用连接符, 比如 getMaxValue(). 类名单词首字母大写不用分隔符,如 class MyDateClass; 类的成员首单词首字母小写后面的单词首字母大写 如  int MyClass::myFunc(); 数据成员也是这样, 如 bool MyClass::writeOnly; <> 和 <>用的就是这个风格. JAVA的代码也偏向这个风格.

注2: 有些人喜欢用首字母大写的方式(不用下划线连接)命名全局的变量/函数. 如果 AddChild(), MaxValue 等.我个人不是很喜欢,这样看起来像匈法的风格,不要混用.

习惯2 - 类名首字母用大写,以区分函数名和变量名,单词间用下划线连接. 如 class Date; class Base_date; 标准库了类名都是小写的. 自定义的结构体也用小写.

关于这一点, 由于C的历史要长得多,大量的经典代码都是C写的, 所以在这些经典代码中看不到类命名的习惯写法. 不过神人Bjarne.Stroustrup 的 << The C++ Programming>> 里的代码绝大部分的类的首字母都大写, 鉴于C++之父的巨大影响力,相信其代码风格也会被广泛模仿.我特意对照了英文版和中文版,都一样,不要告诉我是排版错误.-) 不过,总的说来,和类相关的命名习惯比较混乱.

习惯3 - 用全部大写单词加下划线命名常量. 常量名前加下划线一般被编译器或者库函数使用. 自定义的常量前面不要加下划线. #define SIZE 10 / const int MAX_VALUE= 10; 等

习惯4 - i, j, k, m, n, x, y, z 等单字母变量普遍被用在索引,循环语句控制,数学函数等处. 不应滥用.

习惯5 - Linux函数命名一般采取 "前缀_名词_动词" 的方式, 前缀为模块缩写,用大写字母 IO_get_char(), 如. 普通函数则采用 "名词_动词" 的方式命名,小写字母, 比如获总数 get_total_count(). 如果是类的成员函数则采用 "动词" 的方式命名, 因为"名词"的含义已经隐藏在类名里了, 如 box.draw().

习惯6 - 采用通用的前缀和后缀命名变量能提高可读性.

_ptr Suffix for pointer
Examples:
int *entry_ptr; /* Pointer to current entry */
char *last_ptr; /* Pointer to last char in str */


_p Another suffix for pointer. This can be a little confusing to people who are not
familiar with it, so the suffix _ptr is preferred.
Examples:
event *next_p;/* Pointer to next event in queue */
char *word_p; /* Pointer to start of next word */


_file A variable of type FILE *, or a C++ I/O stream.
Examples:
FILE *in_file; /* Input data file */
FILE *database_file;/*Where we put the database */


_fd File descriptor (returned by the open function.)
Examples:
/* The dictionary file descriptor */
int dictionary_fd;
/* File where we put the memory dump */
int dump_fd;


n_ Number of. For example, if you store a set of events in the array events, the
n_events is the number of entries in the events array. Does this violate the rule
about putting the most important word first? Yes, but it's established usage.
Examples:
/* A list of events */
int events[EVENT_MAX];
/* Number of items in event array */
int n_events = 0;
/* A list of accounts */
struct account account;
/* Number of accounts seen so far */
int n_accounts = 0;

    以上总结的习惯主要来源上海贝尔的<<< C++编程规范 >> 和 Steve Oualline的<< C Elements of Style>>,应该说还是有一定权威性. 不过, 最好的方法是阅读权威的 unix/linux 源代码 , 看看大师们是怎么命名的, 比如 linux 的源代码就很容易找到 - << Linux 内核完全注释 >> 赵炯.

    以下说说我自己的看法,仅供参考:

补充1 - 对于全局函数/变量名可以采用前缀 g_ , 静态函数/成员可以采用前缀 s_ (匈法也有类似的建议,但我认为这不会破坏unix风格的一致性, 都是小写字母和下划线)

补充2 - 类的数据成员用 m_ 前缀 或者 针对非public的数据成员, 用_前缀 (一个下划线前缀), 对public的成员和函数名相同规则, 在定义类的成员函数时,方便区分<< C++ Primer >>用这种风格.

你可能感兴趣的:(unix,events,descriptor,dictionary,file,database)