What is wrong with node anchors and references?
An example of a snippet of YAML that uses node anchors and references is described on the 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
While the intent of the feature is obvious (it lets you deduplicate code), the effect is to make the markup more or less unreadable to non-programmers.
The example above could be refactored to be clearly as follows:
# 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
The intent of this document is a lot clearer than the version above - especially for non-programmers. However, it comes at a cost of increased repetition.
Between the node/anchor version and this I would prefer this.
However, it is still repetitive and ideally it should be non-repetitive and still clear. This can be done by refactoring the structure of the document and changing the way the application interprets it.
For example, instead of representing using the schema above, a schema that separates step definitions from actual steps could be used. For example:
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
The above document has an entirely different and slightly complex schema but it fundamentally represents the same data as the node/anchor version above, in a clearer manner, without duplication.