Definition
A software-engineering principle that decomposes a system into distinct modules or layers, each addressing a separate responsibility, so that overlapping responsibilities are minimized and changes are localized.
Principle
Principle
Systems should be factored so that each module handles a single concern or cohesive set of related concerns; interfaces and encapsulation are used to control dependencies and limit the ripple effects of change.
Demonstration
Demonstration
Model–View–Controller separates data model, presentation, and user input handling; a layered architecture splits transport, processing, and persistence concerns into separate services or components.
Misapplication
Misapplication
Over-separating into too many tiny modules (excessive modularization) which increases orchestration complexity and runtime overhead, or creating separations that leak abstractions and force cross-cutting duplication.
Consequence
Consequence
When well-applied, increases maintainability, testability, parallel development, and reuse; it clarifies responsibilities and makes reasoning about system behavior easier.
Reversal
Reversal
A monolithic design with entangled responsibilities resulting in tight coupling and difficulty of change; concerns intermixed such that modifying one feature requires changes across unrelated code.
Boundary
Boundary
Applies to architectural and design levels but must account for cross-cutting concerns (logging, security, transactions) that cannot be cleanly isolated; performance, latency, and operational constraints sometimes justify deliberate coupling.
Semantic Tension
Semantic Tension
Tension with DRY (don't repeat yourself) and performance: fully separating concerns may require some duplication or indirection; tension also with YAGNI (you aren’t gonna need it) when separation anticipates unneeded generality.
Synthesis
Synthesis
Separation of concerns is the organizing strategy of partitioning a system by responsibility and managing their interactions via well-defined interfaces; it trades design simplicity and modularity against complexity from over-abstraction and operational constraints.