没有语言是完美的。
因语言演化,不同时期不同版本的程序员写的代码,在用同一门语言在编程。所以,我们经常看到各种不同时期风格代码并存。
新的语言特性都是为提高代码表达性,减少犯错几率。多用新语言特性写代码,绝对没毛病!
那应该如何使用“新”语言特性,让代码写得更好?
Optional
暂不考虑缺乏封装问题。这段代码有问题。因为未考虑对象可能为 null。
更好的写法:
这种写法很稀缺,所以,新项目总是各种NPE。如果你要问程序员为什么不写对象为 null 的判断,答曰:忘了。
空指针的发明者 Tony Hoare 将其称为“自己犯下的十亿美元错误”。
还好Java 8有Optional,它提供了一个对象容器,你需要从中“取出(get)”你所需要对象,但取出前,你需判断该对象容器中是否真的存在一个对象。
你再不会忘掉判断对象是否存在,因为你需要从 Optional 取出存在里面的对象。正是这多余的一步,避免你“忘”了。
更简洁的写法:
项目中所有可能为 null 的返回值,都要返回 Optional,可大大减少各种意外惊喜。
函数式编程
准备参数的代码:
- 筛选出审核通过的章节
- 再把章节转换成与翻译引擎通信的格式
- 最后把所有得到的单个参数打包成一个完整的章节参数。
Java8后,不是不需要遍历集合,而是有了更好的遍历集合方式。函数式编程,大部分操作都可归结成列表转换,最核心的列表转换就是 map、filter 和 reduce。
大部分循环语句都是在对一个元素集合进行操作,而这些操作基本上都可以用列表操作进行替代。
再CR这段代码,有一循环语句,这循环语句在处理的是一个集合中的元素,可用列表转换:
有人可能说这段代码还不如我原来的循环语句简单。两种写法根本差异是抽象层次不同,可读性完全不同:
-
循环语句是在描述实现细节
必须要做一次“阅读理解”知晓其中细节才能知晓整个场景 -
列表转换的写法是在描述做什么
基本上和我们用语言叙述过程对应。
其实大多数人选择循环语句只是因为对列表转换不熟练,多写即可。
为什么我的感觉实践中,使用这种风格,为写出来的代码更难理解?
你在列表转换过程中写了太多代码!很多人直接在列表转换过程中写 lambda。lambda 本身相当于一个匿名函数,所以,很多人写成长函数了。
lambda 是为了写短小代码提供的便利,所以,lambda 中写出大片代码,根本就是违反 lambda 设计初衷的。最好的 lambda 应只有一行代码。
那若一个转换过程中就有很多操作咋办?
提取出一个函数!就像 toSectionParameter:完成从 Section 到 SectionParameter 转换。这样一来,列表转换的本身就完全变成了一个声明,这样的写法才是能发挥出列表转换价值的写法。
总结
代码风格逐步演化,每个程序员对语言的理解程度都有所差异,所以,我们的屎山项目中,各种代码风格并存,各具风骚,加重代码理解难度,这其实就是:不一致的坏味道。
编程风之所以格会过时,是因为它存在问题,新风格就是用更好方案,注意跟上时代,拥抱变化,多用新特性!