命名规范
Java
1.排版风格
for(…) {
…
}func() {
…
}
- 单行字符不超过100个
- 相对独立的程序块间加空行
- 对其只使用空格(tab键默认设为4个空格)
- 逗号分行只在后面加空格,操作符前后加空格,单目操作符(++,–等)前后不加空格,if或者for等与后面括号中间加空格
2.命名
- 包名示例: com.huawei.android.模块名.小模块名
- 类名意义完整的英文描述,每个首字符使用大写
- 方法名意义完整的英文描述,首字母小写,其余字母大小写混合
- 方法名(get+非布尔属性 | is+布尔属性 | set+属性 | 动词 | 动词+宾语)
- 属性名(非共有属性以m开头,共有属性小写字母开头,static属性以s开头,其他部分大小写混合; static final常量属性全大写)
- 常用组件类的命名以组件名加上组件类型名结尾(如Application类型,命名以App结尾–MainApp, Frame结尾的TopFrame等)
- 函数名长度不超过15
- 不是必须使用public属性的,使用protected,不是必须protected,使用private
3.类定义
类格式定义:
{
共有属性
保护属性
私有属性
共有方法
保护方法
私有方法
}
4.注释
类注释
/**
* <一句话描述功能>
* <功能详细描述>
* @author [作者]
* @version [版本号, YY-MM-DD]
* @see [相关类/方法]
* @since [产品/模块版本]
* @deprecated
* /
类注释位于package关键字之后,class关键字之前。
成员函数注释
/**
* <一句话功能描述>
* <功能详细描述>
* @param [参数1] [参数1说明]
* @param [参数2] [参数2说明]
* @return [返回类型说明]
* @exception/throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
* @deprecated
* /
- 代码中的注释应在代码上下行
- 注释使用英语和半角标点符号
- 代码与注释同步更新
- 排版与代码一致
5.代码调试Log
调试代码使用一个包含统一开关的测试类进行统一打印
C/C++
1.常量
- 少使用宏定义常量,多使用const定义常量
- 相关类型的整型常量定义为枚举enum
- 不相关的常量即使取值一样也要分开定义
2.初始化与类型转换
- 禁止用memcpy和memset初始化非POD对象
- 变量使用时才声明并初始化
- 避免构造函数做复杂的初始化,可以用init函数
- 初始化列表严格按照成员声明顺序来初始化它们
- 明确有外部依赖关系的全局与静态对象的初始化顺序
通常采用单件(Singleton)模式或者把有依赖关系的全局对象放在一个文件中定义来明确初始化顺序。同一个文件中,若全局对象a在全局对象b之前定义,则a一定会在b之前初始化;但是不同文件中的全局对象就没有固定的初始化顺序。可以在main()或 pthread_once() 内初始化一个运行期间不回收的指针。
3. 使用C++风格类型转换,不使用C风格
C++使用const_cast, dynamic_cast, static_cast, reinterpret_cast等新的类型转换,它们允许用户选择适当级别的转换符,而不是像C那样全用一个转换符。
dynamic_cast:主要用于下行转换,dynamic_cast具有类型检查的功能。dynamic_cast有一定的开销,建议在调测代码中使用。
static_cast:和C风格转换相似可做值的强制转换,或上行转换(把派生类的指针或引用转换成基类的指针或引用)。该转换经常用于消除多重继承带来的类型歧义,是相对安全的。下行转换(把基类的指针或引用转换成派生类的指针或引用)时,由于没有动态类型检查,所以不安全的,不提倡下行转换。
reinterpret_cast:用于转换不相关的类型。reinterpret_cast强制编译器将某个类型对象的内存重新解释成另一种类型,相关代码可移植不好。建议对reinterpret_cast<> 的用法进行注释,有助于减少维护者在看到这种转换时的顾虑。 const_cast:用于移除对象的 const属性,使对象变得可修改。
4.**函数**- 内联函数小于10行
- 使用内联函数代替函数宏
- 内联函数应该放在头文件中声明,而且在函数前添加inline关键字
内联函数的实现放在独立的文件
入参尽量用const引用取代指针
- 消除未使用函数参数
- 尽量少使用缺省参数
- 尽量少用函数指针
- 不要在头文件中或者#include之前使用using指示符
5.资源分配与释放
内存申请与释放一般原则:
对象在退出其作用域时,就应该立即被释放,而且要做到:谁申请,谁释放。
函数内分配的内存, 函数退出之前要释放,避免跨函数释放;
类中数据成员的内存,在析构函数中确认并释放;
全局变量、静态变量的内存空间则在进程退出时,或相应的共享库被卸载时,由操作系统回收;
如果程序分支很多或内存资源的分配与释放不在同一个地方,要考虑使用RAII等资源跟踪管理技术。
- 释放内存后,要立即将指针设置为NULL,防止产生野指针
- 单个对象释放使用delete,数组对象释放使用delete []
- 释放结构(类)指针时,首先释放其成员指针的内存空间
- 释放指针数组时,首先释放数组每个元素指针的内存
- 不要返回局部对象指针
- 使用new, delete的封装方式来分配与释放内存
6.其他
- 在构造函数中用初始化代替赋值
- 对象参数尽量传递引用(优先)或指针而不是传值
- 尽量减少临时对象
- 简单访问方法尽量采用内联函数
数据库
- 数据库命名
根据项目的实际意义来命名 - 表命名
“tbl_”+ 名称(名称尽量使用英文单词,每个单词的首字母大写) 字段命名
表名(去掉前缀)缩写 + ”_”+ 属性名称(每个单词的首字母大写)缩写:五笔拆字法取字母
一个单词:取前四个字母
二个单词:取每个单词的前两个字母
三个单词:取前两个单词的首字母和第三个单词的前两个字母。
四或四个以上:取前三个单词的首字母和最后一个单词的首字母。主键命名
主键是针对一个表的, 而不是针对一个字段,因为主键是唯一的,一个表只能有一个主键。a. 一般主键命名: 主键的命名为 pk_TableName。
b. 复合主键: ” pk_ ” + “ 字段名 ”