Android/Java代码规范

来源:互联网 发布:快乐十分源码 编辑:程序博客网 时间:2024/05/29 14:15

由于公司最近的开发人员不断增多,作为一个公司的开发负责人,必须要做到代码可控性,总结了一下之前的开发经验,设计了一套开发代码规范,原本是给予内部使用的。现在这里想代价分享一下。

公司内部的规范主要是使用了checkstyle、findbugs + jenkins 来做控制。

跑完之后,才发现自己写的代码各式各样令人堪忧。

具体规范内容如下:

Android/Java代码规范

一、文档历史

版本 说明 日期 作者 1.0 Java代码规范 Draft 2014-7-1 周圣韬 2.0 诚壹Java规范制定 2016-7-25 周圣韬

二、简介

好的代码规范能减小沟通成本、重构成本与维护成本,降低bug出现机率。
本文阐述了诚壹金融Java项目与Android项目使用的Java代码规范。

说明

“DO” 为必须遵守。

2.1自动化格式的环境设置

使用Eclipse或者idea环境进行开发,需要导入一下自动格式化配置文件。与Checkstyle插件配置文件。

2.1.1

格式化
Eclipse的自动化格式环境目录设置,使用以下文件。

  • checkstyle_config_chengyiwm.xml
  • eclipse_code_formatter.xml
  • eclipse_code_templates_chengyi_java.xml

2.2自动检查插件

  • Checkstyle:http://eclipse-cs.sourceforge.net/update
  • Findbugs:http://findbugs.cs.umd.edu/eclipse

http://chengyiwm-wordpress.stor.sinaapp.com/uploads/2016/08/ci.zip‘>点击下载:代码格式化、checkstyle配置文件

Android Java代码规范


三、文档格式

此文档格式与注释等的要求,大部分可以通过Eclipse的自动化格式完成

3.1排版规范

源文件编码

  • DO 1.所有源文件编码均为UTF-8
  • DO 2.缩进为4个space,(不使用tab重要)
  • DO 3.每行不超过200个字符,超过需要折行

空格、空行

左右的变量,操作符,参数之间必须加入空格

Bad Example:(操作符’if’、’=’的前后没有空格)

        Profile profile=getUserInfo(param.getReqHead().getUserId());        GetUserInfoResp resp=new GetUserInfoResp();        if(profile!=null){            BeanUtils.copyProperties(profile, resp);        }        resp.setUserType(authInfoService.getAuthStatus(param.getReqHead().getUserId()));        return resp;

Bad Example:(花括号没有换行)

        if(profile!=null){BeanUtils.copyProperties(profile, resp);}

属性顺序

  • DO 4.方法的属性顺序为public、protected、private

大括号

  • DO 5.起始大括号不要单独占一行,结束的大括号独立成行

Bad Example:

if (condition){//do something}

正确:

if (condition) {    //do something}
  • DO 6.若代码块内只有一行语句,则也不能省略大括号。如:

Bad Example:

if (gpsFightInfo == null)showLoadingScreen(SCREEN_ACTION_RESUME, 0, 1.0f);elseshowLoadingScreen(SCREEN_ACTION_RESUME, 0, 0.5f);for (int i = 0; i < headers.length; i++)headers[i] = headers[i].toLowerCase();

正确:

if (gpsFightInfo == null) {showLoadingScreen(SCREEN_ACTION_RESUME, 0, 1.0f);} else {showLoadingScreen(SCREEN_ACTION_RESUME, 0, 0.5f);}           for (int i = 0; i < headers.length; i++) {headers[i] = headers[i].toLowerCase();}

3.2注释

  • DO 7.使用标准javadoc(CTRL+ALT+J)使用template
    Example:
    /**     * 新增地址     * @param addressparam地址参数     * @return 地址请求返回结果     * @throws IOException io读写错误     */    public Object addAddress(AddAddressParam addressparam) throws IOException {        return addressService.addAddress(param);    }

Bad Example: (不要使用无意义的自动以注解@Description,@param @param param 不知道什么意思….)

    /**     * @throws IOException      * @throws NoSuchAlgorithmException      * @throws KeyManagementException      *      * @Description:用户注册     * @author wangshuxiong@chengyiwm.com     * @param @param param      * @param @return     * @return Object     * @date 2016年4月21日 下午1:12:28     * @throws     */    public Object updateAddress(UpdateAddressParam param) throws KeyManagementException, NoSuchAlgorithmException, IOException
  • DO 8.public的/class/interface/enum需要注释
  • DO 9.public的field/method需要注释

必须写在上面,不能换行

Bad Example:

    private Integer opType;// 0 新建 1修改

Bad Example 2:

    // 0 新建 1修改    private Integer opType;

正确:

    /** 操作状态 0 新建 1修改 */    private Integer opType;

四、命名

不要小看命名,不合适的命名会带来很大的阅读障碍,也加大后期的重构与维护成本。

4.1基础命名规范

  • DO 10.Package\Class的命名为lowercase,且不带短线和下划线

Example:

com.chengyiwm.goldman
  • DO 11.class/interface/enum的命名使用PascalCase

Example:

AssetManagerScreenScreenType
  • DO 12.method的命名使用camelCase

Example:

public void loadEssentialAssets();
  • DO 13.private 或者protected field使用“m”前缀(m的含义为member),下划线后的部分使用camelCase

Example:

private AssetManager mAssetManager;
  • DO 14.static field使用g前缀(g的含义为global),下划线后的部分使用camelCase

Example:

private static Class[] gClassArray;
  • DO 15.constants的命名为FULL_UPPER_CASE,且用下划线分割单词

Example:

public static final int ACCESS_RANDOM = 1;public static final String FONT_HP_PATH = "fonts/hp.fnt";
  • DO 16.enum中各字段的命名为PascalCase,且每个字段独立成行
    Example:
public enum Element {Earth,Hero,    WaterFire}
  • 建议:命名必须是自解释的、有意义的,不要用i、j、k等名字命名

Bad Example:
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}

命名必须使用合理、常用的英文单词,或行业术语,杜绝用冷门词汇

  • DO 17.缩写的使用必须参考缩写规范表,不在缩写规范表里的不许用
  • DO 18.Method名字需要是doSomething
  • DO 19.Class名字需要是NamePhrase(首字母大写)
  • DO 20.数据类型不需要加前缀、匈牙利命名法

常用资源命名

  • DO 21.Activity命名:xxxxActivity
  • DO 22.View命名:xxxxView 或者 xxxxLayout
  • DO 23.Service命名:xxxxService
  • DO 24.BroadcastReceiver命名:xxxxReceiver
  • DO 25.Layout文件命名:
    Activity的Content View应使用:activity_xxxx.xml 的形式
    自定义View应使用:view_xxxx.xml

资源文件命名

  • DO 26.关于StateListDrawable各种状态的命名后缀

文件名全部小写,写明按钮的具体作用和状态,单词之间使用下划线连接。

Bad Example:

Click_button.pngclickButton.png….

正确:

    login_normal.png    login_pressed.png    login_focused.png    xxxx_checked.png    xxxx_focused.png    xxxx_selected.png    xxxx_pressed.png    xxxx_disabled.png    xxxx_normal.png
  • DO 27.常量文件的命名
strings.xml//所有的字符串资源文件需要在此声明dimens.xmldrawables.xmlstyles,xml//通用的Style样式需要再次写themes.xmlcolors.xmlids.xml
  • DO 28.第三方插件,则需要加一个前缀,与本地资源区分开
    Example:
    正确:
学霸插件logo:xueba_logo.png玩图插件logo: wantu_logo.png错误:学霸插件logo:logo.png玩图插件logo: logo.png

/*
* @author zhoushengtao(周圣韬)
* @since 2016年7月16日 下午16:47:20
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
/

1 1
原创粉丝点击