节点锚点和引用有什么问题?

YAML 维基百科页面上描述了一个使用节点锚点和引用的 YAML 片段示例 YAML wikipedia page

# sequencer protocols for Laser eye surgery
---
- step:  &id001                  # defines anchor label &id001
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm

- step: &id002
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm
- step: *id001                   # refers to the first step (with anchor &id001)
- step: *id002                   # refers to the second step
- step:
    <<: *id001
    spotSize: 2mm                # redefines just this key, refers rest from &id001
- step: *id002

虽然该功能的意图很明显(它允许您对代码进行重复数据消除),但其效果是使标记对非程序员来说或多或少难以阅读。

上面的示例可以重构为如下所示

# sequencer protocols for Laser eye surgery
---
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        2mm
- step:
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm

此文档的意图比上面的版本要清楚得多 - *尤其是* 对非程序员而言。 但是,它需要付出更高的重复代价。

在节点/锚点版本和这个版本之间,我更喜欢这个版本。

但是,它仍然是重复的,理想情况下应该是无重复且清晰的。 这可以通过重构文档的*结构* 和更改应用程序解释文档的方式来完成。

例如,与其使用上面的模式表示,可以采用将步骤定义与实际步骤分开的模式。 例如

step definitions:
  large:
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm
  medium:
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm
steps:
- step: large
- step: medium
- step: large
- step: medium
- step:
    from: large
    except:
      spotSize: 2mm
- step: large

上面的文档具有完全不同的且略微复杂的模式,但它从根本上以更清晰的方式表示与上面节点/锚点版本相同的数据,而没有重复。