26
26
27
27
* 2021 年 2 月 5 日:[ 添加码云地址] ( https://github.com/getActivity/AndroidCodeStandard/commits/master )
28
28
29
- * 2021 年 2 月 5日 :[ 第一次提交代码] ( https://github.com/getActivity/AndroidCodeStandard/commit/490a8d3e3695dd30a952ded71969fda83daaa58c )
29
+ * 2021 年 2 月 5 日 :[ 第一次提交代码] ( https://github.com/getActivity/AndroidCodeStandard/commit/490a8d3e3695dd30a952ded71969fda83daaa58c )
30
30
31
31
#### 目录
32
32
82
82
83
83
* 那么你的疑问可能又来了,怎么样才能算好的代码规范,答案只有一个,真正好的代码规范就是别人的代码你一眼就能看懂,更不需要反复去看。之所以这样并不是因为看的人 Review 代码的能力有多强,而是写代码的人愿意遵守规则,他知道自己想这么写,但是知道你会看不懂,所以换了一种方式来写,这种方式就是** 代码规范** 。
84
84
85
- * 代码规范:一个好的代码规范可以帮助我们快速了解和熟悉相关的业务,降低后续维护的成本(二次开发和排查问题 )。
85
+ * 代码规范:一个好的代码规范可以帮助我们快速了解和熟悉相关的业务,降低后续维护的成本(二次开发或者排查问题 )。
86
86
87
87
* 代码不规范:代码不规范会导致项目可读性变差,具体表现为** 难分辨和难理解** ,在无形之中加大项目后续维护的成本。
88
88
94
94
95
95
* 字符串比较,应该用 ` "xxx".equals(object) ` ,而不应该用 ` object.equals("xxx") ` ,因为 ** object** 对象可能为空,我们应该把不为空的条件放置在表达式的前面。
96
96
97
- * 尽量采用 ** switch case** 来判断,如果不能实现则再考虑用 ** if else** ,因为在多条件判断下 ** switch case** 更加简洁 。
97
+ * 尽量采用 ** switch case** 来判断,如果不能实现则再考虑用 ** if else** ,因为在多条件下使用 ** switch case** 语句判断会更加简洁 。
98
98
99
99
* 不推荐用 ** layout_marginLeft** ,而应该用 ** layout_marginStart** ;不推荐用 ** layout_marginRight** ,而应该用 ** layout_marginEnd** ,原因有两个,一个是适配 Android 4.4 ** 反方向特性** (可在开发者选项中开启),第二个是 XML 布局中使用 ** layout_marginLeft** 和 ** layout_marginRight** 会有代码警告,** padding** 属性也是同理,这里不再赘述。
100
100
116
116
117
117
* 每个小组成员应当安装[ 阿里巴巴代码约束插件] ( https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines ) ,并及时地对插件所提示的** 代码警告** 进行处理或者抑制警告。
118
118
119
- * 应用图标应该放在 ** mipmap** 目录下,其他图片资源应当放到 ** drawable** 目录下,具体原因可以看[ 谷歌官方文档的介绍 ] ( https://developer.android.google.cn/guide/topics/resources/providing-resources ) 对这两个文件夹给出的介绍:
119
+ * 应用图标应该放在 ** mipmap** 目录下,其他图片资源应当放到 ** drawable** 目录下,具体原因可以看[ 谷歌官方文档 ] ( https://developer.android.google.cn/guide/topics/resources/providing-resources ) 对这两个文件夹给出的介绍:
120
120
121
121
| 目录 | 资源类型 |
122
122
| :---------- | :----------------------------------------------------------- |
147
147
148
148
* 局部变量应用作用来命名,举个栗子:
149
149
150
- * ` String name `
151
-
152
- * ` TextView nameView `
153
-
154
- * ` FrameLayout nameLayout `
155
-
156
- * 命名规范附带技巧(当布局中同个类型的控件只有一个的时候,也可以这样命名)
150
+ ``` java
151
+ String name;
157
152
158
- * ` TextView textView `
159
-
160
- * ` RecyclerView recyclerView `
153
+ TextView nameView;
154
+
155
+ FrameLayout nameLayout;
156
+ ```
157
+
158
+ ---
159
+
160
+ ``` java
161
+ // 命名规范附带技巧(当布局中同个类型的控件只有一个的时候,也可以这样命名)
162
+
163
+ TextView textView;
164
+
165
+ RecyclerView recyclerView;
166
+ ```
161
167
162
168
* 成员变量必须以小 ** m** 开头,举个栗子:
163
169
164
- * ` String mName `
165
-
166
- * ` TextView mNameView `
167
-
168
- * ` FrameLayout mNameLayout `
170
+ ``` java
171
+ String mName;
169
172
170
- * 命名规范附带技巧(当布局中同个类型的控件只有一个的时候,也可以这样命名)
171
-
172
- * ` TextView mTextView `
173
-
174
- * ` RecyclerView mRecyclerView `
173
+ TextView mNameView;
174
+
175
+ FrameLayout mNameLayout;
176
+ ```
177
+
178
+ ---
179
+
180
+ ``` java
181
+ // 命名规范附带技巧(当布局中同个类型的控件只有一个的时候,也可以这样命名)
182
+
183
+ TextView mTextView;
184
+
185
+ RecyclerView mRecyclerView;
186
+ ```
175
187
176
188
* 布尔值命名规范,命名不应该以 ** is** 开头,举个栗子:
177
189
178
- * 错误写法示例:
179
-
180
- * 成员变量:` private boolean mIsDebug = false; `
181
-
182
- * 局部变量:` boolean isDebug = false; `
183
-
184
- * 正确写法示例:
185
-
186
- * 成员变量:` private boolean mDebug = false; `
187
-
188
- * 局部变量:` boolean debug = false; `
190
+ ``` java
191
+ // 错误写法示例
192
+
193
+ private boolean mIsDebug = false ;
194
+
195
+ boolean isDebug = false ;
196
+ ```
197
+ ---
198
+
199
+ ``` java
200
+ // 正确写法示例
201
+
202
+ private boolean mDebug = false ;
203
+
204
+ boolean debug = false ;
205
+ ```
189
206
190
207
* 静态变量则用小 ** s** 开头,举个栗子:
191
208
192
- * ` static Handler sHandler `
209
+ ``` java
210
+ static Handler sHandler;
211
+ ```
193
212
194
213
* 常量则需要用大写,并且用下划线代替驼峰,举个栗子:
195
214
196
- * ` static final String REQUEST_INSTALL_PACKAGES" `
215
+ ``` java
216
+ static final String REQUEST_INSTALL_PACKAGES ;
217
+ ```
197
218
198
219
* 有细心的同学可能会发现一个问题,为什么我们最常用的 Glide 和 OkHttp 的源码为什么没有用字母 `m` 来区分局部变量和成员变量?但是谷歌的 SDK 源码和 Support 库就有呢?那究竟是用还是不用呢?这个问题其实很好回答,我们可以先从体量上分析,首先谷歌的开发人员和项目数量肯定是最多的,那么谷歌在这块的探索和研究肯定是多于 Glie 和 OkHttp 的,其次是 Glide 和 OkHttp 的源码都有一个特点,很多类都维持在 1k 行代码左右,而谷歌源码很多类都接近 10k 行代码,例如 Activity 的源码在 API 30 上面有 8.8k 行代码,所以谷歌在这块略胜一筹,如果非要二选一,我选择谷歌的代码风格,并不是说 Glide 和 OkHttp 命名风格不好,是因为或许在未来的某一天,可能会有新的图片请求框架和网络请求框架来代替 Glide 和 OkHttp,但是基本不可能会出现有代替 Android SDK 或者 Support 库的一天。
199
220
@@ -294,21 +315,25 @@ public class Activity {
294
315
295
316
* 业务模块请以 ** 模块 + 类型** 来命名,举个栗子
296
317
297
- * ` HomeActivity.java `
298
-
299
- * ` SettingFragment.java `
300
-
301
- * ` HomeAdapter.java `
318
+ ``` text
319
+ HomeActivity.java
320
+
321
+ SettingFragment.java
322
+
323
+ HomeAdapter.java
302
324
303
- * ` AddressDialog.java `
325
+ AddressDialog.java
326
+ ```
304
327
305
328
* 技术模块请以类的 ** 作用** 来命名,举个栗子
306
329
307
- * ` CrashHandler.java `
330
+ ``` text
331
+ CrashHandler.java
308
332
309
- * ` GridSpaceDecoration.java `
333
+ GridSpaceDecoration.java
310
334
311
- * ` PickerLayoutManager.java `
335
+ PickerLayoutManager.java
336
+ ```
312
337
313
338
#### 接口文件命名规范
314
339
@@ -348,49 +373,58 @@ public class Handler {
348
373
349
374
* 以 ` 模块 ` + ` 类型 ` 来命名,举个栗子:
350
375
351
- * ` home_activity.xml `
352
-
353
- * ` setting_fragment.xml `
354
-
355
- * ` menu_item.xml `
356
-
357
- * ` address_dialog.xml `
376
+ ``` text
377
+ home_activity.xml
378
+
379
+ setting_fragment.xml
380
+
381
+ menu_item.xml
382
+
383
+ address_dialog.xml
384
+ ```
358
385
359
386
* 这样写的好处在于,由于 res 文件夹下是没有层级概念的
360
387
361
388
* 通过前缀的命名可以帮助我们更好定位到同一模块下的资源
362
389
363
390
* 例如分享对话框中,有对话框 Root 布局和 Item 布局
364
391
365
- * ` share_dialog.xml ` (Root 布局)
392
+ ``` text
393
+ share_dialog.xml(Root 布局)
366
394
367
- * ` share_item.xml ` (Item 布局)
395
+ share_item.xml(Item 布局)
396
+ ```
368
397
369
398
#### 资源文件命名规范
370
399
371
400
* 如果是业务模块下的资源,以 ** 模块 + 类型** 来命名,例如分享对话框的资源:
372
401
373
- * ` share_link_ic.png ` (复制链接)
402
+ ``` text
403
+ share_link_ic.png(复制链接)
374
404
375
- * ` share_moment_ic.png ` (分享到朋友圈)
405
+ share_moment_ic.png(分享到朋友圈)
376
406
377
- * ` share_qq_ic.png ` (分享到 QQ 好友)
407
+ share_qq_ic.png(分享到 QQ 好友)
378
408
379
- * ` share_qzone_ic.png ` (分享到 QQ 空间)
409
+ share_qzone_ic.png(分享到 QQ 空间)
380
410
381
- * ` share_wechat_ic.png ` (分享到微信好友)
411
+ share_wechat_ic.png(分享到微信好友)
412
+ ```
382
413
383
414
* 如果和业务模块不相干的资源,以 ** 作用 + 类型** 来命名,例如通用的控件样式资源:
384
415
385
- * ` button_rect_selector.xml ` (通用直角按钮样式)
416
+ ``` text
417
+ button_rect_selector.xml(通用直角按钮样式)
418
+
419
+ button_round_selector.xml(通用圆角按钮样式)
420
+ ```
386
421
387
- * ` button_round_selector.xml ` (通用圆角按钮样式)
388
422
389
- * 这种资源有一个共同特点,它不属于哪个模块,但是在不同模块都有用到,所以不能用业务的模块名作为文件名前缀
423
+ * 这种资源有一个共同特点,它不属于哪个模块,但是在不同模块都有用到,所以不能用业务的模块名作为文件名前缀。
390
424
391
425
#### 接口实现规范
392
426
393
- * 一般情况下,我们会在类中这样实现接口,这样写的好处是,可以减少对象的创建,并且代码也比较美观
427
+ * 一般情况下,我们会在类中这样实现接口,这样写的好处是,可以减少对象的创建,并且代码也比较美观。
394
428
395
429
``` java
396
430
public final class PasswordEditText extends EditText
@@ -431,7 +465,7 @@ public final class PasswordEditText extends EditText
431
465
}
432
466
```
433
467
434
- * 但是有一个美中不足的地方,就是在实现的接口过多时,我们很难分辨是哪个方法是哪个接口的,这个时候可以使用注释的方式来解决这个问题,加上 ** @link ** 还可以帮助我们快速定位接口类在项目中所在的位置
468
+ * 但是有一个美中不足的地方,就是在实现的接口过多时,我们很难分辨是哪个方法是哪个接口的,这个时候可以使用注释的方式来解决这个问题,加上 ** @link ** 还可以帮助我们快速定位接口类在项目中所在的位置。
435
469
436
470
``` java
437
471
public final class PasswordEditText extends EditText
@@ -730,21 +764,21 @@ fragment.setRetainInstance(true);
730
764
731
765
* 应用到某个模块 ** View** ,举个栗子
732
766
733
- ``` xml
767
+ ``` text
734
768
login_left_balloon_view.xml
735
769
login_right_balloon_view.xml
736
770
```
737
771
738
772
* 应用到全局 ** Activity** ,举个栗子
739
773
740
- ``` xml
774
+ ``` text
741
775
left_in_activity.xml
742
776
left_out_activity.xml
743
777
```
744
778
745
779
* 应用到全局 ** Dialog** ,举个栗子
746
780
747
- ``` xml
781
+ ``` text
748
782
bottom_in_dialog.xml
749
783
bottom_out_dialog.xml
750
784
```
@@ -753,7 +787,7 @@ bottom_out_dialog.xml
753
787
754
788
* 应该以 ** 控件的缩写 + 模块名 + 作用** 来命名,例如
755
789
756
- ``` xml
790
+ ``` text
757
791
@+id/R.id.rg_login_type
758
792
759
793
@+id/R.id.et_login_phone
@@ -924,14 +958,6 @@ bottom_out_dialog.xml
924
958
925
959
* 应该在布局文件根布局中定义 ` tools:context ` 属性,以便在布局文件中快速定位到对应的类
926
960
927
- * ` tools:context=".ui.activity.HomeActivity" `
928
-
929
- * ` tools:context=".ui.fragment.SettingFragment" `
930
-
931
- * ` tools:context=".ui.adapter.HomeAdapter" `
932
-
933
- * ` tools:context=".ui.dialog.PersonDataDialog" `
934
-
935
961
``` xml
936
962
<FrameLayout xmlns : android =" http://schemas.android.com/apk/res/android"
937
963
xmlns : app =" http://schemas.android.com/apk/res-auto"
@@ -943,6 +969,17 @@ bottom_out_dialog.xml
943
969
</FrameLayout >
944
970
```
945
971
972
+ ---
973
+
974
+ ``` text
975
+ tools:context=".ui.activity.HomeActivity"
976
+
977
+ tools:context=".ui.fragment.SettingFragment"
978
+
979
+ tools:context=".ui.adapter.HomeAdapter"
980
+
981
+ tools:context=".ui.dialog.PersonDataDialog"
982
+ ```
946
983
947
984
* 此外,tools 属性还有各种各样的用途,例如 RecyclerView 的 ** tools** 属性
948
985
@@ -1011,12 +1048,12 @@ bottom_out_dialog.xml
1011
1048
1012
1049
* 日志查看框架:[ Logcat] ( https://github.com/getActivity/Logcat )
1013
1050
1014
- #### Android技术讨论Q群:78797078
1015
-
1016
1051
#### 微信公众号:Android轮子哥
1017
1052
1018
1053
![ ] ( https://raw.githubusercontent.com/getActivity/Donate/master/picture/official_ccount.png )
1019
1054
1055
+ #### Android 技术分享 QQ 群:78797078
1056
+
1020
1057
#### 如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face : 就太:thumbsup : 了。您的支持将鼓励我继续创作:octocat:
1021
1058
1022
1059
![ ] ( https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_ali.png ) ![ ] ( https://raw.githubusercontent.com/getActivity/Donate/master/picture/pay_wechat.png )
0 commit comments