认知负荷是关键
非常建议直接读原文
介绍
现在有很多流行语和最佳实践,但让我们关注一些更基本的东西。重要的是,开发人员在阅读代码时会感到多少困惑。
混乱会耗费时间和金钱。混乱是由高认知负荷引起的。这不是一些花哨的抽象概念,而是人类的基本约束。
因为我们花在阅读和理解代码上的时间远远多于写代码的时间,所以我们应该不断地问自己是否在代码中嵌入了过多的认知负荷。
认知负荷
认知负荷是指开发人员为完成一项任务需要思考的程度。
阅读代码时,您会将变量值、控制流逻辑和调用序列等内容放入脑海中。一般人的工作记忆中可以容纳大约四个这样的块。一旦认知负荷达到这个阈值,理解事物就会变得更加困难。
*比方说,我们被要求对一个完全陌生的项目进行一些修正。我们被告知,一位非常聪明的开发人员为该项目做出了贡献。他使用了很多很酷的架构、花哨的库和时髦的技术。换句话说,作者为我们创造了很高的认知负荷。
我们应尽可能减少项目中的认知负荷。
认知负荷的类型
内在 - 由任务的内在难度造成。它无法降低,是软件开发的核心。
外来 - 信息呈现方式造成的。由与任务无直接关系的因素造成,如聪明的作者的怪癖。可以大大减少。我们将重点讨论这类认知负荷。
让我们直接跳到无关认知负荷的具体实例。
我们将认知负荷水平称为如下:
🧠:新鲜工作记忆,零认知负荷
🧠++:我们工作记忆中的两个事实,认知负荷增加
🤯:工作记忆溢出,超过 4 个事实
我们的大脑要复杂得多且未经探索,但我们可以采用这个简单化的模型。
复杂条件句
if val > someConstant // 🧠+
&& (condition2 || condition3) // 🧠+++, prev cond should be true, one of c2 or c3 has be true
&& (condition4 && !condition5) { // 🤯, we are messed up by this point
...
}
引入具有有意义名称的中间变量:
isValid = val > someConstant
isAllowed = condition2 || condition3
isSecure = condition4 && !condition5
// 🧠, we don't need to remember the conditions, there are descriptive variables
if isValid && isAllowed && isSecure {
...
}
嵌套 if
if isValid { // 🧠+, okay nested code applies to valid input only
if isSecure { // 🧠++, we do stuff for valid and secure input only
stuff // 🧠+++
}
}
与早期回报进行比较:
if !isValid
return
if !isSecure
return
// 🧠, we don't really care about earlier returns, if we are here then all good
stuff // 🧠+
我们可以只专注于快乐的道路,从而将我们的工作记忆从各种先决条件中解放出来。
继承噩梦
我们被要求为我们的管理员用户更改一些内容:🧠
AdminController 扩展了 UserController 扩展了 GuestController 扩展了 BaseController
- 部分功能在
BaseController
中,让我们看一下:🧠+
- 在
GuestController
中引入了基本角色机制:🧠++
- 在
UserController
中进行了部分更改:🧠+++
- 终于到了,
AdminController
,让我们编写代码吧!🧠++++
- 等等,有一个扩展了“AdminController”的“SuperuserController”。通过修改“AdminController”,我们可以破坏继承类中的内容,所以让我们首先深入了解“SuperuserController”:“🤯”
优先选择组合而不是继承。