A számítástechnikában a szétválasztás elve vagy hosszabban a dolgok szétválasztásának elve (angolul Separation of Concerns vagy röviden SoC) olyan tervezési alapelv, amely a számítógépes programot külön szakaszokra különíti el úgy, hogy az egyes szakaszok külön vonatkozásokat fedjenek le. A vonatkozás olyan információkészlet, amely befolyásolja a számítógépes program kódját. A vonatkozás lehet olyan általános, mint "az alkalmazás hardverének részletei", vagy olyan konkrét, mint "melyik osztály neve példányosítható". A szétválasztást jól megtestesítő programot moduláris[1] programnak nevezzük. A modularitást, és ezáltal a vonatkozások elkülönítését úgy érjük el, hogy az információkat egy jól meghatározott interfésszel rendelkező kódrészbe foglaljuk. Az egységbezárás az információ elrejtésének[2] egyik eszköze. A réteges architektúra kialakítása a vonatkozások elkülönítésének másik megvalósítási módja (pl. Prezentációs réteg, üzleti logikai réteg, adatelérési réteg, perzisztencia-réteg).[3]

A szétválasztás elve nagyobb szabadságfokot eredményez a program tervezésének, telepítésének vagy használatának bizonyos szempontjaiból. Ezek között értjük a kód egyszerűsítésének és karbantartásának fokozott szabadságát. Ha a vonatkozások jól el vannak különítve, több lehetőség kínálkozik a modulok frissítésére, újrafelhasználására és független fejlesztésére. A modulok megvalósítási részleteinek elrejtése - az interfész mögött - lehetővé teszi egyetlen osztály kódrészének javítását vagy módosítását anélkül, hogy a fejlesztőnek ismernie kellene más szakaszok részleteit, és anélkül, hogy módosításokat kellene végrehajtania a többi osztályban. A modulok az interfész különböző változatait is felfedhetik, ami növeli a bonyolult rendszer részleges szerkesztésének szabadságát a funkciók elvesztése nélkül. 

A szétválasztás elve az absztrakció egyik formája. Csakúgy, mint a legtöbb absztrakció esetében, a vonatkozások elkülönítése további kódrészletek hozzáadását jelenti, azaz általában több végrehajtandó kód jön létre. Tehát a jól elkülönített vonatkozások megléte – számos előnye ellenére – gyakran jár a végrehajtás során jelentkező hátrányokkal. 

Implementációja szerkesztés

A moduláris vagy objektumorientált programozás mechanizmusai, amelyeket egy programozási nyelv biztosít, lehetővé teszik a fejlesztők számára a szétválasztás fenntartását.[4] Például az objektumorientált programozási nyelvek, mint a C#, C++, Delphi és Java, elkülöníthetik az átfedéseket külön objektumokká, míg az architekturális tervezési minták, mint az MVC vagy az MVP, a tartalmat elkülöníthetik a nézettől, azaz az adatfeldolgozást (modellt) a tartalomtól. A szolgáltatásorientált tervezés feloszthatja a vonatkozásokat különböző szolgáltatásokká. Az olyan eljárási programozási nyelvek, mint a C és a Pascal elkülöníthetik a vonatkozásokat eljárásokra vagy függvényekre. Az aspektusorientált programozási nyelvek azt aspektusokra és objektumokra választhatják szét.

A szétválasztás elve számos más területen is fontos tervezési elv, mint például a várostervezés, az építészet és az információtervezés.[5] A cél az összetett, egymástól függő rendszerek hatékonyabb megértése, megtervezése és kezelése, hogy a funkciókat újra felhasználhassák, optimalizálhassák más funkcióktól függetlenül, és el lehessen szigetelni más funkciók esetleges meghibásodásaitól.

Gyakori példák: egy hely szétválasztása helyiségekké, hogy az egyik helyiségben végzett tevékenység ne befolyásolja a többi helyiségben élő embereket, valamint a fűtőtest egyik áramkörre, míg a lámpák másikra bekötése, hogy a fűtőtest általi túlterhelés ne kapcsolja le a lámpákat. A szobákkal ellátott példa beágyazást mutat, ahol az egyik helyiségen belüli információ - például az, hogy mennyire rendetlen - a többi helyiség számára nem elérhető, csak az interfészen keresztül, amely az ajtó. Az áramköri példa pedig azt mutatja, hogy az egyik modulon belüli aktivitás, - az az áramkör, amely a saját fogyasztóival van összekötve - nem befolyásolja a különböző modulokban végzett tevékenységeket, ezért egyik modul sem foglalkozik azzal, ami a másikban történik.

Eredete szerkesztés

A szétválasztás elve kifejezést valószínűleg Edsger W. Dijkstra alkotta meg 1974-ben "On the role of scientific thought"[6] című cikkében.

Tizenöt évvel később a szétválasztás elve kifejezés elfogadott gondolattá vált. 1989-ben Chris Reade írt egy könyvet "Elements of Functional Programming"[7] címmel, amelyben leírja a szétválasztás elvét. A könyvben kifejti, hogy egy programozónak három fő dologra kell figyelnie:

  1. Meg kell határoznia a program végrehajtásának tárgyát
  2. A végrehajtás folyamatát kis lépésekre kell bontania
  3. Kezelnie kell a memóriát a futás során

Reade továbbá azt is mondja, ideális estben a fejlesztőnek csak első pontra kellene koncentrálnia, de megbízhatóbb eredményeket kapunk ha az adminisztrációt leválasztjuk a fő feladatról és automatizáljuk.

Példák szerkesztés

TCP/IP szerkesztés

A vonatkozások elkülönítése elengedhetetlen az Internet kialakítása szempontjából. Az Internet Protocol Suite nagy erőfeszítéseket tett a vonatkozások jól meghatározott rétegekre bontására. Ez lehetővé teszi a protokolltervezők számára, hogy egy rétegben összpontosítsanak a függőségekre, és a többi réteget figyelmen kívül hagyják. Az SMTP alkalmazásréteg protokoll például függ az e-mail munkamenet megbízható szállítási (általában TCP) szolgáltatásán keresztül történő lebonyolításának minden részletétől, de legkevésbé sem vonatkozik rá, hogy a szállítási szolgáltatás hogyan teszi megbízhatóvá ezt a folyamatot. Hasonlóképpen, a TCP sem aggódik az adatcsomagok útválasztása miatt, amelyet a hálózati réteg kezel.

HTML, CSS, JavaScript szerkesztés

A HyperText Markup Language (HTML), a Cascading Style Sheets (CSS) és a JavaScript (JS) kiegészítik egymást a weboldalak és webhelyek fejlesztésénél. A HTML-t főként a weboldal tartalmának szervezésére, a CSS-t a tartalom megjelenítési stílusának meghatározására használják, a JS pedig meghatározza, hogy a tartalom hogyan kommunikál és hogyan viselkedik a felhasználóval. Eredetileg, a CSS bevezetése előtt a HTML mind a szemantika, mind a stílus megjelenítésének feladatait ellátta.

Szubjektumorientált programozás szerkesztés

A szubjektumorientált programozás lehetővé teszi, hogy a különféle problémákat különálló szoftverkonstrukciókként kezeljék, mindegyiket a többivel egyenlő alapon. Minden vonatkozás biztosítja a saját osztálystruktúráját, amelybe a közös objektumok rendeződnek, és hozzájárul az értékeivel és a metódusaival az összetett eredményhez, amellyel egymást keresztezik. A konzisztencia szabályai leírják, hogy a különféle vonatkozások osztályai és metódusai miként kapcsolódnak egymáshoz, lehetővé téve a metódus összetett viselkedését többféle vonatkozásban. A vonatkozások többdimenziós elkülönítése lehetővé teszi a vonatkozások elemzését és összeállítását többdimenziós "mátrixként", amelyben az egyes vonatkozásokat egy-egy dimenzió reprezentálja, és amelyben különböző választási pontokat sorolnak fel, a mátrix elemeiként a megfelelő szoftverelemek.

Aspektusorientált programozás szerkesztés

Az aspektusorientált programozás lehetővé teszi a kereszthivatkozások elsődleges kérdésként való kezelését. Például a legtöbb program valamilyen biztonságot és naplózást igényel. A biztonság és a naplózás gyakran másodlagos probléma, az elsődleges szempont gyakran az üzleti célok megvalósítása, annak ellenére hogy, a program megtervezésekor, annak biztonságát kezdettől fogva bele kellene építeni a tervezésbe. A biztonság utólagos alkalmazása gyakran elégtelen biztonsági modellt eredményez, amely túl sok rést hagy a jövőbeli támadások számára. Ez megoldható aspektus-orientált programozással. Például meg lehet írni egy szempontot, hogy egy bizonyos API-hoz érkező hívásokat és a hibákat, amikor azok egy kivételt dobnak, mindig naplózzák, függetlenül attól, hogy a program eljárási kódja kezeli-e a kivételt, avagy sem.[8]

A mesterséges intelligencia elemzési szintjei szerkesztés

A kognitív tudományban és a mesterséges intelligenciában gyakran hivatkoznak David Marr elemzési szintjeire. A kutatónak figyelnie kell arra, hogy (1) mire van szüksége az intelligencia valamilyen aspektusának kiszámításához, (2) ehhez milyen algoritmust kell alkalmaznia, vagy (3) hogy az algoritmust hogyan valósítják meg hardveren. A vonatkozásoknak ez a szétválasztása hasonló az interfész/megvalósítás megkülönböztetéséhez a szoftver- és hardverfejlesztésben.

Normalizált rendszerek szerkesztés

Normalizált rendszerekben a szétválasztás elve a négy vezérelv egyike. Ezen elv betartása az egyik olyan eszköz, amely segít csökkenteni azokat a kombinatorikus hatásokat, amelyek idővel bekerülnek a karbantartott szoftverekbe. A normalizált rendszerekben a szétválasztás elvét aktívan támogatják az eszközök.

Elválasztás részosztályokon keresztül szerkesztés

A vonatkozások elkülönítése részosztályokon keresztül is megvalósítható és érvényesíthető.[9]

Szétválasztás részleges osztályokon keresztül Rubyban szerkesztés

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

Jegyzetek szerkesztés

  1. Laplante, Phillip. What Every Engineer Should Know About Software Engineering. CRC Press (2007). ISBN 978-0849372285 
  2. Mitchell, Dr. R. J.. Managing Complexity in Software Engineering. IEE, 5. o. (1990). ISBN 0863411711 
  3. Microsoft Application Architecture Guide. Microsoft Press (2009). ISBN 978-0-7356-2710-9 
  4. Painter. „Software Plans: Multi-Dimensional Fine-Grained Separation of Concerns”, Kiadó: Penn State.  
  5. Garofalo, Raffaele. Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern. Microsoft Press, 18. o. (2011). ISBN 978-0735650923 
  6. Dijkstra, Edsger W. On the role of scientific thought, Selected writings on Computing: A Personal Perspective. New York, NY, USA: Springer-Verlag, 60–66. o. (1982). ISBN 0-387-90652-5 
  7. Reade, Chris. Elements of Functional Programming. Boston, MA, USA: Addison-Wesley Longman (1989). ISBN 0-201-12915-9 
  8. Jess Nielsen: Building Secure Applications, 2006. június 1. (Hozzáférés: 2012. február 8.)
  9. Tiago Dias: Hyper/Net: MDSoC Support for .NET. DSOA 2006, 2006. október 1. (Hozzáférés: 2007. szeptember 25.)

Fordítás szerkesztés

Ez a szócikk részben vagy egészben a Separation of concerns című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

További információk szerkesztés