A | B | C | D | E | F | G | H | CH | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
In computer science, separation of concerns 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[1] 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.[2] Layered designs in information systems are another embodiment of separation of concerns (e.g., presentation layer, business logic layer, data access layer, persistence layer).[3]
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.[4] 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.[5] 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".[6]
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[7] 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
HyperText Markup Language (HTML), Cascading Style Sheets (CSS), and JavaScript (JS) 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 JS 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.[8]
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 normalized systems 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.[9]
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
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.
- ^ Reade, Chris (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
Text je dostupný za podmienok Creative Commons Attribution/Share-Alike License 3.0 Unported; prípadne za ďalších podmienok. Podrobnejšie informácie nájdete na stránke Podmienky použitia.
Číňané
Časová osa ruské invaze na Ukrajinu (2022)
Černá Hora
Česká terminologická databáze knihovnictví a informační vědy
Česká verze Wikipedie
Česká Wikipedie
České vysoké učení technické v Praze
Československá armáda
Československá národní rada
Československo
Ču Jou-sung
Říše Čching
Říše Ming
Řím
Šablona:Citation
Šablona:Cite web
1. duben
1. květen
1. září
10. duben
10. prosinec
11. duben
12. duben
12. květen
13. červen
13. duben
14. duben
14. srpen
1488
15. červen
15. duben
15. květen
15. září
1523
1555
1584
1585
16. duben
16. leden
1619
1651
1652
1661
1671
1673
1674
1677
17. březen
17. duben
1706
1711
1717
1719
1729
1730
1735
1742
1752
1757
1763
1767
1774
1776
1782
1783
1784
1785
1790
1796
18. únor
18. duben
18. leden
1805
1811
1814
1816
1818
1822
1828
1829
1837
1838
1849
1852
1855
1862
1864
1868
1870
1871
1876
1878
1880
1882
1885
1886
1891
1892
1893
1895
19. duben
19. listopad
1900
1904
1906
1907
1910
1912
1913
1917
1918
1919
1920
1921
1922
1924
1926
1929
1930
1933
1935
1936
1940
1942
1945
1946
1947
1949
1950
1952
1953
1958
1960
1965
1973
1976
1977
1985
1987
1989
1990
1992
1995
2. červen
2. duben
2. květen
20. duben
2000
2001
2002
2003
2005
2008
2010
2012
2015
2017
2019
2020
2023
21. červen
21. červenec
21. březen
22. duben
23. duben
24. březen
24. duben
24. listopad
24. prosinec
25. duben
25. prosinec
26. duben
27. duben
28. duben
29. únor
29. březen
29. duben
29. srpen
3. únor
3. duben
30. duben
31. červenec
31. březen
31. prosinec
4. říjen
4. duben
4. květen
43 př. n. l.
5. říjen
5. březen
5. duben
5. květen
6. duben
7. duben
753 př. n. l.
8. duben
8. listopad
9. říjen
9. duben
9. září
Aš
ActiveX
Alžběta II.
Alžběta Vilemína Württemberská
Alexandra
Alt attribute
Amálie Vilemína Brunšvicko-Lüneburská
Andie MacDowell
Anthony Quinn
Antonín Kammel
Antonín Novák (houslista)
API
Apple
Apple II
Armáda Spojených států amerických
Article element
Autoritní kontrola
Azovstal
Bedřich Beneš Buchlovan
Benutzer:Kurt Jansson/Vortrag auf dem 19C3
Benutzer:Kurt Jansson/Vortrag auf dem 19C3
BiggestWiki
Bitva o Madagaskar
Bitva o Mariupol
Bitva u Liberce
Bitva u Mutiny
Bitva u Puebly
Blink element
Bořivoj Lůžek
Bob Hurikán
Bologna
Bracket#Angle brackets
Brasília
Brazílie
Britská armáda
Browser engine
Browser Object Model
Bzenecká lípa
Cache (computing)
CamelCase
Canvas element
Cascading Style Sheets
Character encodings in HTML
Charles-Joseph de Flahaut
Charles Darwin
Charlotte Brontëová
Chu Čeng-jen
Commons:Featured pictures/cs
Comparison of browser engines
Comparison of document markup languages
Comparison of stylesheet languages
CSS
CSS#Sources
CSS animations
CSS box model
CSS Flexible Box Layout
CSS grid layout
CSS image replacement
CSS Zen Garden
Diff
Digital container format
Div and span
Document file format
Document Object Model
Document Style Semantics and Specification Language
DokuWiki
Doněcké akademické oblastní činoherní divadlo
Druhá světová válka
Duben
Dynamic HTML
Dynastie Jižní Ming
Edita Štaubertová
Ekonomické důsledky ruské invaze na Ukrajinu (2022)
Emilia Galotti
Emmanuel Macron
Encyclopædia Britannica
Encyklopedie
Encyklopedie Navajo
Evoluce
Fantasy
Fault-tolerant system
Ferdinand Peroutka
Fieldset
File:HTML5 logo and wordmark.svg
File:Question book-new.svg
File:Wikibooks-logo.svg
Filename extension
Filmová promítačka
First-person shooter
Font family (HTML)
Formatting Output Specification Instance
Frame (World Wide Web)
François Athanase de Charette de la Contrie
Francie
Francouzská armáda
Francouzská intervence v Mexiku
Francouzská národní knihovna
František Ferdinand Šamberk
František Suchý Pražský
Fredrik Bajer
Friedrich Fröbel
Gemeinsame Normdatei
Georg Joseph Kamel
Glen Hansard
Gotthold Ephraim Lessing
Gregoriánský kalendář
Guy Lafleur
Hannibal Goodwin
Havajština
Help:HTML in wikitext
Help:Maintenance template removal
Help:Referencing for beginners
Hippolyte Taine
Hlavní strana
Hnutí Svoboda (Slovinsko)
Holy grail (web design)
Honolulu
Hospodářský růst
HTML
HTML5
HTML5 audio
HTML5 video
HTML attribute
HTML editor
HTML element
HTML element#Images and objects
HTML elements
HTM (disambiguation)
Humphry Repton
Hyperlink
Hypertext
HyperText Markup Language
Iggy Pop
Ignacio Zaragoza
Ignatius Krahl
Ingenuity
International Standard Book Number
Internetová diskuse
Internetový bot
Internet Explorer
IP adresa
Isaac Asimov
Itálie
Ivan Petrovič Kulibin
Janez Janša
Jan Štrobl
Jan Kostrhun
Jan Pavel II.
Jan van Riebeeck
Jarmila Stojčevská
Jaroslav Hýbl
Jaroslav Hutka
Jaroslav Kvapil (skladatel)
JavaScript
JavaScript Style Sheets
Jean-Baptiste Biot
Jiří Čepelák
Jiří Hrubeš
Jiřina Šedinová
Johann Christian Ferdinand Höfer
John Law
Josef I. Habsburský
Joseph Vaz
Jozef Herda
Judita Čeřovská
Kaligrafie
Kapské Město
Karel Balling (chemik)
Karel Pippich
Karlštejn
Kategorie:Čas
Kategorie:Články podle témat
Kategorie:Život
Kategorie:Dorozumívání
Kategorie:Geografie
Kategorie:Historie
Kategorie:Hlavní kategorie
Kategorie:Informace
Kategorie:Kultura
Kategorie:Lidé
Kategorie:Matematika
Kategorie:Příroda
Kategorie:Politika
Kategorie:Právo
Kategorie:Rekordy
Kategorie:Seznamy
Kategorie:Společnost
Kategorie:Sport
Kategorie:Technika
Kategorie:Umění
Kategorie:Věda
Kategorie:Vojenství
Kategorie:Vzdělávání
Kategorie:Zdravotnictví
Klaus Schulze
Kuo-c’-ťien
Květen
Ladislav Koubek
Ladislav Pavelka
Language code
Lee de Forest
Leopold Antonín Podstatský
Less (stylesheet language)
Less (style sheet language)
Library of Congress Control Number
Lidé a země
Listopad
List of style sheet languages
List of XML and HTML character entity references
Lodovico Carracci
Louis-Auguste Bisson
Lynx (browser)
Madagaskar
Maia Sanduová
Manuel Estiarte
Marcus Antonius
Maria Anna Sala
Mariupol
Markup (computer programming)
Markup language
Marquee element
Meda Mládková
MediaWiki
Media type
Metapedie
Meta element
Mezinárodní měnový fond
Michel Rolle
Miloš Zeman
Mittelbau-Dora
Moldavsko
Mozilla Firefox
Mwai Kibaki
Nápověda:Úvod
Nápověda:Úvod pro nováčky
Národní knihovna České republiky
Národní knihovna Izraele
Návrhový vzor
Nadace Wikimedia
Nanking
Necyklopedie
Nikola Buranská
Norbert Frýd
Nosticovo divadlo
Nupedia
Odbory
Olbram Zoubek
Open file format
Opera (web browser)
Osecký klášter
Otevřený software
Oxford English Dictionary
Pandemie covidu-19
Pandemie covidu-19 v Česku
Partyzán
Paul Karrer
Pavel Zářecký
Pavol Mešťan
Pečeť
Perseverance
Petr Nečas
Petr Pokorný (teolog)
Petr Rak
Plnotext
Plugin
Podněstří
Polsko
Portál:Aktuality
Portál:Doprava
Portál:Geografie
Portál:Historie
Portál:Kultura
Portál:Lidé
Portál:Náboženství
Portál:Obsah
Portál:Příroda
Portál:Sport
PostCSS
Praha
Pravda (noviny)
Prezident
Programovací jazyk
Q171#identifiers
Q171#identifiers|Editovat na Wikidatech
Qt (software)
Quirks mode
Radim Uzel
Refreshable Braille display
Responsive web design
Rio de Janeiro
Robert Fico
Robert Golob
Robert Kaliňák
Robert Saudek
Robert Smith (hudebník)
Ruská invaze na Ukrajinu (2022)
Rusko
Sýrie
Safari (web browser)
Sass (stylesheet language)
Sass (style sheet language)
Scripting language
Sedmiletá válka
Semantics
Semantic Web
Separation of concerns
Separation of content and presentation
Seznam českých wiki encyklopedií
Slávka Budínová
Slovenska demokratska stranka
Slovensko
Slovinsko
SMIL Timesheets
Sociální software
Software
Software release life cycle
Soubor:Andie MacDowell Cannes.jpg
Soubor:Anthony Quinn signed.JPG
Soubor:Apple-II.jpg
Soubor:Flag of Mars.svg
Soubor:GlenHansard.jpg
Soubor:HNL Wiki Wiki Bus.jpg
Soubor:Hutka.simecek.jpg
Soubor:IggyChesterRocks.jpg
Soubor:Manel Estiarte (Diada de Sant Jordi 2009).jpg
Soubor:Olbram-Zoubek.jpg
Soubor:Paul Karrer.jpg
Soubor:Persimmon and Three Yellow Tangerines.jpg
Soubor:Queen Elizabeth II March 2015.jpg
Soubor:Robert Smith of The Cure live in Singapore 1 August 2007.jpg
Speciální:Kategorie
Speciální:Nové stránky
Speciální:Statistika
Speciální:Zdroje knih/0-201-71499-X
Speciální:Zdroje knih/2-9520514-4-5
Speciální:Zdroje knih/9781448855575
Spojené státy americké
Standard Generalized Markup Language
Strojový překlad
Structured document
Stuttgart
Style sheet (desktop publishing)
Style sheet (web development)
Style sheet language
Stylish
Stylus (browser extension)
Stylus (stylesheet language)
Stylus (style sheet language)
Světová ekonomika
Třída T 47
Tableless web design
Template:CSS
Template:HTML
Template:Stylesheet languages
Template talk:CSS
Template talk:HTML
Template talk:Stylesheet languages
Teroristické útoky na Srí Lance 21. dubna 2019
Theodor Kašpárek
Tiskař
Turecko
TWiki
Type code
Ukrajina
Ulrich von Hutten
Unicode and HTML
Uniform Type Identifier
UseModWiki
User agent
User interface style sheet language
Václav Cigler
Vídeň
Věra Nerušilová
V-2
Vannevar Bush
Vichistická Francie
Viktor Janiš
Viktor Zvjahincev
Vláda Černé Hory
Vladimír Hulpach
Vlasta Prachatická
Vojtěch Říhovský
Volby prezidenta Francie 2022
Vzdušný prostor
W3C Markup Validation Service
Ward Cunningham
Web3D
WebCL
WebGL
WebGPU
Webový prohlížeč
Webpage
WebXR
Web browser
Web colors
Web content
Web design
Web page
Web server
Web storage
WHATWG
Wiki
Wikicitáty:Hlavní strana
Wikidata:Hlavní strana
Wikiknihy:Hlavní strana
Wikimedia Česká republika
Wikimedia Commons
Wikipedia:Verifiability
Wikipedie
Wikipedie:Údržba
Wikipedie:Časté chyby
Wikipedie:Často kladené otázky
Wikipedie:Článek týdne
Wikipedie:Článek týdne/2022
Wikipedie:Citování Wikipedie
Wikipedie:Dobré články
Wikipedie:Dobré články#Portály
Wikipedie:Kontakt
Wikipedie:Nejlepší články
Wikipedie:Obrázek týdne
Wikipedie:Obrázek týdne/2022
Wikipedie:Požadované články
Wikipedie:Pod lípou
Wikipedie:Portál Wikipedie
Wikipedie:Potřebuji pomoc
Wikipedie:Průvodce
Wikipedie:Seznam jazyků Wikipedie
Wikipedie:Velvyslanectví
Wikipedie:Vybraná výročí dne/květen
Wikipedie:WikiProjekt Kvalita/Články k rozšíření
Wikipedie:Zajímavosti
Wikipedie:Zajímavosti/2022
Wikipedie:Zdroje informací
WikiSkripta
Wikislovník:Hlavní strana
Wikiverzita:Hlavní strana
Wikizdroje:Hlavní strana
Wikizprávy:Hlavní strana
Wiki (rozcestník)
Wiki Wiki Shuttle
Wolfenstein 3D
World Wide Web
World Wide Web Consortium
WYSIWYG
XHTML
XHTML Basic
XHTML Mobile Profile
XSL
XSLT
Zdeněk Fiala
Značkovací jazyk
Zvukový film
Text je dostupný za podmienok Creative
Commons Attribution/Share-Alike License 3.0 Unported; prípadne za ďalších
podmienok.
Podrobnejšie informácie nájdete na stránke Podmienky
použitia.
www.astronomia.sk | www.biologia.sk | www.botanika.sk | www.dejiny.sk | www.economy.sk | www.elektrotechnika.sk | www.estetika.sk | www.farmakologia.sk | www.filozofia.sk | Fyzika | www.futurologia.sk | www.genetika.sk | www.chemia.sk | www.lingvistika.sk | www.politologia.sk | www.psychologia.sk | www.sexuologia.sk | www.sociologia.sk | www.veda.sk I www.zoologia.sk