One of the challenges when taking a model driven approach to system development is that we naturally create models of varying levels of complexity but then we need to be able to relate one model to another.
That is, not only do we want to be able to evaluate the model against the reified system, but we also want to evaluate models at higher levels of abstraction with those at lower levels of abstraction.
Essentially, we can see the higher fidelity model as a “refinement” of the more abstract model. Now, thinking of systems as being defined in terms of:
- subsystem boundaries, and
- data flows between subsystems
then we can begin to formalise the notion of a refinement, R, of some system, S, by stating that the boundaries of R must contained within the boundary defined in S. Similarly, the data flows between subsystems in R must be contained within the flows defined for S.
Following this line of reasoning one could potentially create a more formal definition akin to that of refinement of a topological cover in mathematics.
Pushing this further, it would be nice if we could build these concepts into the type system of a programming language for model based systems development. Then the compiler could generate warnings or errors when refinements violate the constraints of their overarching abstractions.