最近我被带到了一个新的代码库,在那里我看到了很多这样的代码,几乎无处不在
if(a && a.b && a.b.c && a.b.c.d) {
// do something with d
}
引起我注意的是,由于该产品产生了大量的 $$$,我们确实需要避免运行时错误。所以这最终成为团队中的惯用语,每次你想要一个对象中的某些东西时,都使用上面的语法。
但正如您所想的那样,这并不是在任何地方都强制执行的(尤其是在这可能很重要的地方),更糟糕的是,它在我们已经验证对象形状的区域成为了一种习惯。
所以这是我的问题:你会建议什么来帮助改变一个采取这种低效习惯(虚假的安全感)的团队来防御性地检查每个加入。
这里有一些想法,但我很高兴听到您的故事和您的经验反馈。
一些想法:
- go ts 或 babel 并使用可选链接 => 不会改变问题,但会(不是?)简化语法
- 强制使用唯一的助手来安全访问(custom / lodash.get / ramda.pathOr, ...)
- 教育团队了解镜头概念并使用这些概念
- 在数据层和表示层之间添加一个强大的验证层
- 展平嵌套对象并使用展平形式 (
{ a: { b: 2 }, c: [3,4]} ==> { 'a.b': 2, 'c.0': 3, 'c.1': 4 }
) - ...