Code Review& 编程习惯 (1),安卓网络通信开发
凡是会抛出异常的地方都进行捕获,你可以在 catch 中处理异常,如果不想处理则 throw 这个异常,由调用者去 try-catch 处理:
涉及到资源关闭的记得在 finally 中关闭资源:
另外不要在循环体中捕获异常,放在最外层,以提升性能。
2. 空指针,千万不要理所当然的以为一个对象不会为空,在使用一个变量之前一定要进行判空处理,做好充分的容错处理。
3. 数组越界,使用数组、List 之前检查索引和长度。
4. 魔鬼数字:直接写在代码里的数字,一定要用常量符号代替。
5. 对于可以复用的部分,提取成共用的方法或工具类,减少代码量。
6. 删除无用的变量和无用的引入。
7. 代码中的中文字符串最好统一在 strings.xml 中定义。
8. 所有 Activity 可继承自一个 BaseActivity,便于统一行为管理,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。
9. 数据库表段字段常量和 SQL 逻辑分离,更清晰。
10. 全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中。
11. 不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情。
12. 多线程操作数据库时,db 关闭了会报错,可能出现互锁的问题,使用事务。
13. 开始之前考虑哪些可以公用,资源,layout,类,做一个结构/架构分析以加快开发,提升代码复用度。
14. 关于形参实参:参数为基本类型传的是传值;参数为对象传递的是引用,即传址,这种改变会作用于原来对象。
15. 控制 Activity 的代码量,保持主要逻辑清晰。其他类遵守 SRP(单一职能),ISP(接口隔离)原则。
16. Log 请打上 Tag,调试打印一定要做标记,能定位打印位置,否则会尴尬不知道是哪里在打印。
17.与 Activity 通讯使用 Handler 更方便; 如果你的框架回调链变长,考虑监听者模式简化回调。
18. 构造函数里面不推荐启动异步线程,会埋下内存隐患。
19. UI 显示注意内容过长的情形要提前使用 ScrollView 否则在小手机上尴尬你懂得。
20. String 的比较用 equals,不要一时犯傻用了==。
21. Long a; 判断 a 有没有赋值,if(a == 0)在 a 没有赋值情况下会报错。应该 if(a == null),Integer、Floag 等也一样。
22. 编码遇到读写、出入等逻辑要双向考虑,文件导入导出,字符字节相互转换都要两边转码。
23. 从资源文件或者文件加载一张图片时注意其宽高,避免 OOM, bitmap 的内存占用是宽 x 高 x 单位像素占用字节(RGB565 是 2 个字节,ARGB8888 是 4 个字节)。
24. 对于并不那么注重访问性能的较小集合而言,List 则是合理的选择。for 循环对下标没有要求的优先使用 foreach 循环。
25. 选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡。例如某些情况下用 SparseArray 代替 HashMap。
26. 充分利用封装
(提供接口类来控制访问数据)和委托(helper 对象来实施任务)两种理念。
27. 当逻辑没有明显问题时考虑对象属性、函数参数、网络传输参数是否全部了解,是否设置正确。
28. 拼接字符串避免 String 进行频繁+操作,应该使用 StringBuilder 提升性能,多线程使用 StringBuffer 操作 string 提高程序效率。
29. 基本数据类型定义的变量称自动变量,存的是‘字面值’,存在于栈中,可共享(存在即不新建)。
30. 只要是用 new()来新建对象的,都会在堆中创建,而且其数据是单独存值的,即使与栈中的数据(值)相同,也不会与栈中的数据共享。
31. 能复用同一个对象处理的尽量复用,不要使劲的在那里 new 对象,内存吃不消,尤其是 for 循环等。
32. 改变逻辑的时候考虑全部用到这项功能的地方,分散的地方多了可能会忘记,不要为了填坑而挖了一个坑。
33. 不要在布局文件 xml 中使用 onClick 属性,如果你忘了在代码中声明 onClick 方法就会悲剧。
34. 注意参数的++或者--操作的区别。
35.?服务端可以实现的,就不要放在客户端。
36. 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大。
37. 重复类似的功能在统一个类中去实现,而不是重复的去 new 一个相同类的实例,如 activity 中在一个 View.OnClickListener 中处理所有的逻辑,接口回调在同一个 callback 中处理。
38. 多用组合,少用继承。
39.? 合理布局,有效运用<include>?,<merge>、<ViewStub>等标签。
40.? 尽量采用懒加载的策略,即在需要的时候才创建。
41.? 尽量使用 HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用 Hashtable、Vector、StringBuffer。
42.? 可以使用局部变量代替的,尽量不去创建全局变量。
43.??一个接口可以解决的事,尽量不去导入一个框架。
44. ?控制一个应用中的单列使用场景,防止滥用,单例主要用于控制资源的并发使用、 控制实例的产生, 控制数据的共享。
评论