zoukankan      html  css  js  c++  java
  • 旗鱼移动Android开发规范

     

    旗鱼移动Android开发规范

    撰写:     旗鱼移动Android开发组     

     

     

     

     

     

     

     

    旗鱼移动科技有限公司所属,未经允许不得私自传播

     

     

     

     

                                                          第1版

    2016年 5 月 3 日

     

     


     

     

     

     

    目录

     

    一、Android开发框架

    二、命名规范

      2.1 包(packages)命名规范

      2.2 类(classes)命名规范

      2.3 方法methods)

      2.4 变量(variables)

      2.5 常量(Constants)

      2.6 资源文件(图片drawable文件夹下)

      2.7 资源布局文件(XML文件(layout布局文件))

      2.8 资源布局文件layout中的id命名

    三、代码规范

      3.1 排版

      3.2 注释

    四、XML规范

     

     



    一、Android开发框架

      旗鱼移动Android开发项目统一采用公司Android开发框架。

    二、命名规范

    2.1 包(packages)命名规范

      采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为qiyu,三级包名根据应用进行命名,四级包名为模块名或层级名等。

    包名

    此包中包含

    com.qiyu.应用名称缩写.ui.activity

    页面用到的Activity类 (activities层级名用户界面层)

    com.qiyu.应用名称缩写.ui.fragment

    页面用到的Fragment

    com.qiyu.应用名称缩写.adapter

    页面用到的Adapter类 (适配器的类)

    com.qiyu.应用名称缩写.utils/tools

    此包中包含:公共工具方法类(utils/tools模块名)

    com.qiyu.应用名称缩写.response.data

    网络请求返回response层级1

    com.qiyu.应用名称缩写.response.bean

    网络请求返回response层级2

    com.qiyu.应用名称缩写.response.entity

    网络请求返回response层级3

    com.qiyu.应用名称缩写.bean/entity

    此包中包含:元素类

    com.qiyu.应用名称缩写.db

    数据库操作类

    com.qiyu.应用名称缩写.view

    自定义的View类等

    com.qiyu.应用名称缩写.XXXX

    其他定义的包名

     

     

    2.2 类(classes命名规范

      采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的,  比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

     

    描述

    Activity 类

    Activity为后缀标识

    欢迎页面类WelcomeActivity

    Adapter类

    Adapte 为后缀标识

    新闻详情适配器NewDetailAdapter

    解析类

    Data整体后缀标识二层析类Bean为后缀标识,三层为Entity。

    首页解析类HomePosterData

    公共方法类

    Utils、Tools或Manager为后缀标识灵活运用

    线程池管理类:ThreadPoolManager 

    日志工具类:旗鱼点餐中为L

    Service类

    以Service为后缀标识

    时间服务TimeService

    BroadcastReceive类

    以Receiver为后缀标识

    时间通知TimeReceiver

    ContentProvider

    以Provider为后缀标识

    时间共享TimeProvider

    直接写的共享基础类

    以Base开头

    BaseActivity,BaseFragment

    ............

    ............

    .............

     

    2.3 方法methods)

      动词或动名词,采用小驼峰命名法例如:onCreate(),run()自定义方法定义为private ,特别需要例外。

    方法

    说明

    initXX()

    初始化相关方法,使用init为前缀标识,如初始化布局initView()

    isXX()

    checkXX()方法返回值为boolean型的请使用is或check为前缀标识有时必须以get开头,如数据库类里。

    getXX()

    返回某个值的方法,使用get为前缀标识

    processXX()

    对数据进行处理的方法,尽量使用process为前缀标识

    displayXX()

    弹出提示框和提示信息,使用display为前缀标识

    saveXX()

    与保存数据相关的,使用save前缀标识

    resetXX()

    对数据重组的,使用reset前缀标识

    clearXX()

    清除数据相关的

    removeXXX()

    清除数据相关的

    drawXXX()

    绘制数据或效果相关的,使用draw前缀标识

    initXX()

    初始化相关方法,使用init为前缀标识,如初始化布局initView()

    ..........

    .....................

     

     

    2.4 变量(variables)

      采用小驼峰命名法。类中控件名称必须与xml布局id保持一致。

      用统一的量词通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
    量词列表:量词后缀说明
    First   一组变量中的第一个
    Last   一组变量中的最后一个
    Next  一组变量中的下一个变量
    Pre   一组变量中的上一个
    Cur   一组变量中的当前变量

    ......   .................

    2.5 常量(Constants)

      全部大写,采用下划线命名法.例如:MIN_WIDTH

    2.6 资源文件(图片drawable文件夹下)

      全部小写,采用下划线命名法,加前缀区分图片命名遵守图片命名规范,如有多种形态如按钮,则命名方式如 bt_功能名_xx.selector(操作).xml等

    图片文件名后缀

    状态说明

    _normal

    (default state)

    _pressed

    state_pressed

    _focused

    state_focused

    _disabled

    state_enabled (false)

    _checked

    state_checked

    _selected

    state_selected

    _hovered

    state_hovered

    _checkable

    state_checkable

    _activated

    state_activated

    _windowfocused

    state_window_focused

    2.7 资源布局文件(XML文件(layout布局文件))

      全部小写,采用下划线命名法

    模块

    命名规则

    示例

    Activity

    activity_功能模块_xx.xml

    activity_main.xmlactivity_order_detail.xml

    Fragment

    fragment_功能模块_xx.xml

    fragment_head.xml

    Dialog

    dialog_描述_xx.xml

    dialog_hint.xml

    PopupWindow

    ppw_描述_xx.xml

    ppw_info.xml

    包含项include

    include_模块_xx.xml

    include_head.xml

    adapter的子布局

    item_功能模块_xx.xml

    item_main.xml

    .........

    ...........

    ................

     

    2.8 资源布局文件layout中的id命名

      命名模式为:view缩写_view的逻辑名称_XX。如tv_name,tv_name_label。

      View缩写使用view中每个大写字母组合拼成小写,如TextView写成tv即可。

      View的缩写详情示例如下:

    控件

    命名缩写示例

    TextView

    tv

    EditText

    et

    ImageView

    iv

    Button

    bt

    LinearLayout

    ll

    RelativeLayout

    rl

    RecycleView

    rv

    .........

    ...........

     

    三、代码规范

    3.1 排版

    3.1.1 程序块要采用缩进风格编写,缩进的空格数为4个。

      说明:对于由开发工具自动生成的代码可以有不一致。

    3.1.2 编程语句长度设置成160个字符(非必须)。

    3.1.3 不允许把多个短语句写在一行中,即一行只写一条语句。

      示例:如下例子不符合规范。

      rect.length = 0; rect.width = 0;

      应如下书写

    rect.length = 0;
      rect.width = 0;

     

    3.1.4 if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。

    示例:如下例子不符合规范。
        if (pUserCR == NULL) return;


        应如下书写:
        if (pUserCR == NULL)
        {
           return;
        }

    3.1.5 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格, case语句下的情况处理语句也要遵从语句缩进要求。

    3.1.6 程序块的分界符(如大括号‘ {’和‘ }’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、 for、 do、 while、 switch、 case语句中的程序都要采用如上的缩进方式。

    示例:如下例子不符合规范。


        for (...) {
           ... // program code
        }


        if (...)
          {
          ... // program code
          }

     

      void example_fun( void )
      {
      ... // program code
      }

     

    应书写如下。

     

      for (...)
      {
        ... // program code
      }


      if (...)
      {
        ... // program code
      }


      void example_fun( void )
      {
        ... // program code
      }

     

    3.1.7 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

      说明:采用这种松散方式编写代码的目的是使代码更加清晰。
    由于留空格所产生的清晰性是相对的, 所以, 在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格, 多重括号间不必加空格,因为在 C/C++语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

      示例:

      (1) 逗号、分号只在后面加空格。
       int a, b, c;

     

      (2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、 "%",逻辑操作符"&&"、"&",位域操作符"<<"、 "^"等双目操作符的前后加空格。
      if (current_time >= MAX_TIME_VALUE)
      a = b + c;
      a *= 2;
      a = b ^ 2;

     

      (3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
      flag = !isEmpty;   // 非操作"!"与内容之间
      p = &mem;     // 地址操作"&" 与内容之间
      i++;        // "++","--"与内容之间

     

    (4) if、 for、 while、 switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显。
    if (a >= b && c > d)

     

     

     

     

     

    3.2 注释

    3.2.1 一般情况下,源程序有效注释量必须在20%以上。

      说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

    3.2.2 说明性文件(如.java文件)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

      示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

      /*************************************************
      Copyright (C), 2015-2016nizwo Tech. Co., Ltd.
      File name: // 文件名
      Author: Version: Date: // 作者、版本及完成日期
      Description: // 用于详细说明此程序文件完成的主要功能,与其他模块
      // 或函数的接口,输出值、取值范围、含义及参数间的控
      // 制、顺序、独立或依赖等关系
      Others: // 其它内容的说明
      Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明
        1. ....
      History: // 修改历史记录列表,每条修改记录应包括修改日期、修改
         // 者及修改内容简述
      1. Date:
       Author:
          Modification:
      2. ...
      *************************************************/

     

      说明: Description 一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。 History 是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。

    3.2.3 函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。

      示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。


      /*************************************************
      Function: // 函数名称
      Description: // 函数功能、性能等的描述
      Calls: // 被本函数调用的函数清单
      Called By: // 调用本函数的函数清单
      Table Accessed:// 被访问的表(此项仅对于牵扯到数据库操作的程序)
      Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
      Input: // 输入参数说明,包括每个参数的作用、取值说明及参// 数间关系。
      Output: // 对输出参数的说明。
      Return: // 函数返回值的说明
      Others: // 其它说明
      *************************************************/

    3.2.4 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。

    3.2.5 注释的内容要清楚、明了,含义准确,防止注释二义性。

      说明:错误的注释不但无益反而有害。

    3.2.6 避免在注释中使用缩写,特别是非常用缩写。

      说明:在使用缩写时或之前,应对缩写进行必要的说明。

    3.2.7 对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。

      说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。

    3.2.8 避免在一行代码或表达式的中间插入注释。

      说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。

    3.2.9 注释格式尽量统一,建议使用“ /* …… */”类或方法名注释使用/**.......*/

     

    3.2.10 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

      示例:如下例子不符合规范。

      例 1:
      /* get replicate sub system index and net indicator */


      repssn_ind = ssn_data[index].repssn_index;
      repssn_ni = ssn_data[index].ni;


      例 2:
      repssn_ind = ssn_data[index].repssn_index;
      repssn_ni = ssn_data[index].ni;
      /* get replicate sub system index and net indicator */


      应如下书写
      /* get replicate sub system index and net indicator */
      repssn_ind = ssn_data[index].repssn_index;
      repssn_ni = ssn_data[index].ni;

     

    3.2.11 将注释与其上面的代码用空行隔开。


      示例:如下例子,显得代码过于紧凑。
      /* code one comments */
      program code one
      /* code two comments */
      program code two


      应如下书写
      /* code one comments */
      program code one


      /* code two comments */
      program code two

    3.2.12 注释与所描述内容进行同样的缩排。

      说明:可使程序排版整齐,并方便注释的阅读与理解。


      示例:如下例子,排版不整齐,阅读稍感不方便。

      void example_fun( void )
      {
      /* code one comments */
      CodeBlock One

    /* code two comments */
      CodeBlock Two

       }

      应改为如下布局。

      void example_fun( void )
      {
        /* code one comments */
        CodeBlock One


        /* code two comments */
        CodeBlock Two
      }

    3.2.13 在代码的功能、意图层次上进行注释,提供有用、额外的信息。

      说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。

      示例:如下注释意义不大。

      /* if receive_flag is TRUE */
      if (receive_flag)

      而如下的注释则给出了额外有用的信息。 
      /* if mtp receive a message from links */
      if (receive_flag)

     

     

     

    3.3 变量、结构

    3.3.1 去掉没必要的公共变量。

      说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。

    3.3.2 仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。

      说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。

    3.3.3 当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。

      说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。

    3.3.4 防止局部变量与公共变量同名。

      说明:若使用了较好的命名规则,那么此问题可自动消除。

    3.3.5 严禁使用未经初始化的变量作为右值。

      说明:引用未经赋值的变量,经常会引起系统崩溃。

    3.3.6 结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。

      说明:软件向前兼容的特性,是软件产品是否成功的重要标志之一。如果要想使产品具有较好的前向兼容,那么在产品设计之初就应为以后版本升级保留一定余地,并且在产品升级时必须考虑前一版本的各种特性。

    3.3.7 编程时,要注意数据类型的强制转换。

      说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。

    3.3.8 尽量减少没有必要的数据类型默认转换与强制转换。

    3.3.9 合理地设计数据并使用自定义数据类型,避免数据间进行不必要类型转换。

     

    四、XML规范

    4.1 布局

    4.1.1 避免过多嵌套

      说明:嵌套的 LinearLayout 可能会使得 View 的层级结构很深。使用LinearLayout时,通常我们喜欢用嵌套的布局来动态设置一个View的Visibility ,由于LinearLayout是线性的,因此即使隐藏一个View也不会影响到其它View的排列。而在RelativeLayout中,View的位 置都是相对于其它View的,因此,隐藏之后,会导致之前的View没有参考对象了,导致的相对位置改变,这时你可以使用 alignWithParentIfMissing=”true”来处理这种情况。

    此外,嵌套使用了 layout_weight 参数的 LinearLayout 的计算量会尤其大,因为每个子元素都需要被测量两次。这对需要多次重复 inflate 的 Layout 尤其需要注意,比如使用 ListView 或 GridView 时。

    示例:如下布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"/>
    </RelativeLayout>

    可以直接写成如下布局

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello World!"/>

    4.2 控件

    4.2.1 控件中避免使用drawableLeftdrawableRightdrawableXXXXX。

      说明:使用这种标志在控件中绘制图片,导致图片大小不可控制,将产生严重的屏幕适配问题。

    4.2.2 ImageView控件必须明确控制其大小,除非是适应屏幕宽或高,即只能使用match_parent或者明确值,如35dp、35px。

      说明:ImageView不明确设定大小,而采用wrap_content,则产生严重的屏幕适配问题。

    4.3.3 控件中使用background属性,且值引用图片,则控件必须明确控制其大小,除非是适应屏幕宽或高,即只能使用match_parent或者明确值,如35dp、35px。

      说明:不明确设定大小,而采用wrap_content,则产生严重的屏幕适配问题。

    4.3.4 控件设定明确的值大小,必须引用项目框架提供的值。

      说明:不引用项目提供的数据值,而使用自己设定的值如30sp、30dp、30px等,则产生严重的屏幕适配问题。

    4.3.5 可以灵活使用控件,如TextView可以当做Button来使用。

  • 相关阅读:
    PHP 获取当前url的函数及参数
    PHP 和 AJAX responseXML 实例
    PHP 和 AJAX 投票
    AJAX技术在PHP开发中的简单应用
    摄影教程
    结合 Ajax 进行 PHP 开发
    CSS 格式验证器
    swfobject.js,这个JS究竟有什么作用呢
    PHP中Date获取时间不正确怎么办
    用来给不愿意用iframe的同志的页面引用的解决办法
  • 原文地址:https://www.cnblogs.com/springl/p/8715259.html
Copyright © 2011-2022 走看看