Android/Java代码规范

Posted 北漂周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android/Java代码规范相关的知识,希望对你有一定的参考价值。

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

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

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

具体规范内容如下:

android/Java代码规范

一、文档历史

版本说明日期作者
1.0Java代码规范 Draft2014-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自动检查插件

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);
else
showLoadingScreen(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:

AssetManager
Screen
ScreenType
  • 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.png
clickButton.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.xml
drawables.xml
styles,xml//通用的Style样式需要再次写
themes.xml
colors.xml
ids.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
/

以上是关于Android/Java代码规范的主要内容,如果未能解决你的问题,请参考以下文章

怎么看SQL表里某列是否是自增列

资讯 | CSS 命名规范,加速你的代码调试;神奇“Bug”——小范围深入 HTTP 协议;深度学习教程;进阶UI:一维分析法

区块链技术促进医药冷链物流更加可控和智能化

python-SSTI模板注入

Java线程池容量设置

区块链技术促进医药冷链物流更加可控和智能化