![Separation of concerns](https://www.english.nina.az/wikipedia/image/aHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi84Lzg3L05vbi1lbmNhcHN1bGF0ZWQtdGFza3MtTlMuc3ZnLzE2MDBweC1Ob24tZW5jYXBzdWxhdGVkLXRhc2tzLU5TLnN2Zy5wbmc=.png )
In computer science, separation of concerns (sometimes abbreviated as SoC) is a design principle for separating a computer program into distinct sections. Each section addresses a separate concern, a set of information that affects the code of a computer program. A concern can be as general as "the details of the hardware for an application", or as specific as "the name of which class to instantiate". A program that embodies SoC well is called a modular program. Modularity, and hence separation of concerns, is achieved by encapsulating information inside a section of code that has a well-defined interface. Encapsulation is a means of information hiding. Layered designs in information systems are another embodiment of separation of concerns (e.g., presentation layer, business logic layer, data access layer, persistence layer).
![image](https://www.english.nina.az/wikipedia/image/aHR0cHM6Ly93d3cuZW5nbGlzaC5uaW5hLmF6L3dpa2lwZWRpYS9pbWFnZS9hSFIwY0hNNkx5OTFjR3h2WVdRdWQybHJhVzFsWkdsaExtOXlaeTkzYVd0cGNHVmthV0V2WTI5dGJXOXVjeTkwYUhWdFlpODRMemczTDA1dmJpMWxibU5oY0hOMWJHRjBaV1F0ZEdGemEzTXRUbE11YzNabkx6SXlNSEI0TFU1dmJpMWxibU5oY0hOMWJHRjBaV1F0ZEdGemEzTXRUbE11YzNabkxuQnVadz09LnBuZw==.png)
Separation of concerns results in more degrees of freedom for some aspect of the program's design, deployment, or usage. Common among these is increased freedom for simplification and maintenance of code. When concerns are well-separated, there are more opportunities for module upgrade, reuse, and independent development. Hiding the implementation details of modules behind an interface enables improving or modifying a single concern's section of code without having to know the details of other sections and without having to make corresponding changes to those other sections. Modules can also expose different versions of an interface, which increases the freedom to upgrade a complex system in piecemeal fashion without interim loss of functionality.[citation needed]
Separation of concerns is a form of abstraction. As with most abstractions, separating concerns means adding additional code interfaces, generally creating more code to be executed. The extra code can result in higher computation costs in some cases, but in other cases also can lead to reuse of more optimized code. So despite the many benefits of well-separated concerns, there may be an associated execution penalty.[citation needed]
Implementation
The mechanisms for modular or object-oriented programming that are provided by a programming language are mechanisms that allow developers to provide SoC. For example, object-oriented programming languages such as C#, C++, Delphi, and Java can separate concerns into objects, and architectural design patterns like MVC or MVP can separate presentation and the data-processing (model) from content. Service-oriented design can separate concerns into services. Procedural programming languages such as C and Pascal can separate concerns into procedures or functions. Aspect-oriented programming languages can separate concerns into aspects and objects.
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 more effectively understand, design, and manage complex interdependent systems, so that functions can be reused, optimized independently of other functions, and insulated from the potential failure of other functions.
Common examples include separating a space into rooms, so that activity in one room does not affect people in other rooms, and keeping the stove on one circuit and the lights on another, so that overload by the stove does not turn the lights off. The example with rooms shows encapsulation, where information inside one room, such as how messy it is, is not available to the other rooms, except through the interface, which is the door. The example with circuits demonstrates that activity inside one module, which is a circuit with consumers of electricity attached, does not affect activity in a different module, so each module is not concerned with what happens in the other.
Origin
The term separation of concerns was probably coined by Edsger W. Dijkstra in his 1974 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 "focusing 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.
Fifteen years later, it was evident the term separation of concerns was becoming an accepted idea. In 1989, Chris Reade wrote a book titled Elements of Functional Programming that describes separation of concerns:
The programmer is having to do several things at the same time, namely,
- describe what is to be computed;
- organise the computation sequencing into small steps;
- organise memory management during the computation.
Reade continues to say,
Ideally, the programmer should be able to concentrate on the first of the three tasks (describing what is to be computed) without being distracted by the other two, more administrative, tasks. Clearly, administration is important, but by separating it from the main task we are likely to get more reliable results and we can ease the programming problem by automating much of the administration.
The separation of concerns has other advantages as well. For example, program proving becomes much more feasible when details of sequencing and memory management are absent from the program. Furthermore, descriptions of what is to be computed should be free of such detailed step-by-step descriptions of how to do it, if they are to be evaluated with different machine architectures. Sequences of small changes to a data object held in a store may be an inappropriate description of how to compute something when a highly parallel machine is being used with thousands of processors distributed throughout the machine and local rather than global storage facilities.
Automating the administrative aspects means that the language implementor has to deal with them, but he/she has far more opportunity to make use of very different computation mechanisms with different machine architectures.
Examples
Internet protocol stack
Separation of concerns is crucial to the design of the Internet. In the Internet protocol suite, great efforts have been made to separate concerns into well-defined layers. This allows protocol designers to focus on the concerns in one layer, and ignore the other layers. The Application Layer protocol SMTP, for example, is concerned about all the details of conducting an email session over a reliable transport service (usually TCP), but not in the least concerned about how the transport service makes that service reliable. Similarly, TCP is not concerned about the routing of data packets, which is handled at the Internet layer.
HTML, CSS, JavaScript
HTML, CSS, and JavaScript are complementary languages used in the development of web pages and websites. HTML is mainly used for organization of webpage content, CSS is used for definition of content presentation style, and JavaScript defines how the content interacts and behaves with the user. Historically, this was not the case: prior to the introduction of CSS, HTML performed both duties of defining semantics and style.
Subject-oriented programming
Subject-oriented programming allows separate concerns to be addressed as separate software constructs, each on an equal footing with the others. Each concern provides its own class-structure into which the objects in common are organized, and contributes state and methods to the composite result where they cut across one another. Correspondence rules describe how the classes and methods in the various concerns are related to each other at points where they interact, allowing composite behavior for a method to be derived from several concerns. Multi-dimensional separation of concerns allows the analysis and composition of concerns to be manipulated as a multi-dimensional "matrix" in which each concern provides a dimension in which different points of choice are enumerated, with the cells of the matrix occupied by the appropriate software artifacts.
Aspect-oriented programming
Aspect-oriented programming allows cross-cutting concerns to be addressed as primary concerns. For example, most programs require some form of security and logging. Security and logging are often secondary concerns, whereas the primary concern is often on accomplishing business goals. However, when designing a program, its security must be built into the design from the beginning instead of being treated as a secondary concern. Applying security afterwards often results in an insufficient security model that leaves too many gaps for future attacks. This may be solved with aspect-oriented programming. For example, an aspect may be written to enforce that calls to a certain API are always logged, or that errors are always logged when an exception is thrown, regardless of whether the program's procedural code handles the exception or propagates it.
Levels of analysis in artificial intelligence
In cognitive science and artificial intelligence, it is common to refer to David Marr's levels of analysis. At any given time, a researcher may be focusing on (1) what some aspect of intelligence needs to compute, (2) what algorithm it employs, or (3) how that algorithm is implemented in hardware. This separation of concerns is similar to the interface/implementation distinction in software and hardware engineering.
Normalized systems
In separation of concerns is one of the four guiding principles. Adhering to this principle is one of the tools that helps reduce the combinatorial effects that, over time, get introduced in software that is being maintained. In normalized systems separation of concerns is actively supported by the tools.
SoC via partial classes
Separation of concerns can be implemented and enforced via partial classes.
SoC via partial classes in Ruby
- bear_hunting.rb
class Bear def hunt forest.select(&:food?) end end
- bear_eating.rb
class Bear def eat(food) raise "#{food} is not edible!" unless food.respond_to? :nutrition_value food.nutrition_value end end
- bear_hunger.rb
class Bear attr_accessor :hunger def monitor_hunger if hunger > 50 food = hunt hunger -= eat(food) end end end
See also
- Abstraction principle (programming)
- Aspect-oriented software development
- Concern (computer science)
- Coupling (computer science)
- Holism
- Modular design
- Modular programming
- Orthogonality § Computer science
- Single-responsibility principle
References
- Laplante, Phillip (2007). What Every Engineer Should Know About Software Engineering. CRC Press. ISBN 978-0-8493-7228-5.
- Mitchell, R. J. (1990). Managing Complexity in Software Engineering. IEE. p. 5. ISBN 0-86341-171-1.
- Microsoft Application Architecture Guide. Microsoft Press. 2009. ISBN 978-0-7356-2710-9.
- Painter, Robert Richard (2006). "Software Plans: Multi-Dimensional Fine-Grained Separation of Concerns". CiteSeerX 10.1.1.110.9227.
- Garofalo, Raffaele (2011). Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern. Microsoft Press. p. 18. ISBN 978-0-7356-5092-3.
- Dijkstra, Edsger W (1982). "On the role of scientific thought". Selected writings on Computing: A Personal Perspective. New York, NY, US: Springer-Verlag. pp. 60–66. ISBN 0-387-90652-5.
- (1989). Elements of Functional Programming. Boston, MA, US: Addison-Wesley Longman. ISBN 0-201-12915-9.
- Jess Nielsen (June 2006). "Building Secure Applications" (PDF). Retrieved 2012-02-08.
- Tiago Dias (October 2006). "Hyper/Net: MDSoC Support for .NET" (PDF). DSOA 2006. Retrieved 2007-09-25.
External links
- Multi-Dimensional Separation of Concerns
- TAOSAD Archived 2016-12-19 at the Wayback Machine
- Tutorial and Workshop on Aspect-Oriented Programming and Separation of Concerns Archived 2008-05-16 at the Wayback Machine
In computer science separation of concerns sometimes abbreviated as SoC is a design principle for separating a computer program into distinct sections Each section addresses a separate concern a set of information that affects the code of a computer program A concern can be as general as the details of the hardware for an application or as specific as the name of which class to instantiate A program that embodies SoC well is called a modular program Modularity and hence separation of concerns is achieved by encapsulating information inside a section of code that has a well defined interface Encapsulation is a means of information hiding Layered designs in information systems are another embodiment of separation of concerns e g presentation layer business logic layer data access layer persistence layer Diagram illustrating the principle of separation of concerns which says that an action entity can only contain a single type of tasks Separation of concerns results in more degrees of freedom for some aspect of the program s design deployment or usage Common among these is increased freedom for simplification and maintenance of code When concerns are well separated there are more opportunities for module upgrade reuse and independent development Hiding the implementation details of modules behind an interface enables improving or modifying a single concern s section of code without having to know the details of other sections and without having to make corresponding changes to those other sections Modules can also expose different versions of an interface which increases the freedom to upgrade a complex system in piecemeal fashion without interim loss of functionality citation needed Separation of concerns is a form of abstraction As with most abstractions separating concerns means adding additional code interfaces generally creating more code to be executed The extra code can result in higher computation costs in some cases but in other cases also can lead to reuse of more optimized code So despite the many benefits of well separated concerns there may be an associated execution penalty citation needed ImplementationThe mechanisms for modular or object oriented programming that are provided by a programming language are mechanisms that allow developers to provide SoC For example object oriented programming languages such as C C Delphi and Java can separate concerns into objects and architectural design patterns like MVC or MVP can separate presentation and the data processing model from content Service oriented design can separate concerns into services Procedural programming languages such as C and Pascal can separate concerns into procedures or functions Aspect oriented programming languages can separate concerns into aspects and objects 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 more effectively understand design and manage complex interdependent systems so that functions can be reused optimized independently of other functions and insulated from the potential failure of other functions Common examples include separating a space into rooms so that activity in one room does not affect people in other rooms and keeping the stove on one circuit and the lights on another so that overload by the stove does not turn the lights off The example with rooms shows encapsulation where information inside one room such as how messy it is is not available to the other rooms except through the interface which is the door The example with circuits demonstrates that activity inside one module which is a circuit with consumers of electricity attached does not affect activity in a different module so each module is not concerned with what happens in the other OriginThe term separation of concerns was probably coined by Edsger W Dijkstra in his 1974 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 focusing 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 Fifteen years later it was evident the term separation of concerns was becoming an accepted idea In 1989 Chris Reade wrote a book titled Elements of Functional Programming that describes separation of concerns The programmer is having to do several things at the same time namely describe what is to be computed organise the computation sequencing into small steps organise memory management during the computation Reade continues to say Ideally the programmer should be able to concentrate on the first of the three tasks describing what is to be computed without being distracted by the other two more administrative tasks Clearly administration is important but by separating it from the main task we are likely to get more reliable results and we can ease the programming problem by automating much of the administration The separation of concerns has other advantages as well For example program proving becomes much more feasible when details of sequencing and memory management are absent from the program Furthermore descriptions of what is to be computed should be free of such detailed step by step descriptions of how to do it if they are to be evaluated with different machine architectures Sequences of small changes to a data object held in a store may be an inappropriate description of how to compute something when a highly parallel machine is being used with thousands of processors distributed throughout the machine and local rather than global storage facilities Automating the administrative aspects means that the language implementor has to deal with them but he she has far more opportunity to make use of very different computation mechanisms with different machine architectures ExamplesInternet protocol stack Separation of concerns is crucial to the design of the Internet In the Internet protocol suite great efforts have been made to separate concerns into well defined layers This allows protocol designers to focus on the concerns in one layer and ignore the other layers The Application Layer protocol SMTP for example is concerned about all the details of conducting an email session over a reliable transport service usually TCP but not in the least concerned about how the transport service makes that service reliable Similarly TCP is not concerned about the routing of data packets which is handled at the Internet layer HTML CSS JavaScript HTML CSS and JavaScript are complementary languages used in the development of web pages and websites HTML is mainly used for organization of webpage content CSS is used for definition of content presentation style and JavaScript defines how the content interacts and behaves with the user Historically this was not the case prior to the introduction of CSS HTML performed both duties of defining semantics and style Subject oriented programming Subject oriented programming allows separate concerns to be addressed as separate software constructs each on an equal footing with the others Each concern provides its own class structure into which the objects in common are organized and contributes state and methods to the composite result where they cut across one another Correspondence rules describe how the classes and methods in the various concerns are related to each other at points where they interact allowing composite behavior for a method to be derived from several concerns Multi dimensional separation of concerns allows the analysis and composition of concerns to be manipulated as a multi dimensional matrix in which each concern provides a dimension in which different points of choice are enumerated with the cells of the matrix occupied by the appropriate software artifacts Aspect oriented programming Aspect oriented programming allows cross cutting concerns to be addressed as primary concerns For example most programs require some form of security and logging Security and logging are often secondary concerns whereas the primary concern is often on accomplishing business goals However when designing a program its security must be built into the design from the beginning instead of being treated as a secondary concern Applying security afterwards often results in an insufficient security model that leaves too many gaps for future attacks This may be solved with aspect oriented programming For example an aspect may be written to enforce that calls to a certain API are always logged or that errors are always logged when an exception is thrown regardless of whether the program s procedural code handles the exception or propagates it Levels of analysis in artificial intelligence In cognitive science and artificial intelligence it is common to refer to David Marr s levels of analysis At any given time a researcher may be focusing on 1 what some aspect of intelligence needs to compute 2 what algorithm it employs or 3 how that algorithm is implemented in hardware This separation of concerns is similar to the interface implementation distinction in software and hardware engineering Normalized systems In separation of concerns is one of the four guiding principles Adhering to this principle is one of the tools that helps reduce the combinatorial effects that over time get introduced in software that is being maintained In normalized systems separation of concerns is actively supported by the tools SoC via partial classes Separation of concerns can be implemented and enforced via partial classes SoC via partial classes in Ruby bear hunting rbclass Bear def hunt forest select amp food end end bear eating rbclass Bear def eat food raise food is not edible unless food respond to nutrition value food nutrition value end end bear hunger rbclass Bear attr accessor hunger def monitor hunger if hunger gt 50 food hunt hunger eat food end end endSee alsoAbstraction principle programming Aspect oriented software development Concern computer science Coupling computer science Holism Modular design Modular programming Orthogonality Computer science Single responsibility principleReferencesLaplante Phillip 2007 What Every Engineer Should Know About Software Engineering CRC Press ISBN 978 0 8493 7228 5 Mitchell R J 1990 Managing Complexity in Software Engineering IEE p 5 ISBN 0 86341 171 1 Microsoft Application Architecture Guide Microsoft Press 2009 ISBN 978 0 7356 2710 9 Painter Robert Richard 2006 Software Plans Multi Dimensional Fine Grained Separation of Concerns CiteSeerX 10 1 1 110 9227 Garofalo Raffaele 2011 Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern Microsoft Press p 18 ISBN 978 0 7356 5092 3 Dijkstra Edsger W 1982 On the role of scientific thought Selected writings on Computing A Personal Perspective New York NY US Springer Verlag pp 60 66 ISBN 0 387 90652 5 1989 Elements of Functional Programming Boston MA US Addison Wesley Longman ISBN 0 201 12915 9 Jess Nielsen June 2006 Building Secure Applications PDF Retrieved 2012 02 08 Tiago Dias October 2006 Hyper Net MDSoC Support for NET PDF DSOA 2006 Retrieved 2007 09 25 External linksMulti Dimensional Separation of Concerns TAOSAD Archived 2016 12 19 at the Wayback Machine Tutorial and Workshop on Aspect Oriented Programming and Separation of Concerns Archived 2008 05 16 at the Wayback Machine