I have taken to defining design as the act of organizing source code in order to reduce the cost of changing it, which typically means reducing the cost of figuring out how to change it safely and accurately.
This tends to translate into "make it easier to find/notice things" and "make it harder to miss related things". "Good" design helps us figure out which parts to try to change and which parts to try to leave alone, while tests help us discover surprises sooner.
This seems quite compatible with your formulation of relating elements beneficially.
I have taken to defining design as the act of organizing source code in order to reduce the cost of changing it, which typically means reducing the cost of figuring out how to change it safely and accurately.
This tends to translate into "make it easier to find/notice things" and "make it harder to miss related things". "Good" design helps us figure out which parts to try to change and which parts to try to leave alone, while tests help us discover surprises sooner.
This seems quite compatible with your formulation of relating elements beneficially.
My formulation is more abstract. I like yours.