Android命名规范与编码风格

      在团队开发项目中,统一的命名规范与编码风格非常重要,只有这样才像一个优秀团队开发的产品。而且这样方便阅读其他人的代码,便于后期维护。我觉得 Android 源码的可读性很好,风格统一,而在实际项目中经常看到混乱的风格,缩进有的是tab有的是space,命名有的是中文拼音有的是英文,看上去非常的乱。相信大家都喜欢简洁整齐的代码,这就需要团队成员稍微牺牲下个性,遵守统一的规范,自己读起来也赏心悦目。下面我根据自己的一些编码规范和网上的一些资料整理出一套 Android 命名规范,至于编码风格是根据 Google 的提供的 Android code style 略微修改而成,直接在 Android Studio 导入即可, 所以下面主要是介绍命名规范内容。

     

1. Android 命名规范

下面的命名规范,有些是我个人习惯,有不喜欢的地方可以复制后修改即可,做到简单易记就好,便于团队成员遵守。

基本命名方式

  1. 大驼峰命名法(UpperCamelCase):所有单词的第一个字母大写

  2. 小驼峰命名法(lowerCamelCase):除首单词外,其余所有单词的第一个字母大写

  3. 下划线命名法(case1_case2):单词与单词之间用下划线间隔,所有单词小写

一般建议用来命名的单词简单明了,不要用中文拼音,找个词典翻译下还能提高自己英文水平。有些单词可以写成一些约定俗成的缩写,也可以根据团队成员间的约定进行缩写命名。

下面使一些常用的缩写:

  

常用词 缩写
Argument arg
Buffer buf
Clear clr
Clock clk
Compare cmp
Configuration cfg
Context ctx
Delay dly
Device dev
Display disp
Error err
function fnct
Hexadecimal hex
Initialize init
Maximum max
Message msg
Minimum min
multiplex mux
Parameter param
Previous prev
Priority prio
Register reg
Schedule sched
Synchronize sync

类名由一个或多个名词组成,采用大驼峰命名法,把类型作为最后一个单词,其他单词尽量避免缩写,除非是众所周知的,例如 HTML,URL,JSON,XML 等

命名格式 示例
Activity XXX描述 + Activity HomeActivity
Fragment XXX描述 + Fragment ContactsFragment
Service XXX描述 + Service PushService
BroadcastReceiver XXX描述 + Receiver NetworkReceiver
ContentProvider XXX描述 + Provider BookmarkProvider
Adapter XXX描述 + Adapter NewsListAdapter
Bean XXX描述 + Bean PersonBean
基础功能类 Base + XX父类名 BaseActivity
工具类 XXX描述 + Utils BitmapUtils

接口

命名方式和类一致,建议再加上I前缀,表明这是一个接口,与类有所区分,例如:ILoadListener

变量

采用小驼峰命名法,同时我觉得为了更好的区分局部变量,成员变量,静态变量,推荐加一个前缀,android 源码中也是这样的使用的。

(1)成员变量命名之前加m(member),例如mWidth,mHeight;

 (2)静态成员变量命名之前加s(static),例如静态变量 sInstantce

例如,android 开发中经常有控件变量,如 TextView,ImageView 等,推荐命名方式:m+控件类型缩写 + 描述,如登陆按钮命名 mBtnLogin 。 这样可以很清楚知道这是一个Button 控件类型的局部变量,代码也会更加整洁

     下面列出一些常用控件的缩写

控件 缩写
ActionBar ab
LinearLayout ll
RelativeLayout rl
FrameLayout fl
TextView tv
ImageView iv
Button btn
ImageButton imgBtn
RadioButton rdoBtn
ToggleButton tglBtn
CheckBox chk
DatePicker dtPk
TimePicker tmPk
EditText edtTxt
ProgressBar proBar
SeekBar skBar
AutoCompleteTextView autoTxt
VideoView videoVi
WebView webVi
Spinner spn
ScrollView sclVi
ListView lv
GridView gv
RecyclerView rv
    常量

全部大写,同时采用下划线命名法,例如 MAX_THREAD_NUM

   方法

采用小驼峰命名法,一般用动词或动名词

命名格式 说明
initXX() 初始化相关方法,如初始化布局 initLayout()
isXX() 是否满足某些条件,如是否连接WIFI:isWIFIConnected()
processXX() 处理一些数据或过程
showXX() 显示XX信息
hideXX() 隐藏XX信息
saveXX() 保存XX
resetXX() 重置XX
addXX() / insertXX() 添加XX
deleteXX() / removeXX() 删除XX
updateXX() 更新XX
searchXX() / findXX() / queryXX() 查找XX
drawXX() 绘制XX
onXX() 一些状态回调,如加载成功 onLoadSuccess()
资源文件

资源文件的命名基本规则是:类型 + 描述,采用下划线命名法

1.layout  目录下文件命名

 布局文件的命名需要与相应的组件对应,这样方便查找和维护,例如创建一个主页的Activity 布局文件,命名为activity_home.xml

  下面是一些常用的布局命名:

布局类型 命名方式
Activity 的布局 activity_XX
Fragment 的布局 fragment_XX
Dialog 的布局 dialog_XX
可include 的布局 include_XX
RecyclerView 的布局 recycler_item_XX
 2.drawable 命名

Drawable的命名以使用的控件作为前缀,后面再加上描述,中间以下划线分隔开

ActionBar  使用 ab_

Divider 使用 divider_

Icon 使用 ic_

Menu 使用 menu_

Button 使用 btn_login

Drawable 是有多个状态的,也应该在命名中体现出来:

 Normal 对应 _normal 后缀,例如 btn_click_normal.png 

 Pressed 对应 _pressed 后缀

Focused 对应 _focused 后缀

Disable 对应 _disabled 后缀

Selected 对应  _selected后缀

3.Strings 和color 资源文件

也是一样使用下划线命名法,可以按照模块来划分为多个strings 文件,编译打包时会自动把同类文件进行合并

 例如有 moudleA,moudleB,moduleCommon,则分为 strings_module_a, strings_module_b,strings_module_common;

colors资源文件的命名也类似,在文件内部具体某个color值的命名也可以按使用界面作为前缀,例如 主页中分隔线的颜色 命名为 home_fragment_divider 

 控件id

 控件id 采用下划线命名法,全部都是小写。控件的ID的命名我觉得最好与之前控件命名相对应,例如之前登陆的按钮命名为 mBtnLogin,那么对应的ID 命名为 btn_login

在代码中就是 Button mBtnLogin = (Button) findViewById(R.id.btn_login);  非常清晰明了

 2.Android 编码风格

编码风格的话,当然以Google 官方推荐的为标准,想要了解详细规则的请看 Android Code Style。

在实际项目中,团队成员只需要统一的code style 即可,Google Android 团队使用的文件是AndroidStyle.xml ,也可以直接使用我的 code style ,在官方的风格上稍微修改了一下,AndroidStyle.xml

<code_scheme name="AndroidStyle">
  <option name="AUTODETECT_INDENTS" value="false" />
  <option name="JAVA_INDENT_OPTIONS">
  <value>
  <option name="INDENT_SIZE" value="4" />
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  <option name="TAB_SIZE" value="4" />
  <option name="USE_TAB_CHARACTER" value="false" />
  <option name="SMART_TABS" value="false" />
  <option name="LABEL_INDENT_SIZE" value="0" />
  <option name="LABEL_INDENT_ABSOLUTE" value="false" />
  <option name="USE_RELATIVE_INDENTS" value="false" />
  </value>
  </option>
  <option name="FIELD_NAME_PREFIX" value="m" />
  <option name="STATIC_FIELD_NAME_PREFIX" value="s" />
  <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
  <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="9999" />
  <option name="IMPORT_LAYOUT_TABLE">
  <value>
  <package name="com.google" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="com" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="junit" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="net" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="org" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="android" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="java" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="javax" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="" withSubpackages="true" static="false" />
  <emptyLine />
  <package name="" withSubpackages="true" static="true" />
  </value>
  </option>
  <option name="RIGHT_MARGIN" value="100" />
  <option name="JD_P_AT_EMPTY_LINES" value="false" />
  <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
  <option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
  <option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
  <option name="JD_KEEP_EMPTY_RETURN" value="false" />
  <option name="JD_PRESERVE_LINE_FEEDS" value="true" />
  <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
  <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
  <option name="BLANK_LINES_AROUND_FIELD" value="1" />
  <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
  <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
  <option name="ALIGN_MULTILINE_FOR" value="false" />
  <option name="CALL_PARAMETERS_WRAP" value="1" />
  <option name="METHOD_PARAMETERS_WRAP" value="1" />
  <option name="EXTENDS_LIST_WRAP" value="1" />
  <option name="THROWS_LIST_WRAP" value="1" />
  <option name="EXTENDS_KEYWORD_WRAP" value="1" />
  <option name="THROWS_KEYWORD_WRAP" value="1" />
  <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
  <option name="BINARY_OPERATION_WRAP" value="1" />
  <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
  <option name="TERNARY_OPERATION_WRAP" value="1" />
  <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
  <option name="FOR_STATEMENT_WRAP" value="1" />
  <option name="ARRAY_INITIALIZER_WRAP" value="1" />
  <option name="ASSIGNMENT_WRAP" value="1" />
  <option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" />
  <option name="WRAP_COMMENTS" value="true" />
  <option name="IF_BRACE_FORCE" value="3" />
  <option name="DOWHILE_BRACE_FORCE" value="3" />
  <option name="WHILE_BRACE_FORCE" value="3" />
  <option name="FOR_BRACE_FORCE" value="3" />
  <AndroidXmlCodeStyleSettings>
  <option name="USE_CUSTOM_SETTINGS" value="true" />
  <option name="LAYOUT_SETTINGS">
  <value>
  <option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" />
  </value>
  </option>
  <option name="MANIFEST_SETTINGS">
  <value>
  <option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" />
  </value>
  </option>
  <option name="OTHER_SETTINGS">
  <value>
  <option name="INSERT_LINE_BREAK_AFTER_LAST_ATTRIBUTE" value="true" />
  </value>
  </option>
  </AndroidXmlCodeStyleSettings>
  <XML>
  <option name="XML_ATTRIBUTE_WRAP" value="2" />
  <option name="XML_KEEP_BLANK_LINES" value="1" />
  <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
  </XML>
  <ADDITIONAL_INDENT_OPTIONS fileType="css">
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </ADDITIONAL_INDENT_OPTIONS>
  <ADDITIONAL_INDENT_OPTIONS fileType="js">
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </ADDITIONAL_INDENT_OPTIONS>
  <ADDITIONAL_INDENT_OPTIONS fileType="jsp">
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </ADDITIONAL_INDENT_OPTIONS>
  <ADDITIONAL_INDENT_OPTIONS fileType="sql">
  <option name="INDENT_SIZE" value="2" />
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </ADDITIONAL_INDENT_OPTIONS>
  <ADDITIONAL_INDENT_OPTIONS fileType="yml">
  <option name="INDENT_SIZE" value="2" />
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </ADDITIONAL_INDENT_OPTIONS>
  <codeStyleSettings language="Groovy">
  <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
  <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
  <option name="BLANK_LINES_AROUND_FIELD" value="1" />
  <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
  <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
  <option name="ALIGN_MULTILINE_FOR" value="false" />
  <option name="CALL_PARAMETERS_WRAP" value="1" />
  <option name="METHOD_PARAMETERS_WRAP" value="1" />
  <option name="EXTENDS_LIST_WRAP" value="1" />
  <option name="THROWS_LIST_WRAP" value="1" />
  <option name="EXTENDS_KEYWORD_WRAP" value="1" />
  <option name="THROWS_KEYWORD_WRAP" value="1" />
  <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
  <option name="BINARY_OPERATION_WRAP" value="1" />
  <option name="TERNARY_OPERATION_WRAP" value="1" />
  <option name="FOR_STATEMENT_WRAP" value="1" />
  <option name="ASSIGNMENT_WRAP" value="1" />
  <option name="IF_BRACE_FORCE" value="3" />
  <option name="WHILE_BRACE_FORCE" value="3" />
  <option name="FOR_BRACE_FORCE" value="3" />
  <option name="PARENT_SETTINGS_INSTALLED" value="true" />
  </codeStyleSettings>
  <codeStyleSettings language="JAVA">
  <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
  <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
  <option name="BLANK_LINES_AROUND_FIELD" value="1" />
  <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
  <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
  <option name="ALIGN_MULTILINE_FOR" value="false" />
  <option name="CALL_PARAMETERS_WRAP" value="1" />
  <option name="METHOD_PARAMETERS_WRAP" value="1" />
  <option name="EXTENDS_LIST_WRAP" value="1" />
  <option name="THROWS_LIST_WRAP" value="1" />
  <option name="EXTENDS_KEYWORD_WRAP" value="1" />
  <option name="THROWS_KEYWORD_WRAP" value="1" />
  <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
  <option name="BINARY_OPERATION_WRAP" value="1" />
  <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
  <option name="TERNARY_OPERATION_WRAP" value="1" />
  <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
  <option name="FOR_STATEMENT_WRAP" value="1" />
  <option name="ARRAY_INITIALIZER_WRAP" value="1" />
  <option name="ASSIGNMENT_WRAP" value="1" />
  <option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" />
  <option name="IF_BRACE_FORCE" value="3" />
  <option name="DOWHILE_BRACE_FORCE" value="3" />
  <option name="WHILE_BRACE_FORCE" value="3" />
  <option name="FOR_BRACE_FORCE" value="3" />
  <option name="PARENT_SETTINGS_INSTALLED" value="true" />
  <indentOptions>
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </indentOptions>
  <arrangement>
  <groups>
  <group>
  <type>GETTERS_AND_SETTERS</type>
  <order>KEEP</order>
  </group>
  <group>
  <type>OVERRIDDEN_METHODS</type>
  <order>KEEP</order>
  </group>
  </groups>
  </arrangement>
  </codeStyleSettings>
  <codeStyleSettings language="JavaScript">
  <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
  <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
  <option name="BLANK_LINES_AROUND_FIELD" value="1" />
  <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
  <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
  <option name="ALIGN_MULTILINE_FOR" value="false" />
  <option name="CALL_PARAMETERS_WRAP" value="1" />
  <option name="METHOD_PARAMETERS_WRAP" value="1" />
  <option name="EXTENDS_LIST_WRAP" value="1" />
  <option name="THROWS_LIST_WRAP" value="1" />
  <option name="EXTENDS_KEYWORD_WRAP" value="1" />
  <option name="THROWS_KEYWORD_WRAP" value="1" />
  <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
  <option name="BINARY_OPERATION_WRAP" value="1" />
  <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
  <option name="TERNARY_OPERATION_WRAP" value="1" />
  <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
  <option name="FOR_STATEMENT_WRAP" value="1" />
  <option name="ARRAY_INITIALIZER_WRAP" value="1" />
  <option name="ASSIGNMENT_WRAP" value="1" />
  <option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="true" />
  <option name="WRAP_COMMENTS" value="true" />
  <option name="IF_BRACE_FORCE" value="3" />
  <option name="DOWHILE_BRACE_FORCE" value="3" />
  <option name="WHILE_BRACE_FORCE" value="3" />
  <option name="FOR_BRACE_FORCE" value="3" />
  <option name="PARENT_SETTINGS_INSTALLED" value="true" />
  </codeStyleSettings>
  <codeStyleSettings language="XML">
  <indentOptions>
  <option name="CONTINUATION_INDENT_SIZE" value="4" />
  </indentOptions>
  </codeStyleSettings>
  </code_scheme>

导入 Code Style

Mac环境下, Android Studio -> Preferences -> Editor -> Code Style -> 点击 Manage.. -> 在弹框中点击 Import 选择下载的 AndroidStyle.xml 文件即可, 其他环境下也类似。

一开始大家的格式肯定会有不统一的时候,特别是之前的代码,可以按重新格式代码的快捷键调整格式,在 Preferences -> Keymap -> 右侧搜索框输入 reformat -> 下面 Reformat Code 对应的快捷键就是了。一般 Mac 下默认的快捷键为 Alt + Command + L 。


 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值