让Java代码变的更容易阅读

原文地址

现代支持java虚拟机语言例如Kotlin,Groovy,Scala 以及其它的许多语言特性让你写代码以一种更简洁、更有表现力的方式。这些特性包括类型推断,属性,插入字符串,范围和元祖文字,增强操作符,闭包,隐喻,智能类型转换等。甚至过去总是非常保守的语言java在version8引入lambda语法让代码不要那么啰嗦。
在java8之前Intellj IDEA 已经用它的折叠功能去模仿lambda语法让代码更具可读性:

让Java代码变的更容易阅读_第1张图片
Paste_Image.png

如果你展开被折叠的代码,你将会看到如下代码:

让Java代码变的更容易阅读_第2张图片
Paste_Image.png

如果你用java7或之前的版本。 IntelliJ IDEA 依然这样折叠代码为了更好的阅读性。
因为我个人是Kotlin的粉丝,但是每天必须写一大堆java代码。所以我决定去扩展IDE的折叠功能区模仿一些现代的语言特性帮助解决冗长的代码。因此我制作了一个 IntelliJ IDEA 的插件。我在这边博客里简要的介绍一些最有趣的特性。

插入字符串

看这个例子:

Paste_Image.png

如果java提供插入字符串,它看起来像这样。

Paste_Image.png

这个插件通过折叠模仿的非常像,当一个插入字符串包含表达式:

Paste_Image.png

注意,折叠不会打乱语法高亮和代码导航。

字符串拼接

现在看这个例子:

让Java代码变的更容易阅读_第3张图片
Paste_Image.png

如果我们用隐式转换和增强字符串的概念。我们将会得到如下代码:

让Java代码变的更容易阅读_第4张图片
Paste_Image.png

依然很清晰但是更简洁和更具可读性。
字符串和列表的切割操作:
现在看这个例子:

Paste_Image.png

这里我们请求了一个子字符串根据字符串的长度。假如java提供Python提供的字符串切割操作?如果你开启了插件里的相应选项,你将会在代码里得到如下模仿功能:

Paste_Image.png

变量声明

现在看这个例子:

让Java代码变的更容易阅读_第5张图片
Paste_Image.png

这里我们用int变量来保存state,当你读代码的时候,类型并不总是像语义一样重要。因为所有的变量是可变的。
假如java有类型推断,并且所有的开发者总是使用合理的使用final。这听起来有些理论但是IDE能够模仿这个特性通过折叠和数据流分析:

让Java代码变的更容易阅读_第6张图片
Paste_Image.png

关于循环

现在看这个例子,我们遍历一个集合并且访问它的item和index:

让Java代码变的更容易阅读_第7张图片
Paste_Image.png

如果Java支持元组我们的代码将会变的更具可读性:

让Java代码变的更容易阅读_第8张图片
Paste_Image.png

如果和上图的折叠一起使用,将会更清晰:

让Java代码变的更容易阅读_第9张图片
Paste_Image.png

让我们看另一个例子,遍历一个数组但是不访问它的items:

让Java代码变的更容易阅读_第10张图片
Paste_Image.png

如果Java支持range literals,上图能以一种更简洁的方式么?至少插件让它成为了可能:

让Java代码变的更容易阅读_第11张图片
Paste_Image.png

Equals and compareTo

现在我们看这个例子:

让Java代码变的更容易阅读_第12张图片
Paste_Image.png

这是Java强制我们去写的由于指示性的相等。如果Java使用了结构性的相等操作符,这将会使代码更短和清晰:

让Java代码变的更容易阅读_第13张图片
Paste_Image.png

同样的方法适用于不相等:

让Java代码变的更容易阅读_第14张图片
Paste_Image.png

那么关于compareTo呢?

让Java代码变的更容易阅读_第15张图片
Paste_Image.png

如果Java支持增强操作符,我们可以简化成这样:

让Java代码变的更容易阅读_第16张图片
Paste_Image.png

属性

现在看看下面的代码,看起来似曾相识,难道不是吗?

让Java代码变的更容易阅读_第17张图片
Paste_Image.png

这种语法特别啰嗦,每个属性用getter和setter去访问。
假如Java像Kotlin的方式去访问属性值呢?

让Java代码变的更容易阅读_第18张图片
Paste_Image.png

这将更具可读性且减少30%的代码。如果你更喜欢这种方式,你可以开启插件里的相应选项。当然,对于setters也一样适用:

Paste_Image.png

Collections

如果Java支持增强操作符并且集合提供add、addAll、remove、removeAll方法?看下面这些代码:

让Java代码变的更容易阅读_第19张图片
Paste_Image.png

插件将会模仿这些操作符让语义更清晰:

让Java代码变的更容易阅读_第20张图片
Paste_Image.png

另一个例子:

让Java代码变的更容易阅读_第21张图片
Paste_Image.png

如果list有first()和last()方法(举例来说:像其他JVM语言那样)?

让Java代码变的更容易阅读_第22张图片
Paste_Image.png

这样是不是更具可读性?

Smart casts

想象一下当我们检查一个实例是否是某种对象的类型的时候:

让Java代码变的更容易阅读_第23张图片
Paste_Image.png

如果Java支持smart casts 像Kotlin,我们将会有更清晰,更简洁的代码:

让Java代码变的更容易阅读_第24张图片
Paste_Image.png

Safe calls

看这个例子:

Paste_Image.png

我们用Java的elvis 表达式去检查是否为空。我们是否能够模仿Groovy和Scala提供的safe calls使它更具表达力呢?

Paste_Image.png

注意:所以上面提及的折叠方式在插件中都是可选的,如果你决定尝试一下,请安装 这个插件。同时我非常欢迎收到你对问题的反馈。
Bug 和需求可以反馈到 这里。
Develop with Pleasure!

你可能感兴趣的:(让Java代码变的更容易阅读)