节点锚点和引用有什么问题?
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
上面的文档具有完全不同的且略微复杂的模式,但它从根本上以更清晰的方式表示与上面节点/锚点版本相同的数据,而没有重复。