Listen to this post
Good design separates things that change for independent reasons. This is often called the “Separation of Concerns” (Edsger Dijkstra) and applies to many different aspects of design, process, and analysis.
Here are some examples of aspects of an entity that should ideally be handled separately from one another:
- The conceptual aspect: What it is
- The specification aspect: How to use it
- The implementation aspect: How it works
- The creation aspect: How it is made
- The selection aspect: How it is chosen
- The workflow view: How it collaborates
- The factory for an entity should make it but not use it.
- The clients to an entity should use it but not make it.
- Entities should be able to couple to each other conceptually, without also doing so concretely.
- Two entities should be able to interact in different ways with the same third entity.
By “entity,” I mean class, method, function, subsystem, or anything that creates behavior in a system. Patterns separate concerns in various ways, depending on what the concerns are.