验证语句难以阅读

Validating statement hard to read

我需要根据 sintaxis/structure 理解此语句的含义:

defaultValue: (closureData != undefined) ? (closureColl[i]) ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea] : (areaFixedValue) ? [areaFixedValue] : (areaDefaultValue) ? [areaDefaultValue] : [] : []

我习惯了遵循语法 (condition) ? 'if true' : 'if false'

两个“?”是什么意思?连续是什么意思?

它们是嵌套的 ternary conditional operators。以这种方式嵌套三元组通常被认为是非常糟糕的做法,因为你 运行 进入其中的原因是它们变得非常难以理解。您可以通过适当的缩进和括号使用来提高可读性,但该行甚至没有。

考虑一下如果你只有一个三元:

const foo = isBarTrue ? trueValue : falseValue;

但是考虑一下 trueValue 本身是否是一个三元表达式,因为您几乎可以任意嵌套表达式:

const foo = isBarTrue ? (isBazTrue ? truestValue : trueValue) : falseValue;

如果去掉括号,会更加混乱到不可读的地步:

const foo = isBarTrue ? isBazTrue ? truestValue : trueValue : falseValue;

一个有助于提高可读性的惯例是像这样缩进三元组(有一些方便的 eslint 和 prettier 插件会自动为您执行此操作,这很好)。基本上每个 ? 都会形成一个新的嵌套级别,由缩进线表示,而 : 符号“关闭”该嵌套级别并将下一行移出到最后一行的缩进级别无与伦比 ?。起初有点令人困惑,但这里是实际操作:

const foo = isBarTrue
  ? isBazTrue
    ? truestValue
    : trueValue
  : falseValue;

你给出的表达式比我的例子更糟糕,看起来像四个嵌套的三元条件运算符(你可以数出?的个数)这太糟糕了。我很快会回来编辑这个 post 看看我是否可以帮助你理清它。

编辑:要解决这个问题,一种方法是重构并提取具有“a ? b : c”形式的每个单独的三元组,而没有任何奇怪的双数,如“x : y : z”。尝试拉出一旦拉出就似乎有意义的三元组 - 有时从表达式的每个“末端”开始并交替拉出单个表达式会很有帮助。此外,re-writing 它与上面的缩进样式非常有帮助。

如果我们从这里开始:

const defaultValue = (closureData != undefined) ? (closureColl[i]) ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea] : (areaFixedValue) ? [areaFixedValue] : (areaDefaultValue) ? [areaDefaultValue] : [] : [];

尝试用缩进样式重写它:

const defaultValue = (closureData != undefined)
  ? (closureColl[i])
    ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea]
    : (areaFixedValue)
      ? [areaFixedValue]
      : (areaDefaultValue)
        ? [areaDefaultValue]
        : []
  : [];

现在我们可以这样重写它,取出最后一个“完整”的三元组,它本身就有意义,(areaDefaultValue) ? [areaDefaultValue] : []。记得用新的等价值替换原来三元组中的表达式:

const conditionalAreaDefaultValue = (areaDefaultValue)
 ? [areaDefaultValue]
 : [];

const defaultValue = (closureData != undefined)
  ? (closureColl[i])
    ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea]
    : (areaFixedValue)
      ? [areaFixedValue]
      : conditionalAreaDefaultValue
  : [];

然后,取出第一个“完整”三元组,它本身也有点意义,(closureColl[i]) ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea] : (areaFixedValue):

const conditionalAreaDefaultValue = (areaDefaultValue)
  ? [areaDefaultValue]
  : [];

const conditionalCollValue = (closureColl[i])
  ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea]
  : (areaFixedValue);

const defaultValue = (closureData != undefined)
  ? conditionalCollValue
    ? [areaFixedValue]
    : conditionalAreaDefaultValue
  : [];

从这里开始,其余的嵌套三元组更容易理解,看起来中间部分正在做很多工作来确定该表达式的“最终”值。让我们把那部分拉出来,conditionalCollValue ? [areaFixedValue] : conditionalAreaDefaultValue:

const conditionalAreaDefaultValue = (areaDefaultValue)
  ? [areaDefaultValue]
  : [];

const conditionalCollValue = (closureColl[i])
  ? [closureColl[i].collaboratorGroup + "--" + closureColl[i].collaboratorArea]
  : (areaFixedValue);

const conditionalFinalValue = conditionalCollValue
  ? [areaFixedValue]
  : conditionalAreaDefaultValue;

const defaultValue = (closureData != undefined)
  ? conditionalFinalValue
  : [];

您可以在此处进行更多重构,尤其是命名或将内容转换为 if 语句,但我会把它留给您。希望这个练习首先能阐明该表达式到底是怎么回事。