没有语言是完美的。


因语言演化,不同时期不同版本的程序员写的代码,在用同一门语言在编程。所以,我们经常看到各种不同时期风格代码并存。

新的语言特性都是为提高代码表达性,减少犯错几率。多用新语言特性写代码,绝对没毛病!


那应该如何使用“新”语言特性,让代码写得更好?


Optional

#yyds干货盘点# 最好的编程语言是怎样的?_语言特性

暂不考虑缺乏封装问题。这段代码有问题。因为未考虑对象可能为 null。

更好的写法:

#yyds干货盘点# 最好的编程语言是怎样的?_代码风格_02

这种写法很稀缺,所以,新项目总是各种NPE。如果你要问程序员为什么不写对象为 null 的判断,答曰:忘了。


空指针的发明者 Tony Hoare 将其称为“自己犯下的十亿美元错误”。


还好Java 8有Optional,它提供了一个对象容器,你需要从中“取出(get)”你所需要对象,但取出前,你需判断该对象容器中是否真的存在一个对象。

#yyds干货盘点# 最好的编程语言是怎样的?_语言特性_03

你再不会忘掉判断对象是否存在,因为你需要从 Optional 取出存在里面的对象。正是这多余的一步,避免你“忘”了。

更简洁的写法:

#yyds干货盘点# 最好的编程语言是怎样的?_代码风格_04

项目中所有可能为 null 的返回值,都要返回 Optional,可大大减少各种意外惊喜。

函数式编程

#yyds干货盘点# 最好的编程语言是怎样的?_java_05

准备参数的代码:


  • 筛选出审核通过的章节
  • 再把章节转换成与翻译引擎通信的格式
  • 最后把所有得到的单个参数打包成一个完整的章节参数。

Java8后,不是不需要遍历集合,而是有了更好的遍历集合方式。函数式编程,大部分操作都可归结成列表转换,最核心的列表转换就是 map、filter 和 reduce。

大部分循环语句都是在对一个元素集合进行操作,而这些操作基本上都可以用列表操作进行替代。

再CR这段代码,有一循环语句,这循环语句在处理的是一个集合中的元素,可用列表转换:

#yyds干货盘点# 最好的编程语言是怎样的?_原力计划_06

有人可能说这段代码还不如我原来的循环语句简单。两种写法根本差异是抽象层次不同,可读性完全不同:


  • 循环语句是在描述实现细节
    必须要做一次“阅读理解”知晓其中细节才能知晓整个场景
  • 列表转换的写法是在描述做什么
    基本上和我们用语言叙述过程对应。


其实大多数人选择循环语句只是因为对列表转换不熟练,多写即可。


为什么我的感觉实践中,使用这种风格,为写出来的代码更难理解?

你在列表转换过程中写了太多代码!很多人直接在列表转换过程中写 lambda。lambda 本身相当于一个匿名函数,所以,很多人写成长函数了。

lambda 是为了写短小代码提供的便利,所以,lambda 中写出大片代码,根本就是违反 lambda 设计初衷的。最好的 lambda 应只有一行代码。


那若一个转换过程中就有很多操作咋办?


提取出一个函数!就像 toSectionParameter:完成从 Section 到 SectionParameter 转换。这样一来,列表转换的本身就完全变成了一个声明,这样的写法才是能发挥出列表转换价值的写法。

总结

代码风格逐步演化,每个程序员对语言的理解程度都有所差异,所以,我们的屎山项目中,各种代码风格并存,各具风骚,加重代码理解难度,这其实就是:不一致的坏味道。

编程风之所以格会过时,是因为它存在问题,新风格就是用更好方案,注意跟上时代,拥抱变化,多用新特性!