参考:《app研发录》
代码是程序员的第二张脸。每一个程序员在嘲讽别人的代码的同时,有没有想过自己的代码也会成为别人的谈资呢?
制定规范不需要太多的理论知识,只要记住两点就够了:尽量简单,多写注释。
Android命名规范
命名规范有以下几点需要注意:
命名不能反人类
例如:PersonActivityAddCustomer.java
所有的Activity全部是上述这种“模块名+Activity+页面名”的命名方式要望文而知义,清晰准确
比如说登录页面的登录按钮,命名时就不要想button1这样随心所欲,要类似于login_button(资源文件)或btnLogin(java代码中的按钮实例)这样命名。此外,,遇到MyGridView之类的命名,就可以把创建文件的同学拖出去打80大板了,而且要肚皮朝上的那种打法。
具体的规则:
-
java类文件命名的规则
Activity的命名:以Activity作为后缀。比如说PersonActivity
Adapter的命名:以Adapter作为后缀。比如说PersonAdapter
Entity的命名:大多以Entity作为后缀。比如说PersonEntity。值得注意的是,user是全局变量,不算实体,不受约束。 资源文件命名规范
页面布局文件。注意都是小写。person模块下的AddCustomerActivity–>act_person_addcustomer.xml
ListView中的item布局文件。以item_作为固定前缀,列表项的名称作为后缀。例如:某个页面下有一个用户列表,空间名为lvUserList–>item_lvuserlist.xml
Dialog布局文件。以dlg_作为固定前缀,Dialog的功能名作为后缀。例如:dlg_hint.xmldrawable目录下文件命名–大部分图片、xml文件,用于selector
对于只在一个页面使用的资源,就以该页面的名称作为前缀
对于只在一个模块下的多个页面使用的资源,就以该模块的名称作为前缀。
对于在各个模块、各个页面都有可能使用的资源,比如说上导航、下导航,以common作为前缀Java类中控件对象的命名
控件类缩写+控件的逻辑名称(首字母大写),比如登录按钮,就可以命名为btnLoginLayout中控件的命名
btnLogin –> btn_loginstring.xml中常量的命名
layout中的控件使用,以该常量所在activity名做前缀,后面接控件名称,在后面*发挥。登录页面的按钮上显示的文字–>loginActivity_btnLogin_text.
java代码中使用,可能activity中也可能工具类Utils中,规则和上面一样。如果涉及和公共模块控件相关,就以common_作为后缀
strings.xml:可以按照模块拆分成多个strings文件
values
–>strings_module_a.xml
–>strings_module_b.xml
编译打包时会自动将同类文件进行合并。
好处:各个模块维护各自的strings.xml。但常量命名时一定要以模块名作为前缀,不然容易产生重命名的情况,从而编译出错。- 常量
包含字母和下划线,单词之间用下划线_隔开,字母全部大写
android编码规范
要分门别类存放各种类
-
Layout中的常量,要在资源strings.xml中定义
<TextViwe android:text="评论" ····/>
要将“评论”这个常量定义在strings.xml中:
<resources>
<string name="tvPersonCenter">评论</string>
</resources>然后在Layout布局文件中@string/调用
Activity中的设置的一些变量,不能写死,要定义在strings.xml中,然后从着资源文件中取值String loadingMessage = this.getString(R.string.loadingmessage);
-
Layout中所有控件的字体大小,都定义在dimens.xml中,它相当于网站的CSS样式表
<?xml version="1.0" encoding="utf-8"?>
<resouces>
<!--定义字体-->
<dimen name="font_size_tiny">10sp</dimen>
<dimen name="font_size_samll">12sp</dimen>
<dimen name="font_size_normal">140sp</dimen>
<dimen name="font_size_normal_high">16sp</dimen>
<dimen name="font_size_larger">18sp</dimen>
<dimen name="font_size_larger_high">20sp</dimen>
<dimen name="font_size_xlarger">22sp</dimen>
<!--边距-->
<dimen name="offset_2dp">2dp</dimen>
<dimen name="offset_4dp">4dp</dimen>
<dimen name="offset_6dp">6dp</dimen>
</resouces>使用方法:
<TextViwe android:textSize="@dimen/font_size_normal" ····/>
对于所有控件的Margin偏移量,也需要统一规格,如上面的dimens.xml中定义,有若干尺寸事先定义好供选择
好处:稍微修改一下dimens.xml中的定义,就可以批量修改样式
做得更彻底,使用style来统一控件风格。如有必要,请用之 -
在activity中,定义新的生命周期,从而将onCreate方法拆分为一下3部分
initVariables:初始化变量(包括Intent上的数据和Activity内部使用的变量)。
initView:加载layout布局文件,初始化控件。
loadData:调用MobieAPI
拆分onCreate方法是设计模式中单一职责原则的体现
坚持使用fastJson自定义实体来作为MobileAPI的数据载体
像JSONObject、JSONArray、HashMap<~,Objiect>、ArrayList<~,Objiect>这些不能序列化的实体,都禁止使用。除非它们仅仅是为了实现某个算法,在方法类部临时使用。实体自动化工具EntityGenerator。页面之间传值,坚持使用Intent携带序列化实体数据的方式。禁止为了省事使用全局变量进行传值的方式。
Activity中不要嵌套内部类,尽量独立出来,该放哪儿放哪儿
-
Adaper中的编码规范如下
所有的Adaper,都放在adapter这个包中。
Adapter绑定的数据,一律为ArrayList<自定义可序列化实体>
在Adapter中创建合适与列表自身的ViewHolder实体类。统一命名为ViewHolder
实体不要在不同模块间共享,但是可以在同一模块下的不同页面间共享。比如说,不要在美食模块和酒店模块共用一个实体,但是在美食模块的列表页和详情页,可以共用同意个实体。
为节省内存,请使用ArrayList<自定以实体类>,而不是HashMap.
ArrayList虽然慢一点,每次查找一个元素,都是o(n),而HashMap则o(l),但是ArrayList在内存的使用上要少于HashMap.对于android手机,尤其是配置很低的手机,我们开发App策略是尽量不占太多内存,所以请选择ArrayList<自定以实体类>。图片的处理,请统一使用第三方组件ImageLoader或Fresco来进行异步加载。
什么时候使用SharedPerferences?对于简单的配置信息,设置页面的各种开关,这些都是要保存在SharedPerferences中的。对于复杂的对象,比如说User类,比如说城市基础数据,这些数据还是要存储到本地文件中。
尽量使用ApplicationContext代替Context,否则会引起内存泄漏。当然也不是任何地方ApplicationContext都可以代替Context。
数据类型转换一定要进行校验
使用常量代替枚举。众所周知,枚举的每个值只能是一个整数,而没有toString这样的方法,所以不如在类中定义一个字符串常量方便。