代码风格的简单整理

来源:互联网 发布:奥斯卡终身成就奖 知乎 编辑:程序博客网 时间:2024/04/29 01:40

代码风格

格式

空格

每一行的末尾不应该有空格,不论这行有没有内容。 每个函数声明的后面也不应该有空行。

public string GetText () {    string text = search_entry.GetText ();    return text;}

每个开始括号之前都应该有一个空格:

public string GetText () {}if (a == 5) return 4;for (i=0; i<maximum; i++) {}    //空格不要太多MyFunctionName ();Object my_instance = new Object ();

数学表达式中的操作数与运算符之间的空格也是必要的。

c = n * 2 + 4;

在变量申明初始化时,也需要通过空格对齐,对齐原则为数据类型 + N个TAB + 变量名 + N个TAB + = + 初始化值

int             sutdent_num     = 100;unsigned long max_student_num   = 10000;char*           student_name;

注意:

  • 左小括号 ( 之前必须是一个空格
  • 左括号 ( 右边和有括号 ) 左边不要空格
  • 做大括号 { 左边有一个空格

缩进

使用4个空格的缩进来保持一致性和可读性。在 Vim 中可做配置

tabstop=4softtabstop=4shiftwidth=4

在类、函数、循环和一般的顺序结构中,左大括号跟在第一行的末尾,接着一行是带了缩进的其他代码,右大括号则应该在单独的一行来关闭函数。

public int MyFunction (int a, string b, long c, int d, int e) {    if (a == 5) {        b = 3;        c += 2;        return d;    }    return e;}

在条件语句和循环语句当中,应当总是用大括号包裹住其所属代码,即使只有一行代码。

if (my_var > 2) {    print ("hello\n");}

同样的规则适用于 elseelse if

if (a == 4) {    b = 1;    print ("Yay");} else if (a == 3) {    b = 3;    print ("Not so good");}

如果一个变量的值需要判断两次以上,使用 switch/case 语句替代多个 else/if 。

switch (week_day) {   case "Monday":       message ("Let's work!");       break;   case "Tuesday":   case "Wednesday":       message ("What about watching a movie?");       break;   default:       message ("You don't have any recommendation.");       break;}

行长度

每一行代码数不超过80。但是,下面这些情况可以超过:

  • 如果一行注释包含了超过80字符的命令或URL,出于复制粘贴的方便可以超过80字符;
  • 包含长路径的可以超出80列,尽量避免;
  • 头文件保护可以无视该原则。
    头文件保护,一般是在文件第一行,使用宏保护的方式

#ifndef HASHMAP_HEADER#define HASHMAP_HEADER...#endif

非 ASCII 字符

尽量不使用非ASCII字符,使用时必须使用 UTF-8 格式。
哪怕是英文,也不应将用户界面的文本硬编码到源代码中,因此非 ASCII 字符要少用。特殊情况下可以适当包含此类字符,如,代码分析外部数据文件时,可以适当硬编码数据文件中作为分隔符的非 ASCII 字符串;更常用的是(不需要本地化的)单元测试代码可能包含非 ASCII 字符串。此类情况下,应使用 UTF-8 格式,因为很多工具都可以理解和处理其编码,十六进制编码也可以,尤其是在增强可读性的情况下——如”\xEF\xBB\xBF”是Unicode的 zero-width no-break space 字符,以 UTF-8 格式包含在源文件中是不可见的。

有时候,使用一个新的 terminal 的时候,编码使用默认编码(default),当代码中有中文注释的时候,打开查看的时候很可能出现乱码的情况,最好在编辑源文件的时候,就将编码设置为 utf-8 编码,使用其他工具打开时,通过 utf-8
打开就没什么问题。

我的 Vim 编码配置为

"file encodingset fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936set termencoding=utf-8set encoding=utf-8set fileencodings=ucs-bom,utf-8,cp936set fileencoding=utf-8

如果对编码很感兴趣的童鞋,可以阅读这篇文章 [http://blog.csdn.net/lovekatherine/article/details/1765903]

函数申明、定义或调用的格式

尽量挡在同一行,如果一行放不下,可以放在多行

int ret = GetMax (a, b);void DoSomeThing (arg1, arg2, arg3,                  arg4, arg5) {    /* statements */}

如果参数很多,处于可读性考虑每行可只放一个参数。

bool retval = DoSomeThing (argument1,                           argument2,                           argument3);

如果函数名太长,以至于超过最大长度,可以将所有参数独立成行。

布尔表达式

如果一个布尔表达式超过标准行宽(80字符),需要断行。断行时,每一个子表达式都需要用括号括起来,同时在新的一行的子表达式的开头使用 &&,||符号连接

if ((this_one_thing > this_other_thing)    && (a_third_thing == a_fourth_thing)    && (yet_another & last_one)) {  ...}

在每一行的开头使用 && 或者 || 将子表达式连接起来,是为了当需要注释其中一个子表达式时,通过 /**/ 直接注释即可

类和文件

每个类只有一个与其对应的文件。

在所有的文件当中,同一个类的名称应当是一致的。

尽量提取代码中相同的部分,抽象成类以易于扩展。

注释

注释都要在同一行内,即使那一行有代码。

在同一行中,代码后面的注释要缩进。过于显眼的注释危害大于好处。

/* User chose number five */if (a == 5) {    B = 4;           // Update value of b    c = 0;           // No need for c to be positive    l = n * 2 + 4;   // Clear l variable}

有些人或者公司会硬性的规定注释必须使用英文,推荐使用英文,但是如果英语表达能力有欠缺,分分钟说能够说清楚的,用英文越说越乱,那还是看着办吧(->_->)

注释风格

统一使用 /**/

变量注释

变量注释,尽量写在变量申明的同一行

int student_number;     /* student number */

对结构体或者类的成员也这么注释

typedef struct NodeFileDescription {    ElemType* date;             /* 值 */    struct NodeFileDescription* next;   /* 链表指针 */};

函数注释

在编写函数之前,需要为函数添加相应的注释,函数名称,函数功能,参数说明,作者,邮箱,创建时间,修改时间,如下所示

/************************************************************* * funcName  : * funcDesc  : * argsDesc  : * author    : * email     : * createTime: .strftime("%Y-%m-%d %H:%M") * modifyTime: * ***********************************************************/

我使用的是 Vim 编辑器,所以可以通过键盘映射,使用 vimscript 编写这些功能

:nnoremap <C-m> o/*****************************************************<CR>            \ * funcName  :<CR>            \* funcDesc  :<CR>            \* argsDesc  :<CR>            \* author    :<CR>            \* email     :<CR>            \* createTime:<CR>            \* modifyTime:<CR>            \*******************************************************/<ESC>

类的注释

每个类的定义要附着描述类的功能和用法的注释。

文件注释

在每一个文件开头加入版权公告,然后是文件内容描述。

可查看 redis 中关于 ziplist.c 这个文件的描述,在文件开始,描述了 ziplist 的结构,以及 ziplist entry 的结构。

最后面一般是一些法律和公告信息,还有作者。如果你对其他人创建的文件做了重大修改,将你的信息添加到作者信息里,这样当其他人对该文件有疑问时可以知道该联系谁。

实现注释

对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。

TODO注释

对那些临时的、短期的解决方案,或已经够好但并不完美的代码使用 TODO 注释。这样的注释要使用全大写的字符串 TODO,后面括号(parentheses)里加上你的名字、邮箱等,还可以加上冒号(colon):目的是可以根据统一的 TODO 格式进行查找:

/* TODO(kl@gmail.com): Use a "*" here for concatenation operator. *//* TODO(Zeke) change this to use relations. */

通用命名规则

函数命名、变量命名、文件命名应具有描述性,不要过度缩写,类型和变量应该是名词,函数名可以用 “命令性” 动词。

尽可能给出描述性名称,不要节约空间,让别人很快理解你的代码更重要。

int num_errors;int num_completed_connections; 

文件名命名

文件名要全部小写,可以包含下划线(_)。可接受的文件命名:

my_useful_class.cmysql_utils.c

类型命名

类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClassMyExcitingEnum
所有类型命名——类、结构体、类型定义(typedef)、枚举——使用相同约定,例如:

class MyClass { ... }             // Class namesstruct RedisObject { ... }  // struct nametypedef unsigned int UINT32;    // typedefenum OperatingSystem { ... }// An enum name is the same as 

变量命名

变量名一律小写,单词间以下划线相连,类的成员变量以下划线结尾,如 my_exciting_local_variablemy_exciting_member_variable

普通变量或者局部变量:

char* student_name;char* studentname;

类或结构体的数据成员:
结构体和类的成员变量可以和普通变量一样

class StudentInfo {    private:        char*   student_name;        int     score;};struct UrlTableProperties {    string name;    int num_entries;}

全局变量:
全局变量尽量少用。如果是指针,前缀为 g_p**,如果是整型值,使用g_n**

CDataManager* g_pdatamanager;

常量命名

在名称前加k:kDaysInAWeek。
所有编译时常量(无论是局部的、全局的还是类中的)和其他变量保持些许区别,k后接大写字母开头的单词:

const int kDaysInAWeek = 7;

函数命名

以小写字母开头,往后每个单词首字母都需大写。

void getTablEntry ();void deleteUrl ();

枚举类型

枚举属于类型,命名以大小写混合的方式,首字母大写,往后每一个单词首字母均大写。枚举值必须全部大写,单词之间通过下划线连接

typedef enum UrlTableErrors{    OK = 0,    ERROR_OUT_OF_MEMORY,    ERROR_INVALID_INPUT}UrlTableErrors;

宏命名

宏名称全部大写,并且多个单词通过下划线连接。
注意:当宏有表达式时,宏定义需要用小括号连接起来

#define MAX_NUM 100000#define ZIPLIST_BYTES(zl)       (*((uint32_t*)(zl)))    // redis中求取压缩链表长度字节数的宏定义

LZ根据别人贡献的 vim配置,添加了一些适合自己的映射键,可通过以下链接下载:

https://github.com/small-cat/Vim/tree/master/packages
Scholegance_vim.tar.gz 是LZ修改的,其他的是 BillWang 提供的,大家可以去他的Github上看。

1 0
原创粉丝点击