扁平化代码的改变人生的魔力
情况是这样的,你遇到一段代码,需要理解它的含义。阅读代码的过程中,你会逐渐构建出各个部分如何运作的心理模型,然后慢慢地,你脑海中积累了足够的信息,就能发现潜在的错误或需要改进的地方。
问题在于,这样做很费力,而且我们只能准确地记住非常少的代码,否则就会开始过度概括或丢失细节。
当我与开发团队合作时,我经常会教他们如何扁平化代码。这个概念很容易理解,但本文将只重点介绍一种扁平化代码的方法:if 语句。
我们来看一段常见的代码块:
function doAwesomeWork(isNotUnset) {
result = null
if(isNotUnset) {
for(int i = 0; i < 20; i++) {
result = ...
}
}
else {
return result
}
}
好的,这虽然不是我能写出的最复杂的东西,但它确实能锻炼思维。我们必须记住变量result的作用,第一个条件判断中要检查的是什么if,第二个条件判断的目的for,以及在这个过程中变量result被赋值为什么。然后我们还要记住,如果isNotUnset条件判断为假,则返回空值result。
另外,我isNotUnset那样命名纯粹是为了刁难别人。不过我敢肯定,你在任何你见过的代码库里都能轻易找到类似的例子。
以下是我简化 if 语句的方法:
function doAwesomeWork(isNotUnset) {
if(!isNotUnset) {
return null
}
result = null
for(int i = 0; i < 20; i++) {
result = ...
}
return result
}
阅读这段文字的方式略有不同。我们检查第一个要点if,可能就完成了。在理解之后,我们可以将其视为一个独立的部分,无需再去记忆。
现在我们来看看它的核心功能。当我看到这个函数时,我很快就能看出它是关于循环的。我可以专注于循环本身的行为,而不用去记住触发循环的条件。
这就是这项技术的核心所在。因此,扁平化语句的目标if是:
- 尽可能将业务逻辑放在靠近左边距的位置。
- 使用条件语句处理错误和异常。
else尽可能删除语句
在这种情况下,业务逻辑就是循环for,所以我希望它放在左边。我打破if包含业务逻辑的循环的方法是将其用作错误检查。我反转了逻辑并将其转换为提前返回。这样,如果前提条件正确,函数就只执行业务逻辑。
编写代码时,不妨尝试一下这种技巧。你会发现代码更容易理解、重构和测试。
各位开发者们,我推出了一份面向希望在职业生涯中取得更大成就的开发者的电子报。快来看看吧!
图片来源:Unsplash
文章来源:https://dev.to/recursivefaults/the-life-changing-magic-of-flat-code-h0m