最近为公司整理了下技术编码规范,主要是统一下研发风格并从长远看提高整个团队的工作效率。如下:
一、Git工程
1.1 使用maven创建依赖工程,上传到公司git库http://10.1.xx.xx:8080/groups/koudai,初创者拥有owner权限,相关开发developer,其它一律guest
1.2 工程结构,以dump-consle子工程为例
- src/filters:工程配置目录,一般包括线上配置prod.properties和日常配置daily.properties
- src/main/java:代码目录
- src/main/resource:工程资源目录,包括bean配置子目录,脚本子目录bin
- src/main/webapp:标准web目录
- src/main/test:单元测试目录,和src/main/java对应
- target:本地编译打包目录
1.3 完善README.md,如果是项目工程,须包括:
1.4 工程文档,在工程根目录下建立docs目录,存放相关需求分析、详细设计、测试文档、图片、参考资料等
1.5 建立.gitignore,禁止提交以下类型文件
- *.classpath
- *.project
- *.setting
- target
1.6 主干与分支
开发一律走分支,禁止主干开发。分支命名以“项目_分支日期_分支应用”格式,如“dump_20150618_ic-delta-binlog”。分支提交以一个完整的feature作为commit点,写清comment。分支的合并如果是持续性的功能开发分支建议用rebase来保持主干的线性变化,修改bug等临时分支用merge操作
1.7 版本控制
开发过程中被其它项目依赖时,需要提供内部二方包,如“category-client-1.0.0-snapshot.jar”,最好将源码包一并上传。正式release的不要加上snapshot,版本的演化用数字递增(如小改动升级1.0.1,大改动升级为2.0.0)
二、代码风格
以下内容均在eclipse调试配置通过,可以直接将附件的模版文件导入即可
2.1 clean up
- 删除非静态访问变量的“this”修饰符
- 删除未使用的import语句
- 删除未使用到局部变量
- 删除不必要的casts溯型
- 添加“@Override”注释
- 添加“@Deprecated”注释
- 添加继承接口中未实现的方法
- 使用声明成员变量替换对非静态变量的访问
- 控制语句增加块结构
2.2 code template
/**
* <p>文件名称:${file_name}</p>
* <p>文件描述:</p>
* <p>版权所有:版权所有(C)2011-2099</p>
* <p>公 司:口袋购物</p>
* <p>内容摘要:</p>
* <p>其他说明:</p>
* <p>完成日期:${date}</p>
*
* @version 1.0
* @author ${USER}
*/
/**
* <p>功能描述:</p>
* <p>创建人:${user}</p>
* <p>创建日期:${date} ${time}</p>
*
* ${tags}
*/
2.3 formatter
2.3.1 缩进
制表符tab使用4个空格,缩进大小也为4个空格,需要缩进情况:
- 类body声明
- 枚举类型/枚举常量声明
- annotation声明
- 方法/构造器声明
- 代码块声明
- switch body声明
- case body声明
- break语句
2.3.2 括号
- 类/接口声明
- 匿名类声明
- 方法/构造器声明
- 枚举类/枚举常量声明
- annotation声明
- 代码块声明
- case/switch语句
- 数组初始化
2.3.3 空格
类、成员变量、局部变量、构造器、方法、labels、annotations、枚举、lambda声明,如下
class MyClass implements I0, I1, I2 {
}
AnonClass = new AnonClass() {
void foo(Some s) {
}
};
int a = 0, b = 1, c = 2, d = 3;
MyClass() throws E0, E1 {
this(0, 0, 0);
}
MyClass(int x, int y, int z) throws E0, E1 {
super(x, y, z, true);
}
void foo() throws E0, E1 {
};
void bar(int x, int y) throws E0, E1 {
}
void format(String s, Object... args) {
}
label: for (int i = 0; i < list.length; i++) {
for (int j = 0; j < list[i].length; j++)
continue label;
}
@Annot(x = 23, y = -3)
public class A {
}
enum MyEnum {
GREEN(0, 1), RED() {
void process() {
}
}
}
@interface MyAnnotation {
String value();
}
@interface OtherAnnotation {
}
Runnable r = () -> process();
控制语句
int a = 4;
foo();
bar(x, y);
if (true) {
return 1;
} else {
return 2;
}
if (condition) {
return foo;
} else {
return bar;
}
for (int i = 0, j = array.length; i < array.length; i++, j--) {
}
for (String s : names) {
}
switch (number) {
case RED:
return GREEN;
case GREEN:
return BLUE;
case BLUE:
return RED;
default:
return BLACK;
}
while (condition) {
}
;
do {
} while (condition);
synchronized (list) {
list.add(element);
}
try (FileReader reader1 = new FileReader("file1"); FileReader reader2 = newFileReader("file2")) {
}
try {
number = Integer.parseInt(value);
} catch (NumberFormatException e) {
}
assert condition : reportError();
return (o);
throw(e)
表达式
foo();
bar(x, y);
String str = new String();
Point point = new Point(x, y);
MyClass() throws E0, E1 {
this(0, 0, 0);
}
MyClass(int x, int y, int z) throws E0, E1 {
super(x, y, z, true);
}
List list = new ArrayList();
int a = -4 + -9;
b = a++ / --number;
c += 4;
boolean value = true && false;
result = (a * (b + c + d) * (e + f));
String s = ((String) object);
String value = condition ? TRUE : FALSE;
数组
int[] array0 = new int[] {};
int[] array1 = new int[] {1, 2, 3};
int[] array2 = new int[3];
array[i].foo();
参数化类型
Map<String, Element> map = new HashMap<String, Element>();
x.<String, Element> foo();
class MyGenericType<S, T extends Element & List> {
}
Map<X<?>, Y<? extends K, ? super V>> t;
2.3.4 空白行
- package声明后空一行
- import语句前空一行
- 在import组之间空一行
- 在import声明后空一行
- 类声明之间空一行
- 内部类、方法、同类声明前空一行
2.3.5 换行
行宽160个字符,默认换行缩进2个字符,默认数组初始化缩进2个字符,需要换行情况
- 类、匿名类、方法body须新起一行
- 枚举类、枚举常量声明须新起一行
- 代码块须新起一行
- annotation新起一行
2.4 organize imports
- package声明必须在import语句之前
- import顺序,以包头为准 java > javax > org > com
- 禁止在import语句中使用通配符*
三、命名规范
3.1 package
以com.koudai.${project}.${module}开头,所有包名的单词均小写
3.2 类
以大写字母开头其它字母小写的单词,多个单词组成时首字母大写
3.3 常量
static final修饰,单词全部大写,多个单词之间用“_”分隔
3.4 方法
首字母小写的单词,多个单词除第一个外后面所有单词首字母大写
3.5 方法参数
使用有意义的参数命名,尽量和需要赋值的变量保持一致
3.6 数组
使用byte[] buffer 而不是 byte buffer[]
3.7 其它
- 接口实现后面加上Impl
- 异常定义后面加上Exception
- 抽象类以Abstarct开头
- 测试类后面加上Test
四、书写规范
4.1 返回值
void方法无需返回;如果方法返回集合对象,在无元素时应返回大小为0的空集合而不是null对象;当需要返回null对象时,优先考虑使用自定义的NullObject替换null
4.2 异常处理
- 尽早抛出,延迟捕获
- 不要为每个可能出现的异常使用try-catch
- 不要在代码中捕获或抛出Error
- 声明或捕获应是具体的类型异常,而非Throwable和Exception
- 在循环外而非循环中处理异常
- 千万不要捕获甚至吃掉自己不能处理的异常
4.3 表达式
复杂的算术、逻辑表达式须加括号,避免使用java默认的运算优先级,如(5 *(x - y))/ (4 + y)
尽可能使用二元赋值运算符,如 x+=1 而非 x = x + 1
4.4 控制语句
- 避免使用while(true)这样的循环判断
- 对与iterator迭代类型的集合,使用foreach替换for进行集合遍历
- for循环中的递增变量使用 ++i 而非 i++
- switch必须包含default语句
- 条件分支if-else中的else if保持在同一行代码
- 优先考虑条件运算符替换if-else判断
4.5 注释
- 常量、类型成员变量、方法尽量加注释
- 容易引起歧义的地方、算法、业务相关处理加注释
- 注释风格保持一致,避免中英文夹杂
- 行注释统一放在被注释的代码上一行
- 养成使用TODO、FIXME的习惯
- 大小: 139.5 KB
分享到:
相关推荐
【JAVA技术编码规范9/11】是一份针对初级开发者制定的编程标准,旨在提高代码质量和可维护性。这份规范涵盖了多个重要的编程实践,对于初入IT行业的开发人员来说是极有价值的指南。以下是对这些规范的详细解读: 1....
### Java技术部编码规范知识点详解 #### 一、引言 **1.1 为何要有编码规范** 在软件开发过程中,编码规范具有重要的意义。它不仅有助于提高代码的可读性和可维护性,还能帮助团队成员更好地理解彼此的代码。具体...
原文作者: EricHu (挺不错的,我推荐其中的编码规范那篇文章) 规范的编码风格不仅体现了一个人的技术水平,从某种意义上说也体现了一个企业的形象。好的、规范的编码风格,对于整个项目团队来说显得尤为重要。本...
### Android客户端编码规范详解 #### 一、引言 在软件开发过程中,编码规范的制定对于提高代码质量、增强团队协作效率以及维护项目的可持续性至关重要。Android客户端编码规范旨在为开发者提供一套统一的标准,...
C语言编码规范 C语言编码规范是编写高质量C语言代码的重要指南。遵守这些规则可以确保代码的可读性、可维护性和可靠性。本文将详细介绍C语言编码规范的各个方面,包括文件组织、命名约定、编程风格、注释、错误处理...
Android 开发框架与编码规范是指在 Android 平台上进行应用程序开发时所采用的技术框架和编码规范。这个框架和规范的目的是为了提高应用程序的可维护性、可读性和可扩展性,提高开发效率和质量。 Android 开发...
《C#通用编码规范》是GDTEC公司为新员工培训和技术部门制定的一份详尽的编程指导文档,旨在提高代码质量和团队协作效率。本文档主要涵盖了注释规范、.NET编码规范和数据库编码规范等多个方面,以下是这些规范的详细...
3. **华为编码规范**:华为的编码规范不仅限于技术细节,更注重团队协作和项目管理。例如,它可能要求开发者提交代码前进行代码审查,使用版本控制工具,遵循变更管理和文档编写的规定。此外,它还强调代码的可测试...
本文将深入探讨由江西微软技术部经理编写的C#编码规范,涵盖多个方面,包括命名规则、注释规范、代码格式以及SQL编码规范。 首先,**命名规范**是编码规范的核心之一。在C#中,推荐使用Pascal大小写(每个单词首...
《Verilog编码规范》是西安交通大学人机所电视组和创芯公司共同制定的一份文档,旨在提升DTV系列芯片Verilog源码的可读性、健壮性和易维护性。这份规范不仅适用于Verilog,也适用于类似的语言如VHDL。编码规范的重要...
**Google编码规范 之C中文版** 在编程领域,遵循一套良好的编码规范是至关重要的,它不仅能够提高代码的可读性,降低维护成本,还能提升团队协作效率。Google作为全球知名的科技公司,其制定的编码规范被广泛认可并...
JAVA编码规范是软件开发中不可或缺的一部分,它不仅有助于提高代码的可读性和可维护性,还能促进团队协作,减少潜在的编程错误。以下是从给定的文件信息中提炼出的关键知识点,涵盖了JAVA编码规范的基本原则、文件...
### 集成编程环境与编码规范 #### 实验目的 本实验旨在让学习者深入了解并熟练掌握PHP、.Net、JAVA三种主流编程语言的集成编程环境及其编码规范。通过本实验的学习,学习者不仅能够熟悉这些编程语言的基础知识,还...
本规范可能引用了其他技术文档、设计原则或行业标准,如Google编码规范、PEP 8(Python编码规范)等,这些文件提供了更具体的指导。 1.4 术语表 术语表列举了文档中使用的关键术语和定义,以便读者理解。 1.5 参考...
百度作为一家技术驱动的公司,也提出了其内部使用的Java编码规范,旨在确保代码的一致性和专业性。 ### 1. 代码书写 #### 1.1 K&R代码风格 百度Java编码规范要求程序块采用K&R(Kernel Normal Routine)代码风格...
- 定期回顾并更新个人的编码规范,适应新技术和编程标准的变化。 总之,编码规范是软件工程的基础,通过遵循一套详尽的规范,如本文所述的VB开发规范,可以显著提升软件的质量和开发效率。开发者应将其视为一项长期...
编码规范不是一成不变的,随着技术发展和最佳实践的积累,编码规范也会不断更新和完善。开发者应持续学习,理解和遵循这些规范,以提升自己的编程水平。在实际工作中,结合具体项目和团队习惯,灵活应用编码规范,...
【个体软件过程与编码规范】是软件开发领域中一项至关重要的实践,旨在提高代码质量、增强团队协作效率以及促进软件产品的可维护性。在国家级精品课程《个体软件过程与编码规范》中,深入探讨了这一主题,以帮助...