代码风格的简单整理
来源:互联网 发布:奥斯卡终身成就奖 知乎 编辑:程序博客网 时间: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");}
同样的规则适用于 else
和 else 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
类型命名
类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass
、MyExcitingEnum
。
所有类型命名——类、结构体、类型定义(typedef)、枚举——使用相同约定,例如:
class MyClass { ... } // Class namesstruct RedisObject { ... } // struct nametypedef unsigned int UINT32; // typedefenum OperatingSystem { ... }// An enum name is the same as
变量命名
变量名一律小写,单词间以下划线相连,类的成员变量以下划线结尾,如 my_exciting_local_variable
、my_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上看。
- 代码风格的简单整理
- 代码风格整理工具
- Linux代码风格整理
- 关于JS代码风格(整理+自己的意见)
- Java代码书写风格及一些简单的注意事项
- Java代码书写风格及一些简单的注意事项
- libevent 服务器代码,简单的整理。
- verilog代码编写风格(他人整理)
- 良好的代码风格
- ACE的代码风格
- ACE的代码风格
- VHDL的代码风格
- 良好的代码风格
- 良好的代码风格
- 代码风格的问题
- java的代码风格
- 优秀的代码风格
- Python 的代码风格
- CNN-目标检测、定位、分割
- HDU5971【瞎搞】
- NOIP 2016模拟赛[八中题]题解&总结
- 宝藏
- IntelliJ IDEA获取免费使用时间
- 代码风格的简单整理
- [图形学] 布料仿真(质点弹簧模型)
- java集合框架
- 【jsp】 3个编译指令和7个动作指令
- KNN - 笔记(1)
- HBASE我遇坑之client.AsyncProcess: #1, waiting for 5012 actions to finish
- static、初始化代码块
- NOIP 2012 疫情控制
- C++中如何动态分配二维数组