以前一直看到网上各类各样的开发规范,相对比之下也贴一下咱们公司本身的开发规范,写的仍是有必定道理可言的,约束越严格,相对应的后期开发也就越轻松,代码管理也愈加简单java
重要:github或者其余任何非公司仓库不容许上传与项目业务逻辑有关的代码实现
下班走以前提交代码到SVN,上班来以后第一件事更新SVN
SVN版本 1.7.9
svn 只容许上传正式代码,测试代码本机留存。
SVN 上的代码必须是完整可运行的. 提交代码到 SVN 以前的重要步骤:
1. 本机运行 app并测试
2. 检查 Local Changes 下面的 "Unversioned Files" 中时候含有未添加的文件
java版本[编辑]
不容许使用java8(即便用插件支持也不行), 只容许使用 java7 的部分语法(不容许使用 try-with-resources 特性)
使用类方法以前,请确保类方法存在(好比 String#isEmpty 方法在 java5 中就不存在),在提交代码以前,先在 2.3 模拟器中测试。
注释规范[编辑]
文件注释(必需)格式以下:
/*
* User:Dong Jiang
* Introduction: 高德换乘路线详情地图
*/
基本原则[编辑]
*第一保证可读性*(不可读的代码当即重写),第二保证准确性,第三考虑效率
本身学习的时候造轮子,普通工做中就不用。然而,工做并非你专心学习的时机,专心学习的时机都在晚上和假期。
任务完成以后,检查本身的代码,一切参照标准 1
在检查一个对象内容是否为空以前,先检查对象自己是否是null,通用对象应该使用工具方法检测。
可能返回null 的方法使用注解进行声明。
不要省略语句后面的括号 {}。包括循环语句与条件语句
不容许使用 System.exit(0) 来进行正常的退出操做。必定要使用前,拿出来讨论。
不容许存在魔数,任何具备逻辑意义的常量(数字,字符串等等),都应先声明后使用。
任何状况下(if, while,do等等),都不容许省略大括号。
减小布局层数以及布局复用:采用<merge> 优化布局层数;动态加载View, 采用 ViewStub 避免一些不常常的视图长期握住引用; 采用<include >来共享布局。
内存流,网络流,文件流,Cursor等资源及时关闭
避免建立没必要要的对象
使用加强for循环时不能对集合自己进行操做,arraylist要手动循环(提早计算集合size),For循环里边不能够定义变量以及try-catch
合理利用浮点数,能用整形类型就不用浮点型
列表尽可能使用recyclerview
try-catch不能够随便挥霍影响性能
不能够打印堆栈,调试下除外
若是不须要被继承,尽可能指定类的final修饰符
尽可能使用局部变量
不要随意的使用stingA=StringB+StringC的写法,有大量拼接操做的地方用StringBuilder 代替。
不要随便使用static变量,常量除外(static final)
费时的资源操做,使用Application的Context
调用方法时,参数深度层级不能多于2
代码format。
没必要要的代码不要,包括之前逻辑的代码,测试代码,等,保持代码清洁。
在网络和文件(要在子线程去操做)操做等费时的地方,回调方法中在调用getview,content以及其余数据等activity相关资源的时候先调用isViewAttached
bitmap不用时,要及时回收,须要呈现到界面时用glide代替bitmap(网络和本地),不要用networkimageview,若是不是显示界面要及时recycle
TypedArray要及时recycle
没有用到的文件类方法不要留在项目中,保持代码清洁
e.printStackTrace();禁止有这种东西,有须要能够在lesslog里以开关的方式作
尽可能避免硬编码 汉字放置到String中,其余创建字段
presenter尽可能避免持有直接Activity的引用,能用回调或者新加方法的尽可能新增
尽量少的使用全局变量,例子:将类中使用一次的变量直接在使用处new出
if(){}else{........},禁止出现这种if里没有代码的状况
for循环前必定要判空
条件语句的条件部分不要产生反作用。
若是须要修改公用的部分,在群里说一声
switch-case语句在default里加入break
严禁 import static xxx.*;,惟一的例外是使用枚举。
时间单位统一使用毫秒
使用 PopupWindow 或者 Dialog 的时候,在 Activity 销毁以前,必定要关闭 PopupWindow 或者 Dialog
日志[编辑]
不要直接使用SDK内置的Log,使用项目统一包装的类或者工具
若是没有特殊要求,log的第一个参数始终应该是 this。静态方法中,第一个参数应该是类名。
不容许用本身的名字做为日志 tag
协做[编辑]
不是本身定义的接口不要修改
协商定义的接口不要修改
final类(不管是本身定义的仍是别人定义的)不要修改要修改先协商
优先使用已存在的解决方案,不要重复造轮子。
定义样式的时候,遵守约定的规范格式,不要另起炉灶。
不要随意在公共库里面增长类或者修改方法,增长以前先明确是否已有现成的实现
多线程[编辑]
不要直接使用Thread,应该使用项目统一包装的类或者工具
在涉及多线程的地方,都要考虑内存泄露和数据安全的风险
异常处理[编辑]
控制消化或者抛出异常的时机,不能肯定的时候拿出来一块儿讨论
解决bug的时候不能粗暴的捕获一切异常,必需要定位到具体的异常级别
错误示例[编辑]
随意的命名[编辑]
1. 改变了工程的前缀,随意取名
<style name="CLL.Item.MainTitle">
<item name="android:textColor">@color/core_textColorPrimary</item>
<item name="android:textSize">@dimen/text_size_14</item>
</style>
2. 干脆没有前缀
<style name="DialogAnimation">
<item name="android:windowEnterAnimation">@anim/cll_dialog_fullscreen_enter</item>
<item name="android:windowExitAnimation">@anim/cll_dialog_fullscreen_exist</item>
</style>
<declare-styleable name="TagCloudView">
<attr name="tcvBackground" format="reference"/>
<attr name="tcvTextColor" format="color"/>
<attr name="tcvBorder" format="dimension"/>
</declare-styleable>android
暴露细节[编辑]
StationDetailPresenterImpl:
@Override
public void parseIntent(Intent intent) {
mRefer = KpiReferer.getRefer(intent);
mPolicy = KpiPolicy.getPolicy(intent);
if (mPolicy == null) {
mPolicy = new Policy();
}
mStationEntity = intent.getParcelableExtra(LineConstant.IntentConstant.INTENT_EXTRA_STATION_ENTITY);
getView().showStationName(mStationEntity.getStationName());
DestStationEntity destStation = intent.getParcelableExtra(TransitConstant.INTENT_EXTRA_SCHEME_DEST);
if (destStation != null) {
loadStationsFilterByDestStation(destStation);
} else {
loadStationDetail();
}
}
过分封装[编辑]
1. 毫无心义的封装
/**
* 获取当前版本的启动次数
*/
private static int getOpenCountInCurrentVersion(Context context) {
return CllPreference.getInstance(context).getOpenCountInCurrentVersion();
}
2. 混合基础功能 与 业务功能。业务功能应该使用对象,而不是 util
//增长一条非默认地点
private static void addNonDefaultDestEntity(final DestEntity destEntity, Poi poi, TransitParam normalParam, @DestType.Type int destType) {
TransitParam transitParam = new TransitParam()
.transitDest(poi.getGeoPoint())
.destType(destType)
.destName(poi.getName())
.destTag(poi.getName()); //默认状况下,destTag和destName相同
transitParam.getParams().copyFrom(normalParam.getParams());
TransitClientFactory.getInstance().addDest(transitParam, new OptionalParam(), new DataListener<DestAddData>() {
@Override
public void onDataResponse(DestAddData data) {
super.onDataResponse(data);
destEntity.setDestId(data.getDestId());
}
});
}git