android命名规范和编码规范

时间:2021-01-23 20:06:01

参考:《app研发录》


代码是程序员的第二张脸。每一个程序员在嘲讽别人的代码的同时,有没有想过自己的代码也会成为别人的谈资呢?
制定规范不需要太多的理论知识,只要记住两点就够了:尽量简单,多写注释。

Android命名规范

命名规范有以下几点需要注意:

  • 命名不能反人类
    例如:PersonActivityAddCustomer.java
    所有的Activity全部是上述这种“模块名+Activity+页面名”的命名方式

  • 要望文而知义,清晰准确
    比如说登录页面的登录按钮,命名时就不要想button1这样随心所欲,要类似于login_button(资源文件)或btnLogin(java代码中的按钮实例)这样命名。

  • 此外,,遇到MyGridView之类的命名,就可以把创建文件的同学拖出去打80大板了,而且要肚皮朝上的那种打法。

具体的规则:

  1. java类文件命名的规则

    Activity的命名:以Activity作为后缀。比如说PersonActivity
    Adapter的命名:以Adapter作为后缀。比如说PersonAdapter
    Entity的命名:大多以Entity作为后缀。比如说PersonEntity。值得注意的是,user是全局变量,不算实体,不受约束。

  2. 资源文件命名规范
    页面布局文件。注意都是小写。person模块下的AddCustomerActivity–>act_person_addcustomer.xml
    ListView中的item布局文件。以item_作为固定前缀,列表项的名称作为后缀。例如:某个页面下有一个用户列表,空间名为lvUserList–>item_lvuserlist.xml
    Dialog布局文件。以dlg_作为固定前缀,Dialog的功能名作为后缀。例如:dlg_hint.xml

  3. drawable目录下文件命名–大部分图片、xml文件,用于selector
    对于只在一个页面使用的资源,就以该页面的名称作为前缀
    对于只在一个模块下的多个页面使用的资源,就以该模块的名称作为前缀。
    对于在各个模块、各个页面都有可能使用的资源,比如说上导航、下导航,以common作为前缀

  4. Java类中控件对象的命名
    控件类缩写+控件的逻辑名称(首字母大写),比如登录按钮,就可以命名为btnLogin

  5. Layout中控件的命名
    btnLogin –> btn_login

  6. string.xml中常量的命名
    layout中的控件使用,以该常量所在activity名做前缀,后面接控件名称,在后面*发挥。登录页面的按钮上显示的文字–>loginActivity_btnLogin_text.
    java代码中使用,可能activity中也可能工具类Utils中,规则和上面一样。如果涉及和公共模块控件相关,就以common_作为后缀
    strings.xml:可以按照模块拆分成多个strings文件
    values
    –>strings_module_a.xml
    –>strings_module_b.xml
    编译打包时会自动将同类文件进行合并。
    好处:各个模块维护各自的strings.xml。但常量命名时一定要以模块名作为前缀,不然容易产生重命名的情况,从而编译出错。

  7. 常量
    包含字母和下划线,单词之间用下划线_隔开,字母全部大写

android编码规范

  1. 要分门别类存放各种类

  2. 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);
  3. 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来统一控件风格。如有必要,请用之

  4. 在activity中,定义新的生命周期,从而将onCreate方法拆分为一下3部分

    1. initVariables:初始化变量(包括Intent上的数据和Activity内部使用的变量)。

    2. initView:加载layout布局文件,初始化控件。

    3. loadData:调用MobieAPI

    拆分onCreate方法是设计模式中单一职责原则的体现

  5. 坚持使用fastJson自定义实体来作为MobileAPI的数据载体
    像JSONObject、JSONArray、HashMap<~,Objiect>、ArrayList<~,Objiect>这些不能序列化的实体,都禁止使用。除非它们仅仅是为了实现某个算法,在方法类部临时使用。实体自动化工具EntityGenerator。

  6. 页面之间传值,坚持使用Intent携带序列化实体数据的方式。禁止为了省事使用全局变量进行传值的方式。

  7. Activity中不要嵌套内部类,尽量独立出来,该放哪儿放哪儿

  8. Adaper中的编码规范如下

    1. 所有的Adaper,都放在adapter这个包中。

    2. Adapter绑定的数据,一律为ArrayList<自定义可序列化实体>

    3. 在Adapter中创建合适与列表自身的ViewHolder实体类。统一命名为ViewHolder

  9. 实体不要在不同模块间共享,但是可以在同一模块下的不同页面间共享。比如说,不要在美食模块和酒店模块共用一个实体,但是在美食模块的列表页和详情页,可以共用同意个实体。

  10. 为节省内存,请使用ArrayList<自定以实体类>,而不是HashMap.
    ArrayList虽然慢一点,每次查找一个元素,都是o(n),而HashMap则o(l),但是ArrayList在内存的使用上要少于HashMap.对于android手机,尤其是配置很低的手机,我们开发App策略是尽量不占太多内存,所以请选择ArrayList<自定以实体类>。

  11. 图片的处理,请统一使用第三方组件ImageLoader或Fresco来进行异步加载。

  12. 什么时候使用SharedPerferences?对于简单的配置信息,设置页面的各种开关,这些都是要保存在SharedPerferences中的。对于复杂的对象,比如说User类,比如说城市基础数据,这些数据还是要存储到本地文件中。

  13. 尽量使用ApplicationContext代替Context,否则会引起内存泄漏。当然也不是任何地方ApplicationContext都可以代替Context。

  14. 数据类型转换一定要进行校验

  15. 使用常量代替枚举。众所周知,枚举的每个值只能是一个整数,而没有toString这样的方法,所以不如在类中定义一个字符串常量方便。