Java代码精进
Posted betterLearing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码精进相关的知识,希望对你有一定的参考价值。
一、代码命名规范
驼峰命名法(CamelCase)
Google 定义了以下的转换规则:
-
从正常的表达形式开始,把短语转换成 ASCII 码,并且移除单引号。 例如,“Müller’s algorithm”转换为“Muellers algorithm”;
-
如果上述结果含有其他标点符号,比如连字符,在该符号处,把这个结果切分成单词形式。 如果某个单词已经是驼峰形式,也相应地切分开来。 例如,“AdWords”切分成“ad words”,“non-current assets”切分成“non current assets”;
-
将所有字母转换为小写字母,然后将每个单词的首字母大写,这样就得到了大驼峰式命名的形式; 如果第一个单词的首字母小写,就得到了小驼峰式命名的形式;
-
将所有的单词连在一起,就是最后的标识符命名。
Java 的命名规范
二十、简单和直观
大部分的优秀的程序员,早拆解、早验证,边拆解、边验证;这两件事情的确很耗费时间,从整个软件的开发时间来看,是最节省时间的。如果拆解和验证做得好,代码的逻辑就会很清晰,层次会很清楚,缺陷也少。
一个优秀的程序员,可能 80% 的时间是在设计、拆解和验证,只有 20% 的时间是在写代码。但是,拿出 20% 的时间写的代码,可能要比拿出 150% 时间写的代码,还要多,还要好。这个世界真的不是线性的。
思维导图:在拆解问题时,思维导图帮助厘清思路,防止遗漏。
时序图:帮助理解关键的用例,勾画清楚各个部件之间的联系。
问题清单:记录下要解决和已经解决的问题,帮助记录状态、追踪进度。
二十九、编写经济代码
1、避免过度设计
常问“什么是现在就必须做”?“什么是必须做的”?关注核心需求和核心问题。
2、选择简单直观
设计一个简单直观的接口。把问题逐步拆解成一个个已经完全穷尽的小问题,“相互独立,完全穷尽”。
一个接口应该做一件事情,如果这个情况不太理性化,尽量减少接口的依赖关系。
3、超越线程同步
只要满足三者其一,就可不用线程同步:使用单线程;不关心共享资源的变化;没有改变共享资源的行为。
4、减少内存使用
两个维度:一个是减少实例数量;另一个是减少实例的尺寸。
减少实例数量:数据静态化的处理方式(比如枚举类)、单例模式、延迟分配技术。
减少实例尺寸:减少独占空间,尽量使用共享实例。不可变(immutable)的资源和禁止修改(unmodifiable)的资源,是两类理想的共享资源。
5、避免性能陷阱
比如字符串的操作、内存泄漏、未正确关闭资源和遗漏的hashCode等。
6、规模扩张能力
分规模垂直扩张和规模水平扩张。
规模水平扩张:状态数据。分类无状态数据、提供无状态服务、减少有状态的规模。
经济代码检查清单:
需求评审
- 需求是真实的客户需求吗?
- 要解决的问题真实存在吗?
- 需求具有普遍的意义吗?
- 这个需求到底有多重要?
- 需求能不能分解、细化?
- 需求的最小要求是什么?
- 这个需求能不能在下一个版本再实现?
设计评审
- 能使用现存接口吗?
- 设计是不是简单、直观?
- 一个接口是不是只表示一件事情?
- 接口之间的依赖关系是不是明确?
- 接口的调用方式是不是方便、皮实?
- 接口的实现可以做到不可变吗?
- 接口时多线程安全的吗?
- 可以使用异步编程吗?
- 接口需不需要频繁地拷贝数据?
- 无状态数据和有状态数据需不需要分离?
- 有状态数据的处理是否支持规模水平扩张?
代码评审
- 有没有可以重用的代码?
- 新的代码是不是可以重用?
- 有没有使用不必要的实例?
- 原始数据类的使用是否恰当
- 集合操作是不是多线程安全?
- 集合是不是可以禁止修改?
- 实例的尺寸还有改进的空间吗?
- 需要使用延迟分配方案吗?
- 线程同步是不是必须的?
- 线程同步的阻塞时间可以更短吗?
- 多状态同步会不会引起死锁?
- 是不是可以避免频繁的对象创建、销毁?
- 是不是可以减少内存的分配、拷贝和释放频率?
- 静态的集合是否会造成内存泄漏?
- 长时间的缓存能不能及时清理?
- 系统的资源能不能安全地释放?
- 根据哈希值的集合,存储的对象有没有实现hashCode()和equals()方法?
- hashCode()的实现,会不会产生撞车的哈希值?
- 代码的清理,有没有变更代码的逻辑?
以上是关于Java代码精进的主要内容,如果未能解决你的问题,请参考以下文章