An Empty Line is a Code Smell

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

这个主题听起来像是一个笑话,但事实并非如此。一个空行,用作对象方法中指令的分隔符,是一种代码异味。为什么呢?简而言之,因为一个方法不应该包含“部分”。一个方法应该始终只做一件事,并且它的功能分解应该由语言结构(例如新方法)完成,而绝不是通过空行来实现。

看看这个Java类(闻起来有点异味,对吧?):

这个方法首先加载文件的内容。其次,它计算了与提供的正则表达式匹配的行数。所以为什么方法 grep 会有异味呢?因为它做了两件事情而不是一件事情——它加载和匹配。

如果我们制定一个规则,要求在方法体中避免空行,那么为了保持由那个空行引入的 “关注分离”,这个方法将不得不进行重构。

我相信很明显,这个新的类具有更加凝聚和可读性更强的方法。现在每个方法都只做一件事情,很容易理解它是做什么的。

避免空行的这个想法也适用于其他语言,不仅仅是Java/C++/Ruby等。例如,这段CSS代码明显需要进行重构。

这里的空行告诉我们(实际上在向我们尖叫),这个 .container 类太复杂了,需要分解成两个类:

很不幸,使用空行来分隔代码块是一种非常普遍的习惯。而且,我经常看到连续两行甚至三行的空行,它们都扮演着这种恶劣的关注点分离的角色。

不用说,一个合理设计的类必须只有几个公共方法,而一个合理设计的方法必须最多只有十个指令(根据Bob Martin的说法)。方法内的空行鼓励我们打破这个很棒的规则,将它们变成多页的诗歌。

当然,只需点击几次“回车”键并继续在同一个方法中编写代码要比先思考和重构容易得多。这种懒惰最终会导致代码几乎无法维护。

为了防止这种情况在您的项目中发生,完全停止在方法内使用空行。理想情况下,在自动构建中禁止使用它们。在我们所有的Java项目中使用的静态分析工具qulice.com中,我们创建了一个自定义的Checkstyle检查,禁止在每个方法中使用空行。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 13:29

sixnines availability badge   GitHub stars