开发者生态
morning
我总是被“真、假、真”绊倒
2026-05-11
1 阅读
AllThingsSmitty
我经常打开 PR 并看到类似这样的内容:deployFeature(flag, true, false, true);我遇到这种事的次数比我想象的要多。不是因为它很复杂。只是因为我不知道我在看什么。所以我点击进入函数定义,滚动一下,失去我的位置,跳回来,重新阅读该行......然后它才点击。微小的中断。每次还是很烦人。我不再阅读代码,而是对其进行解码 这是一个更简单的代码:createUser(user, true, false);这意味着什么?用户是管理员吗?我们是发送欢迎电子邮件还是跳过验证?我不知道。那时我不再真正阅读代码,而是对其进行解码。这个有一个名字(“标志参数”,有时是“布尔盲性”),但老实说,我真的不需要这个术语来感受到这个问题。这就是评论潜入的地方,我之前肯定写过:createUser(user, true, false); // isAdmin, sendWelcomeEmail 哪种方式暴露了整个事情。如果函数调用需要注释来解释参数,那么 API 可能对我不利。为什么当时感觉很好因为当我编写函数时,感觉非常合理: function createUser(user, isAdmin, sendWelcomeEmail) { // ... } 没有额外的对象。没有额外的结构,只需传入值并继续。我已经做过很多次了,没有多想。直到后来当我读到电话网站时,我才开始感觉不对劲。这种便利通常会在以后由必须阅读它的人付费。包括两周后的我。我现在使用的大多数时候,我只是使用一个对象:createUser(user, { isAdmin: true, sendWelcomeEmail: false, });现在我实际上可以知道发生了什么,而无需跳回函数定义。而且它的扩展非常自然: createUser(user, { isAdmin: true, sendWelcomeEmail: false,skipValidation: true, });尝试将位置布尔值延伸那么远,而不会让事情变得尴尬。有时布尔值隐藏不同的操作 createUser(user, true);如果 true 真的意味着“创建一个管理员用户”,那可能就不再是一个标志了。这是一个不同的动作。所以我通常会明确说明:createAdminUser(user);创建常规用户(用户);现在没有太多需要解释的了。公平地说,这并不总是坏事,有时这完全没问题:toggleMenu(true);这已经很清楚了。这往往在以下情况下起作用: 含义很明显 函数很小并且是本地的 只有一个标志 但是一旦我添加第二个布尔值,可读性通常会很快下降。 TypeScript 并没有真正保存这个 TypeScript 告诉我这些值是布尔值。这并不是真正的问题。创建用户(用户,真,假);这些类型在技术上是正确的。我仍然必须记住这些论点的含义。对我来说更有帮助的是切换到选项对象: createUser(user, { isAdmin: true, sendWelcomeEmail: false, });或者有时只是完全替换布尔值:createAdminUser(user);通常这表明该标志隐藏了两种不同的操作。相同的行为,更容易阅读之前: fetchData(url, false, true, 3);之后: fetchData(url, { useCache: false, retryOnFail: true, 重试次数: 3, });我在生产代码中看到过这样的真实调用: updateSettings(user, true, false, true, false);那时我又开始用手指数争论了。同样的行为。精神负担少了很多。为什么这一直浪费我的时间大多数时候,我不是在写代码。我正在努力理解它。是的,有时该代码是我几周前的。每次我遇到类似的情况时: updateSettings(user, true, false, true, false);我最终做了同样的事情:停下来尝试记住每个论点的含义。这是一个微小的减速带。只有一个我似乎一遍又一遍地击中。 JavaScript 打字稿