本文为 Crocutax 原创 , 转载请注明出处 http://www.crocutax.com
核心原则
- 见名知意
- 严格执行命名规范
- 全局禁用拼音
分包规范
包名全部小写,连续的单词只是简单地连接起来,不使用下划线。 采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为xxx(公司名),三级包名根据应用进行命名,四级包名为模块名或层级名。 例如:com.longke.qq.activity
com.xxx.activity Activity类
com.xxx.service Service
com.xxx.receiver BroadCastReceiver
com.xxx.provider ContentProvider
com.xxx.base 基类
com.xxx.adapter ViewPager/RecyclerView等适配器
com.xxx.util 各种StringUtil,NetUtil,BitmapUtil等工具类
com.xxx.view 自定义view/第三方开源控件
com.xxx.bean 各种实体类,下面可以再细分VO,PO,DTO
com.xxx.db 数据库操作类
注意:
- 部分特殊的第三方SDK,比如微信支付,Zxing,讯飞语言等对如果对包位置有特殊要求的,按第三方要求来
- MyApplication等全局相关的配置类,放在包名目录下
命名规范
类
Activity / Fragment / Adapter / Bean...
类名由一个或多个单词组成,采用 大驼峰命名法
同一界面,不同类型的类,前缀必须一样,比如:HomePageActivity,HomePageFragment,HomePageListAdapter...
Listener
Listener接口监听事件的命名规范:以On开头Listener作为后缀。
具体:On+事件描述+Listener
例如:点击事件:OnClickListener
对应的调用方法:setOnClickListener()
常量
常量命名采用 : 全大写 + 下划线方式例如:
public static final int LOGIN_FLAG = 1 ;
intent标记的key以INTENT 开头 , 各个单词以_隔开,例如:
public static final String INTENT_CAR_ID = "intentCarId";
变量
变量以小驼峰式命名法,不同类型的变量又有不同的命名方式.
私有成员变量
必须以"m"开头 + 变量名
例如:
private int mThemeId = 0;
private boolean mIsOpen;
private List<Strng> mUrlList;
静态成员变量
必须以"s"开头 + 变量名
private static boolean sIsOpen = false;
局部变量
小驼峰命名法
public String getUserName(){
String userName = getUserNameFromDB();
...
}
方法
方法命名规则采用小驼峰命名法例如:
onCreate() / onResume() / onRun()
getXX()返回某个值的方法
initXX() 初始化相关方法,比如初始化布局:initView()
checkXX()和isXX()方法为boolean值的时候使用is或者check为前缀
saveXX() 保存数据
clearXX()和removeXX() 清除数据
updateXX() 更新数据
processXX() 对数据进行处理
dispalyXX() 显示某某信息
对于方法的其他一些规范
- 方法的参数尽可能不超过4个,多余4个考虑采用builder模式或者JavaBean形式
- 注意单一职责原则
- 方法尽量避免返回null,可以考虑抛异常或空数据,比如Collections.emptyList()
类声明规范
区块划分
建议使用注释将源文件分为明显的区块,区块划分如下
常量声明区
UI控件成员变量声明区
普通成员变量声明区
内部接口声明区
初始化相关方法区
事件响应方法区
普通逻辑方法区
重载的逻辑方法区
生命周期回调方法区
内部类声明区
类成员排列通用规则
按照发生的先后顺序排列
常量按照使用先后排列
UI控件成员变量按照layout文件中的先后顺序排列
普通成员变量按照使用的先后顺序排列
方法基本上都按照调用的先后顺序在各自区块中排列
相关功能作为小区块放在一起(或者作为一个封装体引入)
重载方法永不分离,当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。
资源文件命名规范
- Activity对应的布局文件命名:
XxxActivity--> activity_xxx.xml
,比如MainActivity.java--> activity_main.xml
- XML中控件命名:控件名界面名作用,例如:tv_homepage_name ,et_login_phone
- 图片命名,资源文件,控件id命名:activity名称+功能名称(背景bg,按钮bt,图片控件iv等)+自己名称
- RecyclerView / ListView中的item布局文件命名规范:以item_list作为前缀,以页面名称作为中缀,以列表描述作为后缀。具体:"item_list_"+页面名称+列表描述,例如:item_list_login_users.xml
- Dialog布局文件命名规范:以dialog作为前缀,如果是通用的dialog则以common作为中缀以功能描述作为后缀。如果是对应页面定制的dialog,以页面描述作为中缀,dialog描述作为后缀。
具体:
通用的dialog:dialog+common+功能描述,例如dialog_common_hint.xml
指定页面的dialog:dialog+页面名称+功能描述,例如dialog_login_pwd_error.xml
values下文件命名
strings.xml
直接以对应的内容的英文单词组合命名.例如:
<string name="buy_ticket">购票</string>
<string name="region_list">景区列表</string>
colors.xml
具体:页面+"_"+描述+颜色名称,例如:
登录页面登录按钮字体颜色
<!--登录页面登录按钮字体颜色 -->
<color name="login_activity_login_btn_text">#000000</color>
当然还有一些APP主题色,规范为:common_描述 ,例如:
<!--通用的item字体颜色 -->
<color name="common_item_text">#33AACC</color>
dimens.xml文件命名
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
drawable目录下资源文件命名规范:
selector文件
以selector作为前缀,以某个页面的作为中缀如果是多个页面就以模块名称作为中缀或者是项目通用的就以common作为中缀,以功能描述作为后缀。
具体:
selector+页面名称+功能描述
selector+模块名称+功能描述
selector+common+功能描述
例如:
登陆页面的确认按钮:selector_login_confirm_btn.xml(login为页面名称)
所有支付模块购买的按钮:selector_pay_buy_btn.xml(buy为模块名称)
所有通用按钮的背景:selector_common_btn_bg.xml
shape图形
以shape 作为前缀,如果是通用的以common作为中缀,如果是单独页面的以页面名称作为中缀,或者以模块名称作为中缀,以功能描述作为后缀。
具体形式和selector一样。
图片资源
图片资源命名规范 全部小写,采用下划线命名法,加前缀区分 命名模式:可加后缀 _small 表示小图, _big 表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
用途_模块名_逻辑名称
用途_模块名_颜色
用途_逻辑名称
用途_颜色
icon图片资源以ic开头;
具体: 前缀+""+页面名称+""+描述 (如果页面和描述一致的则不用重复)
欢迎页面背景图 bg_welcome.png
登录页面 登录按钮背景 bg_login_btn.png
btn_main_home.png 按键
divider_maket_white.png 分割线
ic_edit.png 图标
bg_main.png 背景
btn_red.png 红色按键
btn_red_big.png 红色大按键
ic_head_small.png 小头像
bg_input.png 输入框背景
divider_white.png 白色分割线
anim目录
全部小写,采用下划线命名法,加前缀区分。具体动画采用以下规则:
模块名_逻辑名称
逻辑名称
refresh_progress.xml
market_cart_add.xml
market_cart_remove.xml
普通的tween动画采用如下命名方式:
// 前面为动画的类型,后面为方向
动画命名例子 描述
fade_in 淡入
fade_out 淡出
push_down_in 从下方推入
push_down_out 从下方推出
push_left 推向左方
slide_in_from_top 从头部滑动进入
zoom_enter 变形进入
slide_in 滑动进入
shrink_to_middle 中间缩小
其他注意事项
- 定义类或者接口 首行留空格,末尾不留;其次每个逻辑分区都要留单行空格(除普通常量定义外)
- 定义类或者接口变量时,请使用基类或者顶层接口定义变量
- 自行控制类、接口、及其成员的访问权限,尽量缩小访问权限
- 类如果不是为扩展而设计的请加final修饰符
- 遇到switch语句时,酌情考虑将每个case语句拆分成单个函数调用
- 接口定义不加“I”前缀,实现添加"impl"后缀,如果有必要请提供默认的实现和其它实现 (默认实现:Default+接口名+impl,其它实现 :具体扩展功能 + 接口 + impl)
- 具有controller功能的类或者接口定义 都以 功能+“manager” 形式定义
- 所有表示层设计的实体定义形式为 : 功能+“model”