一共只存在两个永久分支:
编码规范对于程序员而言尤为重要,有以下几个原因:
####强制性规范:
public class ComponentFactory
public class BufferStrategy
public class ScrollerProxy
####关于Dao层或ArrayList的命名
"test".equals(object);
object.equals("test");
集合类|Key|Value|Super|说明
------- | ------- | ------- | -------
Hashtable|不允许为null|不允许为null|Dictionary| 线程安全
ConcurrentHashMap | 不允许为null | 不允许为null | AbstractMap | 分段锁技术
TreeMap | 不允许为null | 允许为null | AbstractMap| 线程不安全
HashMap | 允许为null | 允许为null | AbstractMap | 线程不安全
反例
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
} // other functions and members...
}
应该为:
class Foo {
private volatile static Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
} // other functions and members...
}
####Android代码规范
代码:
public static final String EXTRA_KEY_PERSON_NAME="EXTRA_KEY_PERSON_NAME"
public static final String EXTRA_KEY_PERSON_NAME="EXTRA_KEY_PERSON_AGE"
new Intent()
,依次传递进去值,这样写其实没什么问题;但是试想一下,如果你要调用的Activity是类似于一个工具性质或通用的Activity(图片选择器、登录、注册等等),这时候你要传递的key又很多,如果业务复杂的话,你应该会被这样冗余且不易阅读的代码直接搞崩溃掉。Idprivate static final String EXTRA_KEY_NOTE_ID ="EXTRA_KEY_NOTE_ID" ;//笔记
private static final String EXTRA_KEY_NOTE_CONTENT ="EXTRA_KEY_NOTE_CONTENT" ;//笔记内容
private static final String EXTRA_KEY_NOTE_MODE ="EXTRA_KEY_NOTE_MODE" ;//笔记模式
//用于创建笔记
public static void startForCreate(Context context, int noteId) {
start(context, noteId, null, MODE_CREATE);
}
//用于编辑笔记
public static void startForEdit(Context context, int noteId, String content) {
start(context, noteId, content, MODE_UPDATE);
}
public static void start(Context context, int noteId, String content, int mode) {
Intent starter = new Intent(context, TableShareListSettingActivity.class);
starter.putExtra(EXTRA_KEY_NOTE_ID,noteId);
starter.putExtra(EXTRA_KEY_NOTE_CONTENT,content);
starter.putExtra(EXTRA_KEY_NOTE_CONTENT,mode);
context.startActivity(starter);
}
通过以上方法,我们能够很好的解耦复杂的Activity之间的调用,再加上静态方法工厂方法名,代码可阅读行大大提高,最终我们看到的调用NoteActivity将会是很简洁的一段代码:
NoteActivity.startForCreate(this,noteId);
NoteActivity.startForEdit(this,noteId,content);
此外,Android Studio工具中其实已经在Live Template中提供了这样的代码:简单的输入starter就可以快速地在当前的Activity中添加一个Intent的静态操作方法,这其实也说明了Android官方团队也鼓励我们这么做。
/**
* @Title:
* @Description:
* @Author:xuefeng.zhu
* @Since:2020-03-22
* @Version:1.0.0
*/
LoginActivity extends BindingBaseActivity{
@Override
protected int getLayoutId() {
return R.layout.user_activity_login;
}
@Override
protected LoginViewModel getViewModel() {
return new LoginViewModel(getBinding(), getIntent());
}
@ClickTrace
@Override
public void onClick(View v) {
super.onClick(v);
int i = v.getId();
if (i == R.id.wx_login_tv_layout) { //微信登录
getBinding().getViewModel().authorize(new Wechat());
} else if (i == R.id.pick_other_login_way_tv) { //选择其他登录方式
getBinding().getViewModel().showLoginWayDialog(this);
} else if (i == R.id.has_referrer_tv) { //我有推荐人
requestRecommend();
} else if (i == R.id.close_iv) {
finish();
}
}
@Override
public String getEventCode(int viewId) {
com.analysis.statistics.http.RequestParams params = new com.analysis.statistics.http.RequestParams();
params.put(Constant.PAGE, "00100000000");
if (viewId == R.id.has_referrer_tv) {
params.put(Constant.ACTION_CODE, "008");
params.put(Constant.Z_ACTION_CODE, "001");
}
//无子操作编码不上报埋点
String zActionCode = params.get(Constant.Z_ACTION_CODE);
if (TextUtils.isEmpty(zActionCode)) {
return "";
}
String code = params.formJsonString();
params.clear();
return code;
}
}
先是实现父类的getLayoutId方法,显示页面布局;之后返回当前页面的viewModel;再然后是页面的点击事件…最后才是页面埋点方法;
资源Res
Resources Type | 命名规则 |
---|---|
TextView | goods_name_tv |
EditText | goods_name_et |
ImageView | goods_name_iv |
Button | goods_name_bt |
ListView | goods_name_lv |
GridView | goods_name_gv |
CheckBox | goods_name_cb |
RadioButton | goods_name_rb |
LinearLayout | goods_name_ll |
RelativeLayout | goods_name_rl |
FrameLayout | goods_name_fl |
GridLayout | goods_name_gv |
#####Color资源命名,String资源命名
命名规则:模块(module:user)_组件名_具体作用名
Color资源命名
Resources Type | 命名规则 |
---|---|
color | 模块(module)_具体作用名_color。例 R.color.goods_login_name_color |
String资源命名
Resources Type | 命名规则 |
---|---|
string | 具体功能。 例 R.string.user_hello |
Drawable资源命名
Resources Type | 命名规则 |
---|---|
launcher icon | ic_launcher。例R.drawable.user_ic_launcher |
normal icon | ic_具体模块_功能。例R.drawable.user_ic_audio_pause |
Toolbar icon | user_ic_ab_功能名。例如user_ic_ab_search |
selector | selector_模块_功能名。例如 user_selector_login_button |
shape | shape_模块功能名状态。例如 R.drawable.user_shape_login_button_normal |
命名规则:模块(module:user)_功能名_具体作用名
Resources Type | 命名规则 |
---|---|
activity | activity_模块名。例如 R.layout.activity_login |
fragment | fragment_模块名。例如 R.layout.fragment_login_layout_header |
include | layout_模块名_功能名。例如 @layout/layout_login_bottom |
adapter | adapter_item_模块名_功能名。例R.layout.adapter_item_simple_text |
dialog | dialog_模块_功能名。例如 R.layout.dialog_time_picker |
list header | header_模块_功能。例如 R.layout.header_main_top_ad |
list footer | footer_模块_功能。例如 R.layout.footer_main_bottom_action |
widget | widget_模块_功能。例如 R.layout.widget_app_clock |
命名规则:模块(module:user)_menu_功能名
Resources Type | 命名规则 |
---|---|
menu | menu_模块名。例如 menu_login |
命名规则:模块(module:user)_功能名(login)_组件(color)
Resources Type | 命名规则 |
---|---|
color | 模块名_color。例如 user_login_text_color |
dimens | 模块名_dimens。例如 user_login_textsize_dimens |
style | 模块名_style。例如 user_login_text_style |
themes | 模块名_themes。例如 user_login_themes |
其实代码规范只是一个Guideline,大家遵从规范的目的是为了提高开发效率,并且使得代码容易阅读且维护性高!