Android 开发应该注意的编程规范

文件命名

源文件以其最顶层的类名来命名,大小写敏感(首字母大写),文件扩展名为.java

文件编码

源文件编码格式utf-8

特殊字符

android开发比较明显,在布局文件引入字符含有特殊字符如空格,会有警告,需要用到转义符,并把所有String字符写入String.xml文件,对于转义字符建议注释给出解释,这有助于别人阅读和理解。实例如下

 <!-- &#8230; > ... -->
 <string name="loading_label">正在加载&#8230;</string>

代码格式化

① 大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

if(){
  //will to do something
}else{

}

for(Object obj : arrayList){

}
      //......................

② 左大括号前不换行,左大括号后换行

public void setText() {
  //will to do something
}

③ 一个空的块状结构里什么也不包含,大括号可以简洁地写成{},不需要换行。

public void setTitle(){};

④ 如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行。

try { } catch (Exception e) { // TODO: handle exception }

⑤ 一行一个语句,一行如果超过屏幕限制,必须自动换行。

⑥ 如果在一条语句后做注释,则双斜杠(//)两边都要空格。这里可以允许多个空格,但没有必要。

    if (a == b) { // ...

        }

⑦ 枚举常量间用逗号隔开,如果枚举构造函数不是无参(需要注释,也可以对齐注释)需要换行。


/** * Created by idea on 2016/4/21. */
public enum Mode {

    onRefresh(
            1, // 页码
            10, // 每页获取条数
            "home" // 请求类型
    ),
    onLoadMore(
            2,      // 页码
            10,     // 每页获取条数
            "home"  // 请求类型
    )
}

⑧ 不要使用组合声明

private int a , b;     // ×
.........................................
/**常量a定义*/
private int a;

/**常量b定义*/
private int b;         // √

⑨ 数组初始化可以写成块状结构

new int[] {
  0, 1, 2, 3 
}

new int[] {
  0,
  1,
  2,
  3
}

new int[] {
  0, 1,
  2, 3
}

new int[]{0, 1, 2, 3}

⑨ 中括号是类型的一部分:String[] args, 而非String args[]。

⑩ 每个switch语句都包含一个default语句组,即使它什么代码也不包含。

    switch (key) {
        case ONREFRESH:

            break;
        case ONLOADMORE:

            break;
        default:
            break;
        }

命名约定

① 包名全部小写,连续的单词只是简单地连接起来,不使用下划线。

com.china.Mobile // ×
..........................
com.china.mobile // √

② 类名都以UpperCamelCase风格编写。

newDialog.java IIstActivity.java // ×
........................
NewDialog.java HistoryActivity.java// √

③ 常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。

/** 刷新 */
public static final int TYPE_REFRESH = 0;
/** 加载更多 */
public static final int TYPE_LOADMORE = 1;

④ 方法命名主要以set、get、on开头,部分方法命名根据业务需求首字母小写

public void setTitle(String title){

}

public void getState(int tabIndex, int type) {

}

public <T> void onItemClick(int position, View converView, T t){

}

public void login(String userName, String password, Callback callback){

}

⑤ 对于自定义Interface公开set get方法这块,interface变量命名参考lowerCamelCase风格


    private OnHeadListener onHeadListener;

    public OnHeadListener getOnHeadListener() {
        return onHeadListener;
    }

    public void setOnHeadListener(OnHeadListener onHeadListener) {
        this.onHeadListener = onHeadListener;
    }

    /** * 顶部布局的监听 */
    interface OnHeadListener{

        /**' * 点击了左侧按钮毁掉该函数 * @param leftView 左侧view */
        void onClickLeft(View leftView);

        /** * 点击了右侧按钮毁掉该函数 * @param rightView 右侧view */
        void onClickRight(View rightView);

    }

⑥ 局部变量命名参考lowerCamelCase,在某些情况下可以考虑m+LowerCamelCase风格

 /** 顶部布局按键监听 */
 private OnHeadListener onHeadListener;
 /** 通讯录列表容器 */   
 private ListView mListView;

⑦ 编码命名最好见名知其意,不要用类似linearlayout1、linearlayout2、linearlayouii等风格,从业务角度命名控件

/** 展示报警列表容器 */
private ListView listView;
/** 设置布局layout */
private LinearLayout settingLayout;
/** 用户名编辑框 */
private EditText userNameEditText;

注释风格

① 类注释包含开发者信息以及类作用


/** * * 底部导航第四个界面 * @author idea * */
@SuppressLint("InflateParams")
public class SettingsFragment extends Fragment {

}

② 方法注释:重要的方法都要含有注释以便于阅读,方法参数加以说明

    /** * 登录方法 * @param userName 登录用户名 * @param password 登录密码 * @param callback 登录接口回调 */
    public void login(String userName, String password, Callback callback){

    }

③ 变量注释:控件最好都加上注释/* xxx /风格(debug或者阅读时,鼠标放变量上可以随时查看)

/**常量a定义*/
private int a;

/**常量b定义*/
private int b;         

④ 接口/抽象注释:在某种情况下存在很多重复代码,那么就需要把方法提取到抽象类或者接口,并做好注释(上面已有接口实例不再累赘叙述)

⑤ 根据实际情况,善用TODO注释

public void config(){
    // TODO:配置
}

重构

重复代码出现,要考虑重构复用,抽取成独立的类或者抽取到一个方法比如Fragment的切换管理,每次都要重复调用FragmentManager相关方法,我们可以把它抽取成一个方法放到BaseFragmentActivity以便于它的子类调用,然而我们的项目不止一个,都会用到这些雷同的方法,此时我们需要把它抽取到一个utils类,以便于其他项目集成

代码结构

把所有的类结构化,具体类型分包和业务分包

插件化

开发的同时要思考,多个项目的耦合,业务功能的重叠部分,综合考虑实际情况允许的情况下把这部分功能做成一个插件,以便于其他项目集成。

你可能感兴趣的:(android)