最近阅读了《代码整洁之道》这本书,感觉副标题说的不错,细节之中自有天地,整洁成就卓越代码。
概要
文不如表,表不如图,奉上一张思维导图:
下面是我看书的过程中记录的感觉我自己掌握度不够的知识点:(也就算是读后感吧)
函数
每个函数一个抽象层级
要确保函数只做一件事
,函数中的语句都要在同一抽象层级
上。
举一个违反了这条规矩的例子。
比如里面有getHtml()等位于较高抽象层的概念,也有String pagePathName = PathParser.render(pagePath)等位于中间抽象层的概念,还有.append("\n")等位于相当低的抽象层的概念。
函数参数
最理想的参数数量是零(零参数函数),其次是一(单参数函数),再次是二(双参数函数)
应尽量避免三(三参数函数
)。有足够特殊的理由才能用三个以上参数(多参数函数)
所以无论如何也不要这么做。
参数不易交付。阅读代码没有参数的更容易理解,因为参数和函数名处在不同的抽象层级,它要求你了解目前并不特别重要的细节。
从测试的角度看,参数更叫人为难。要编写能确保参数各种组合运行正常的测试用例,是多么困难的事。
解决方式:
如果方法参数将超过3个,建议放在类中包装起来。
格式
垂直格式
很多出色的系统由大多数为200行,最长500行的单个文件构成。
向报纸学习
源文件最顶部应该给出高层次
的概念和算法。细节应该往下渐次展开,直至找到源文件中最底层的函数和细节。
横向格式
平均来看,一行是45个字符左右。
代码行应该有多宽,此书作者一向遵循无需拖动滚动条到右边
的原则。
但是近年来显示器越来越宽,此书作者个人的上限是120
个字符。
错误处理
别返回null值
当使用list的时候尽量不要返回null
可以使用Collections.emptyList()
方法,该方法返回一个预定义的不可变列表。
单元测试
整洁的测试
测试函数要呈现构造-操作-检验
(BUILD-OPERATE-CHECK)模式。
每个测试都清晰拆分为三个环节。第一个环节构造测试数据,第二个环节操作测试数据,第三个部分检验操作是否得到期望的结果。
并发编程
测试线程代码
在不同平台上运行
不同操作系统有着不同的线程策略
。
在不同的环境中,多线程代码的行为也不一样。
建议: 尽早并经常地在所有目标平台上运行线程代码。
硬编码
可以手工向代码中插入wait()
、sleep()
、yield()
和priority()
的调用。
比如,插入对yield()的调用,将改变代码的执行路径,因此可能导致代码在以前未失败过的地方失败。
非线程安全类
有些类天生不是线程安全的。下面是几个例子:
- 数据库连接
- java.util中的容器
- Servlet
注意,有些类拥有一些线程安全的方法。不过,涉及调用多个方法的操作都不是线程安全的。
例如:
if (!hashTable.containsKey(someKey)) {
hashTable.put(someday, new SomeValue());
}
单个方法是线程安全的,不过,另一个线程却可能在containsKey和put调用之间塞进一个值。
有几个修正这个问题的手段:
- 先锁定HashTable,确定其他使用者都做了基于客户端的锁定:
synchronized(map) {
if(!map.conainsKey(key)) {
map.put(key, value);
}
}
- 用其对象包装HashTable,并使用不同的API—利用ADAPTER模式做基于服务端的锁定:
public class WrappedHashtable<K, V> {
private Map<K, V> map = new Hashtable<K, V>();
public synchronized void putlfAbsent(K key, V value) {
if (map.containsKey(key)) {
map.put(key, value);
}
}
}
- 采用线程安全的群集:
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<Integer, String>();
map.putIfAbsent(key, value);
在java.util.concurrent中的群集都有putlfAbsent()
之类提供这种操作的方法。
总结
整体看下来,《代码整洁之道》是一本还不错的技术书,介绍了各种写出更漂亮代码的原则与实践,我看网上说还可以与**《重构》**配合看,这样基本的原则就都覆盖到了。看了豆瓣上的评分,《代码整洁之道》8.6分,《重构》9.0分。评论上说,《代码整洁之道》总结的优雅代码原则的全面性和丰富性上差了一些。所以,有时间还是要再拜读一下《重构》的。
参考资料
《代码整洁之道(Clean Code)》
https://hustyichi.github.io/2019/02/17/clean-code/
https://www.cnblogs.com/edisonchou/p/edc_clean_code_notes.html