Separation of concerns
From Wikipedia, the free encyclopedia
In computer science, separation of concerns (SoC) is the process of breaking a program into distinct features that overlap in functionality as little as possible. A concern is any piece of interest or focus in a program. Typically, concerns are synonymous with features or behaviors.
SoC is a long standing idea that simply means a large problem is easier to manage if it can be broken down into pieces; particularly so if the solutions to the sub-problems can be combined to form a solution to the large problem. SoC can be supported in many ways: by process, by notation, by organization, by language mechanism and others.[1]
All programming paradigms aid developers in the process of SoC. For example, object-oriented programming languages such as the Java programming language can separate concerns into classes and methods, and, in a more ample point of view, a design pattern, like MVC, can separate content from presentation, and data-processing (model) from content. Service-oriented design can separate concerns into services and operations. Procedural programming languages such as C and Pascal can separate concerns into procedures. Aspect-oriented programming languages can separate concerns into aspects.
Progress towards SoC is traditionally achieved through modularity and encapsulation (with the help of information hiding).
Separation of concerns is an important design principle in many other areas as well, such as urban planning, architecture and information design. The goal is to design systems so that functions can be optimized independently of other functions, so that failure of one function does not cause other functions to fail, and in general to make it easier to understand, design and manage complex interdependent systems. Common examples include using corridors to connect rooms rather than having rooms open directly into each other, and keeping the stove on one circuit and the lights on another.
Contents |
[edit] Origin
The term separation of concerns was probably coined by Edsger W. Dijkstra in his paper On the role of scientific thought.
Let me try to explain to you, what to my taste is characteristic for all intelligent thinking. It is, that one is willing to study in depth an aspect of one's subject matter in isolation for the sake of its own consistency, all the time knowing that one is occupying oneself only with one of the aspects. We know that a program must be correct and we can study it from that viewpoint only; we also know that it should be efficient and we can study its efficiency on another day, so to speak. In another mood we may ask ourselves whether, and if so: why, the program is desirable. But nothing is gained --on the contrary!-- by tackling these various aspects simultaneously. It is what I sometimes have called "the separation of concerns", which, even if not perfectly possible, is yet the only available technique for effective ordering of one's thoughts, that I know of. This is what I mean by "focussing one's attention upon some aspect": it does not mean ignoring the other aspects, it is just doing justice to the fact that from this aspect's point of view, the other is irrelevant. It is being one- and multiple-track minded simultaneously.
[edit] Examples
eXtensible HyperText Markup Language and Cascading Style Sheets are languages intended to separate style from content. Where XHTML elements define the abstract structure of a document, CSS directives are interpreted by the web browser to render those elements in visual form. In practice, one must sometimes alter XHTML in order to obtain the desired result with CSS, in part because style and content are not completely orthogonalized by any existing browser implementation of CSS, and in part because CSS does not allow one to remap the document tree.
[edit] See also
- Implementation inheritance
- Inheritance semantics
- Virtual inheritance
- Model Driven Architecture (MDA)
- Model-view-controller (MVC) a widely used separation strategy.
- Procedural programming
- Object-oriented programming
- Service oriented analysis and design
- Service-orientation
- Aspect-oriented programming
- Aspect
- Core concern
- Cross-cutting concern
- Modularity (programming)
- Encapsulation
- Refactoring
- Don't repeat yourself
- Database normalization