前言
良好的规范,就像军队纪律。
所谓,没有规矩,不成方圆。
在编程中也是一样的,良好的代码规范总是能给人赏心悦目。哪怕读不懂代码,或者写的代码不够优秀,但给保持一个标准的规范也算一种态度。就像书面整洁一样,在高考中还能加分呢。
下面,我们开始修炼吧~
1、缩进、换行:
缩进 保持 ==4== 个字符。
-
换行 有些代码句(语句、条件表达式、方法参数)太长,可选择性换行。我们可规定为 ==>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 、条件+循环,避免多层嵌套:
- 长代码+多层嵌套,在程序块}后加注释标记,便于阅读。
- 一个方法里嵌套最好不要超过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、资源规范
-
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>
string.xml:
-
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中命名:m{View的缩写}{模块名}{逻辑名}==
个人觉得这样更好,比如当搜索某个按钮时,你只需键入mBtn
然后,IDE就会自动补全提示所有的btn变量。Button mBtnSearchContact = findViewById(R.id.contact_search_btn);
- id命名模式为: ==view缩写模块名逻辑名==,比如 btn_contact_search。同时,java中声明对应的view的命名规则与之反向,即 ==逻辑名_模块名_view缩写==,比如 mSearchContactBtn。再者,这样有一个好处——容易对应,
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/04/20 by hsong
——————更新于 2021/03/22 by hsong