Sometimes an application will start out with a need for just a configuration format, but over time you end up with many many similar stanzas, and you would like to share parts between them, and abstract some repetition away. This tends to happen in for example Kubernetes and GitHub Actions. When the configuration language does not support abstraction, people often reach for templating, which is a bad idea for the reasons explained earlier. Proper programming languages, possibly domain-specific ones, are a better fit. Some of my favorites are Nix and Python:
inheritance looks cleaner because it comes with abstraction, hiding some things. It creates a contract telling the user what to expect. E.g. every image child class has save & load.
An interface allows us to do this while using composition.
The fine-grained dependencies can ensure a minimum of compute upon a given change. The TOP nodes can play a number of different roles that will replace manual work and scripts that can bog down a complex studio pipeline. You can even set up TOP networks that fetch other TOP networks to create multiple levels of abstraction within your pipeline.