Separació d'interessos
En informàtica, la separació d'interessos (SoC) és el principi de disseny que consisteix a organitzar una base de codi en seccions diferents – cadascuna de les quals aborda un sol interès. El SoC és el principi de disseny que guia la programació modular. Un programa que incorpora el SoC es pot anomenar programa modular.[1] El SoC/modularitat s'aconsegueix encapsulant la lògica i les dades dins d'una secció de codi que té una interfície ben definida.[2] El disseny per capes (per exemple, presentació, lògica de negoci, accés a dades, persistència) i l'empaquetament per característica són altres maneres d'aconseguir el SoC.[3]
El SoC resulta en més graus de llibertat per a algun aspecte del disseny, desplegament o ús del programa. Entre aquests hi ha una major llibertat per a la simplificació i el manteniment del codi. Quan els interesos estan ben separats, hi ha més oportunitats per a l'actualització, la reutilització i el desenvolupament independent dels mòduls. Amagar els detalls d'implementació dels mòduls darrere d'una interfície permet millorar o modificar la secció de codi d'un sol interès sense haver de conèixer els detalls d'altres seccions i sense haver de fer els canvis corresponents a aquestes altres seccions. Els mòduls també poden exposar diferents versions d'una interfície, cosa que augmenta la llibertat d'actualitzar un sistema complex de manera fragmentada sense pèrdua provisional de funcionalitat.
El SoC és una forma d'abstracció. Com passa amb la majoria d'abstraccions, separar els interessos significa afegir interfícies de codi addicionals, generalment creant més codi per executar. El codi addicional pot resultar en costos de computació més elevats en alguns casos, però en altres casos també pot conduir a la reutilització de codi més optimitzat. Per tant, malgrat els molts beneficis dels interessos ben separats, hi pot haver una penalització d'execució associada.
Aconseguir un SoC pot prendre moltes formes. Per exemple, molts llenguatges de programació orientats a objectes com ara C#, C++, Delphi i Java proporcionen classes per a SoC. Els patrons de disseny arquitectònic com ara MVC o MVP poden separar la presentació i el processament de dades (model) del contingut. El disseny orientat a serveis pot separar els interessos en serveis. C admet la modularitat a nivell de fitxer. Els llenguatges de programació orientats a aspectes poden separar els interessos en aspectes. Ruby proporciona classes parcials per a SoC.[4]
Origen
[modifica]El terme separació d'interessos probablement va ser encunyat per Edsger W. Dijkstra en el seu article de 1974 "Sobre el paper del pensament científic".[5]
Deixeu-me intentar explicar-vos allò que, al meu gust, és característic de tot pensament intel·ligent. És que un està disposat a estudiar en profunditat un aspecte de la seva matèria de manera aïllada per tal de mantenir-ne la consistència, sabent sempre que només s'està ocupant d'un dels aspectes. Sabem que un programa ha de ser correcte i que només el podem estudiar des d'aquest punt de vista; també sabem que ha de ser eficient i que podem estudiar-ne l'eficiència un altre dia, per dir-ho així. En un altre estat d'ànim, podem preguntar-nos si el programa és desitjable, i si és així: per què. Però no es guanya res —al contrari!— abordant aquests diversos aspectes simultàniament. És el que de vegades he anomenat "la separació d'interessos", que, tot i que no és perfectament possible, és l'única tècnica disponible per ordenar eficaçment els pensaments que conec. Això és el que vull dir amb "centrar l'atenció en algun aspecte": no significa ignorar els altres aspectes, sinó simplement fer justícia al fet que, des del punt de vista d'aquest aspecte, l'altre és irrellevant. És tenir una ment en una i múltiples vies simultàniament.
Quinze anys més tard, era evident que el terme separation of concerns s'estava convertint en una idea acceptada. El 1989, Chris Reade va escriure un llibre titulat Elements of Functional Programming[6] que descriu el SoC:
El programador ha de fer diverses coses alhora, és a dir,
1. descriure què s'ha de calcular
2. organitzar la seqüència de càlcul en petits passos;
3. organitzar la gestió de memòria durant el càlcul.
Reade continua dient,
Idealment, el programador hauria de poder concentrar-se en la primera de les tres tasques (descriure què s'ha de calcular) sense distreure's amb les altres dues, tasques més administratives. Clarament, l'administració és important, però separant-la de la tasca principal és probable que obtinguem resultats més fiables i podem alleujar el problema de la programació automatitzant gran part de l'administració.
El SoC té altres avantatges. Per exemple, la prova de programes esdevé molt més factible quan els detalls de seqüenciació i gestió de memòria són absents del programa. A més, les descripcions del que s'ha de calcular haurien d'estar lliures d'aquestes descripcions pas a pas detallades de com fer-ho, si s'han d'avaluar amb diferents arquitectures de màquina. Les seqüències de petits canvis a un objecte de dades emmagatzemat en un magatzem poden ser una descripció inadequada de com calcular alguna cosa quan s'utilitza una màquina altament paral·lela amb milers de processadors distribuïts per tota la màquina i instal·lacions d'emmagatzematge locals en lloc de globals.
Automatitzar els aspectes administratius significa que l'implementador del llenguatge ha de tractar-los, però té moltes més oportunitats de fer ús de mecanismes de càlcul molt diferents amb diferents arquitectures de màquina.
Exemples
[modifica]Pila de protocols d'Internet
[modifica]El SoC és crucial per al disseny d'Internet. En el conjunt de protocols d'Internet, s'han fet grans esforços per separar els interessos en capes ben definides. Això permet als dissenyadors de protocols centrar-se en els interessos d'una capa i ignorar les altres capes. El protocol de la capa d'aplicació SMTP, per exemple, es preocupa per tots els detalls de dur a terme una sessió de correu electrònic a través d'un servei de transport fiable (normalment TCP), però no es preocupa gens per com el servei de transport fa que aquest servei sigui fiable. De la mateixa manera, TCP no es preocupa per l'encaminament dels paquets de dades, que es gestiona a la capa d'Internet.
HTML, CSS, JavaScript
[modifica]HTML, CSS i JavaScript són llenguatges complementaris que s'utilitzen en el desenvolupament de pàgines web i llocs web. HTML s'utilitza principalment per organitzar el contingut de les pàgines web, CSS s'utilitza per definir l'estil de presentació del contingut i JavaScript defineix com el contingut interactua i es comporta amb l'usuari. Històricament, això no era així: abans de la introducció de CSS, HTML feia tant la funció de definir la semàntica com l'estil.
Referències
[modifica]- ↑ Laplante, Phillip. What Every Engineer Should Know About Software Engineering (en anglès). CRC Press, 2007. ISBN 978-0-8493-7228-5.
- ↑ Mitchell, R. J.. Managing Complexity in Software Engineering (en anglès). IEE, 1990, p. 5. ISBN 0-86341-171-1.
- ↑ Microsoft Application Architecture Guide (en anglès). Microsoft Press, 2009. ISBN 978-0-7356-2710-9.
- ↑ Tiago Dias. «Hyper/Net: MDSoC Support for .NET» (en anglès). DSOA 2006, 01-10-2006. [Consulta: 25 setembre 2007].
- ↑ Dijkstra, Edsger W. «On the role of scientific thought». A: Selected writings on Computing: A Personal Perspective (en anglès). New York, NY, US: Springer-Verlag, 1982, p. 60–66. ISBN 0-387-90652-5.
- ↑ Reade, Chris. Elements of Functional Programming (en anglès). Boston, MA, US: Addison-Wesley Longman, 1989. ISBN 0-201-12915-9.