初见

提4点Android代码规范

2017-04-21  本文已影响38人  King4Ghost

前言

良好的规范,就像军队纪律。
所谓,没有规矩,不成方圆。

在编程中也是一样的,良好的代码规范总是能给人赏心悦目。哪怕读不懂代码,或者写的代码不够优秀,但给保持一个标准的规范也算一种态度。就像书面整洁一样,在高考中还能加分呢。

下面,我们开始修炼吧~

1、缩进、换行:

  1. 缩进 保持==4==个字符。

  2. 换行 有些代码句(语句、条件表达式、方法参数)太长,可选择性换行。我们可规定为 ==>150==字符换行。

    • 条件表达式:以操作符作为换行的开头。如果有多行,则每换一行,比上一行条件表达式的首字符增加缩进==2==字符,成阶梯式,清晰。低优先级操作符处开始换行为宜;信息分组处换行。 即:
    if (isIgnoreRules && hasChangedContent() 
          || mOldCount < mNewCount) {
        // TO-DO         
    }
    
    • 方法参数:
    public static void putData(int newsId, String newsTitle, String newsContent,
                               String from, String to) { 
        // TO-DO   
    }
    
    • {}的换行,特别注意try-catch-finally
    public void queryFromSQLite() {
        try {
            // TO-DO        
        } catch (Exception e) {     
            // cautch excetpion
        } finally {
            // release
        }
    }
    

2 、条件+循环,避免多层嵌套:

  1. 长代码+多层嵌套,在程序块}后加注释标记,便于阅读。
  2. 一个方法里嵌套最好不要超过3层,==最优2层==!
    如:
    public void caculate() {
        if (!isNeedReCaculate) {
            return;
        }
        if (null != mData) {
            Object obj;
            for (int i = 0, size = mData.size(); i < size; i++) {
                obj = mData.get(i);
                if (null == obj) {
                    continue;
                }
                ...
            } // # End of for
        } // # End of (null != mData)
    }
    

3、资源规范

  1. colors.xml:
    忌写:

    <resources>
      <color name="button_foreground">#FFFFFF</color>
      <color name="button_background">#2A91BD</color>
      <color name="comment_background_inactive">#5F5F5F</color>
      <color name="comment_background_active">#939393</color>
      <color name="comment_foreground">#FFFFFF</color>
      <color name="comment_foreground_important">#FF9D2F</color>
      ...
    <resources>
    

    可重用:

    <resources>
    
      <!-- grayscale -->
      <color name="white"     >#FFFFFF</color>
      <color name="gray_light">#DBDBDB</color>
      <color name="gray"      >#939393</color>
      <color name="gray_dark" >#5F5F5F</color>
      <color name="black"     >#323232</color>
    
      <!-- basic colors -->
      <color name="green">#27D34D</color>
      <color name="blue">#2A91BD</color>
      <color name="orange">#FF9D2F</color>
      <color name="red">#FF432F</color>
    
    </resources>
    
  1. string.xml:

  2. layout.xml:

    • id命名模式为:==view缩写模块名逻辑名==,比如 btn_contact_search。同时,java中声明对应的view的命名规则与之反向,即 ==逻辑名_模块名_view缩写==,比如 mSearchContactBtn。再者,这样有一个好处——容易对应,
      如view的声明:
    Button mSearchContactBtn = findViewById(R.id.btn_contact_search);
    

    当然,我个人更喜欢这种格式:
    ==1. view的id命名:模块名_逻辑名_view的缩写==
    ==2. view在java中命名:mView的缩写模块名逻辑名==
    个人觉得这样更好,比如当搜索某个按钮时,你只需键入mBtn然后,IDE就会自动补全提示所有的btn变量。

    Button mBtnSearchContact = findViewById(R.id.contact_search_btn);
    

4、 分包管理

参考Google I/O 2015的代码结构,按功能分包具体可以这样做:

src
└─com
    └─domain
        └─app
            │  AppApplication.java  定义Application类
            │  Config.java          定义配置数据(常量)
            │
            ├─framework
            │      定义interface以及相关基类
            │
            ├─io
            │      数据定义(model)、数据操作(比如json解析,但不包括db操作)
            │
            ├─model
            │      定义model(数据结构以及getter/setter、compareTo、equals等等,不含复杂操作)
            │      以及modelHelper(提供便于操作model的api)
            │
            ├─provider
            │      实现ContentProvider,及其依赖的db操作
            │
            ├─receiver
            │      实现Receiver
            │
            ├─service
            │      实现Service(比如IntentService),用于在独立线程中异步do stuff
            │
            ├─ui
            │      实现BaseActivity,以及自定义view和widget,相关的Adapter也放这里
            │
            ├─util
            │      实现工具类,提供静态方法
            │
            ├─feature1
            │      Item.java                定义model
            │      ItemHelper.java          实现modelHelper
            │      feature1Activity.java    定义UI
            │      feature1DAO.java         私有db操作
            │      feature1Utils.java       私有工具函数
            │      ...其它私有class
            │
            ├─...其它feature

另外,google的sample~iosched:

java
└─com
    └─google
        └─samples
            └─apps
                └─iosched
                    │  AppApplication.java  定义Application类
                    │  Config.java          定义配置数据(常量)
                    │
                    ├─about
                    │      AboutActivity.java
                    │
                    ├─appwidget
                    │      ScheduleWidgetProvider.java
                    │      ScheduleWidgetRemoteViewsService.java
                    │
                    ├─debug
                    │  │  DebugAction.java
                    │  │  DebugActivity.java
                    │  │  DebugFragment.java
                    │  │
                    │  └─actions
                    │          DisplayUserDataDebugAction.java
                    │          ForceAppDataSyncNowAction.java
                    │          ForceSyncNowAction.java
                    │          ...
                    │
                    ├─explore
                    │  │  ExploreIOActivity.java
                    │  │  ExploreIOFragment.java
                    │  │  ExploreModel.java
                    │  │  ...
                    │  │
                    │  └─data
                    │          ItemGroup.java
                    │          LiveStreamData.java
                    │          MessageData.java
                    │          ...
                    │
                    ├─feedback
                    │      FeedbackApiHelper.java
                    │      FeedbackConstants.java
                    │      FeedbackHelper.java
                    │      ...
                    │
                    ├─framework
                    │      FragmentListener.java
                    │      LoaderIdlingResource.java
                    │      Model.java
                    │      ...定义interface并实现
                    │
                    ├─gcm
                    │  │  GCMCommand.java
                    │  │  GCMIntentService.java
                    │  │  GCMRedirectedBroadcastReceiver.java
                    │  │  ...
                    │  │
                    │  └─command
                    │          AnnouncementCommand.java
                    │          NotificationCommand.java
                    │          SyncCommand.java
                    │          ...
                    │
                    ├─io
                    │  │  BlocksHandler.java
                    │  │  HandlerException.java
                    │  │  HashtagsHandler.java
                    │  │  ...处理model
                    │  │
                    │  ├─map
                    │  │  └─model
                    │  │          MapData.java
                    │  │          Marker.java
                    │  │          Tile.java
                    │  │
                    │  └─model
                    │          Block.java
                    │          DataManifest.java
                    │          Hashtag.java
                    │          ...
                    │
                    ├─map
                    │  │  InlineInfoFragment.java
                    │  │  MapActivity.java
                    │  │  MapFragment.java
                    │  │  ...
                    │  │
                    │  └─util
                    │          CachedTileProvider.java
                    │          MarkerLoadingTask.java
                    │          MarkerModel.java
                    │          ...
                    │
                    ├─model
                    │      ScheduleHelper.java
                    │      ScheduleItem.java
                    │      ScheduleItemHelper.java
                    │      ...定义model以及实现model相关操作
                    │
                    ├─myschedule
                    │      MyScheduleActivity.java
                    │      MyScheduleAdapter.java
                    │      MyScheduleFragment.java
                    │      ...
                    │
                    ├─provider
                    │      ScheduleContract.java
                    │      ScheduleContractHelper.java
                    │      ScheduleDatabase.java
                    │      ...实现ContentProvider
                    │      (也在此处定义provider依赖的其它类,比如db操作)
                    │
                    ├─receiver
                    │      SessionAlarmReceiver.java
                    │
                    ├─service
                    │      DataBootstrapService.java
                    │      SessionAlarmService.java
                    │      SessionCalendarService.java
                    │
                    ├─session
                    │      SessionDetailActivity.java
                    │      SessionDetailConstants.java
                    │      SessionDetailFragment.java
                    │      ...
                    │
                    ├─settings
                    │      ConfMessageCardUtils.java
                    │      SettingsActivity.java
                    │      SettingsUtils.java
                    │
                    ├─social
                    │      SocialActivity.java
                    │      SocialFragment.java
                    │      SocialModel.java
                    │
                    ├─sync
                    │  │  ConferenceDataHandler.java
                    │  │  RemoteConferenceDataFetcher.java
                    │  │  SyncAdapter.java
                    │  │  ...
                    │  │
                    │  └─userdata
                    │      │  AbstractUserDataSyncHelper.java
                    │      │  OnSuccessListener.java
                    │      │  UserAction.java
                    │      │  ...
                    │      │
                    │      ├─gms
                    │      │      DriveHelper.java
                    │      │      GMSUserDataSyncHelper.java
                    │      │
                    │      └─util
                    │              UserActionHelper.java
                    │              UserDataHelper.java
                    │
                    ├─ui
                    │  │  BaseActivity.java
                    │  │  CheckableLinearLayout.java
                    │  │  SearchActivity.java
                    │  │  ...BaseActivity以及自定义UI组件
                    │  │
                    │  └─widget
                    │          AspectRatioView.java
                    │          BakedBezierInterpolator.java
                    │          BezelImageView.java
                    │          ...自定义小UI控件
                    │
                    ├─util
                    │      AboutUtils.java
                    │      AccountUtils.java
                    │      AnalyticsHelper.java
                    │      ...工具类,提供静态方法
                    │
                    ├─videolibrary
                    │      VideoLibraryActivity.java
                    │      VideoLibraryFilteredActivity.java
                    │      VideoLibraryFilteredFragment.java
                    │      ...
                    │
                    └─welcome
                            AccountFragment.java
                            AttendingFragment.java
                            ConductFragment.java
                            ...

最后,

参考:

——————更新于 2017/4/20 by Songhui

上一篇 下一篇

猜你喜欢

热点阅读