<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nagy+%C3%81d%C3%A1m+Rich%C3%A1rd</id>
	<title>VIK Wiki - Felhasználó közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nagy+%C3%81d%C3%A1m+Rich%C3%A1rd"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/Nagy_%C3%81d%C3%A1m_Rich%C3%A1rd"/>
	<updated>2026-05-15T07:39:31Z</updated>
	<subtitle>Felhasználó közreműködései</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=Szoftverarchitekt%C3%BAr%C3%A1k_-_Jegyzet&amp;diff=184114</id>
		<title>Szoftverarchitektúrák - Jegyzet</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Szoftverarchitekt%C3%BAr%C3%A1k_-_Jegyzet&amp;diff=184114"/>
		<updated>2015-01-18T22:54:54Z</updated>

		<summary type="html">&lt;p&gt;Nagy Ádám Richárd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vissza|Szoftverarchitektúrák}}&lt;br /&gt;
&lt;br /&gt;
A régi, doktoranduszok által írt, hivatalos jegyzet [[Media:Szoftarch_jegyzet_2011_patternek.pdf | letölthető innen]].&lt;br /&gt;
&lt;br /&gt;
Ennél persze több van, érdemes átnézni a tárgyhonlapot.&lt;br /&gt;
&lt;br /&gt;
Tipikus architektúra hibák:&lt;br /&gt;
* Scope tévesztése, nem pontos definiálása.&lt;br /&gt;
* Stakeholderek pontos azonosítása elmarad.&lt;br /&gt;
* Csak funkcionalitásra fókuszálni, UI-t elhanyagolni.&lt;br /&gt;
* Leírások (pl. tooltipek) elmaradnak. Ne kelljen gondolkodni a usernek!&lt;br /&gt;
* &amp;quot;Forgetting that it needs to be built&amp;quot;&lt;br /&gt;
* &amp;quot;Lack of platform precision&amp;quot;&lt;br /&gt;
* Skálázhatóság feltételezése hasraütésszerűen.&lt;br /&gt;
* DIY Security&lt;br /&gt;
* Backup/Recovery plan (katasztrófaterv)  hiánya&lt;br /&gt;
* Backout plan (visszalépési terv) hiánya&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==I. Szolgáltatás-hozzáférési és konfigurációs minták==&lt;br /&gt;
&lt;br /&gt;
===I.1. Wrapper Facade===&lt;br /&gt;
Nem OO API-k elé egy OO réteget húzunk, ami nyújt bizonyos szolgáltatásokat, ami felhasználja az alatta levő réteget. Így az alacsony szintű API helyett egy OO-sat hívunk, ez kényelmesebb és hordozhatóbb. Hátránya, hogy a funkcionalitás csökkenhet, valamint valószínűleg lassabb lesz a kód.&lt;br /&gt;
&lt;br /&gt;
===I.2. Component Configurator===&lt;br /&gt;
Egy szolgáltatás interface-re több implementáció is létezhet, amelyek közül nem feltétlenül tudjuk kiválasztani fejlesztés közben a legjobbat. Ezzel a mintával elkészítjük az összes implementációt, és futási időben választjuk ki, hogy melyiket használjuk. A komponenseknek kell az életciklusukat kezelni, tehát elindítani és leállítani. Hátránya, hogy nem determinisztikus, valamint bonyolultabb lesz a kód.&lt;br /&gt;
&lt;br /&gt;
Szereplői:&lt;br /&gt;
* Komponens: Szolgáltatást leíró interface&lt;br /&gt;
* Konkrét komponensek: Az interface-t megvalósító osztályok&lt;br /&gt;
* Komponenstár (repository): Tárolja a konkrét komponenseket&lt;br /&gt;
* Komponens konfiguráló: A komponensekhez konkrét komponenst rendel, és ezt futásidőben tudja változtatni.&lt;br /&gt;
&lt;br /&gt;
===I.3. Interceptor===&lt;br /&gt;
Az interceptor egy olyan eseménykezelő, amit a keretrendszer eseményeire lehet kötni. Hasonlít az AOP-hez.&lt;br /&gt;
&lt;br /&gt;
Szereplői:&lt;br /&gt;
* Konkrét keretrendszer (framework): Egy generikus architektúra&lt;br /&gt;
* Elfogó (interceptor): Olyan interface, amely az egyes eseményekre bekövetkező eseménykezelőnek meg kell valósítania&lt;br /&gt;
* Konrét elfogó: Interceptor implementációja&lt;br /&gt;
* Diszpécser (dispatcher): Eseményekhez van rendelve, ehhez pedig lehet konkrét elfogó. Ez fogja hívni az interceptort.&lt;br /&gt;
* Kontextus objektum: Az eseményt és a keretrendszert lehet rajtuk keresztül elérni az elfogóból&lt;br /&gt;
* Alkalmazás: A keretrendszeren futó alkalmazás&lt;br /&gt;
&lt;br /&gt;
===I.4. Extension Interface===&lt;br /&gt;
Akkor jó, ha úgy kell kiterjeszteni egy osztályt, hogy a kliensen ne kelljen változtatni. Példakódhoz [http://stackoverflow.com/questions/1055833/need-citation-for-extension-interface-pattern-in-java lásd]&lt;br /&gt;
&lt;br /&gt;
Szereplői:&lt;br /&gt;
* Komponens: Ezt szeretnénk kiterjeszteni&lt;br /&gt;
* Kiterjesztő interface: A komponens szerepeit tartalmazza&lt;br /&gt;
* Gyökér interface: Minden komponensnek meg kell valósítania, ettől lehet lekérni a kiterjesztő interface-kat, valamint közös szolgáltatásokat is adhat.&lt;br /&gt;
* Kliens: Aki hívja&lt;br /&gt;
* Komponensgyár: A gyökeret lehet tőle kikérni&lt;br /&gt;
&lt;br /&gt;
==II. Eseménykezelési minták==&lt;br /&gt;
===II.1. Reactor===&lt;br /&gt;
[[OotTervezesiMintak#Reactor | Lásd.]]&lt;br /&gt;
&lt;br /&gt;
Szereplői:&lt;br /&gt;
* Kezelő: OS biztosítja, ami jelzést tud adni, pl hálózati kapcsolat.&lt;br /&gt;
* Szinkron esemény szétválasztó: Addig blokkolódik, amíg nincs jelzés&lt;br /&gt;
* Eseménykezelő interface: Megadja, hogyan kell az eseményt feldolgozni&lt;br /&gt;
* Konkrét eseménykezelő: Az előző interface-t megvalósítja&lt;br /&gt;
* Reaktor interface: Eseménykezelőt lehet hozzáadni és eltávolítani&lt;br /&gt;
&lt;br /&gt;
===II.2. Proactor===&lt;br /&gt;
A reactor aszinkron változata, híváskor a kezelőt aszinkron módon hívja meg, és amikor az visszatér, akkor kikeresi a kezelőt, amivel választ tud küldeni.&lt;br /&gt;
&lt;br /&gt;
===II.3. Asynchronous Completion Token (ACT)===&lt;br /&gt;
Mint a proactor, csak a választ kezelőt megkapja a feldolgozó, ezért nem kell kikeresni. [http://en.wikipedia.org/wiki/Proactor_pattern Leírás.]&lt;br /&gt;
&lt;br /&gt;
===II.4. Acceptor-Connector===&lt;br /&gt;
&lt;br /&gt;
* Acceptor: Passzívan várakozik bejövő kapcsolatra&lt;br /&gt;
* Connector: Aktívan felép egy kapcsolatot&lt;br /&gt;
&lt;br /&gt;
A kapcsolat felépítése után várakoznak eseményre, amit valamelyik másik minta fog kezelni. Azért jó, mert leválasztható vele az, hogy éppen klienst vagy szervert írunk.&lt;br /&gt;
&lt;br /&gt;
==III. Konkurenciakezelési minták==&lt;br /&gt;
===III.1. Active Object===&lt;br /&gt;
[[OotTervezesiMintak#Akt_v_objektum | Lásd.]]&lt;br /&gt;
&lt;br /&gt;
===III.2. Monitor Object===&lt;br /&gt;
[[OotTervezesiMintak#Monitor | Lásd.]]&lt;br /&gt;
&lt;br /&gt;
===III.3. Half-Sync/Half-Async===&lt;br /&gt;
Lényege, hogy hardverfejlesztők aszinkron műveleteket szeretnek, szoftveresek meg szinkronokat. Ezzel a mintával megoldható, hogy mindenki úgy programozzon, ahogy szeretne.&lt;br /&gt;
&lt;br /&gt;
Szereplői:&lt;br /&gt;
* Aszinkron réteg: Az aszinkron hívások végrehajtásáért felel&lt;br /&gt;
* Szinkron réteg: A szinkron hívások végrehajtásáért felel&lt;br /&gt;
* Üzenetkezelő réteg: A másik 2 réteg üzenetekkel kommunikál egymással, ezen keresztül&lt;br /&gt;
* Eseményfigyelő: Eseményre meghívja az aszinkron réteget&lt;br /&gt;
&lt;br /&gt;
===III.4. Leader/Followers===&lt;br /&gt;
[[OotTervezesiMintak#Vezet_k_vet | Lásd.]]&lt;br /&gt;
&lt;br /&gt;
==IV. Szinkronizációs tervezési minták==&lt;br /&gt;
===IV.1. Scoped Locking===&lt;br /&gt;
Felhasználja, hogy a C++-ban amikor kilép a vezérlés az objektum scope-jából, akkor lefut a destruktora. Így a lock egy Guard osztály, aminek a konstruktorában lefoglalódik a zár, a destruktorában felszabadul. Így a zárolt részt bárhogyan hagyjuk el, biztosan nem marad zárolva.&lt;br /&gt;
&lt;br /&gt;
===IV.2. Strategized Locking===&lt;br /&gt;
A lényege, hogy a lock objektumot paraméterként megadhatóvá tesszük, így a védett objektum létrehozásakor megadhatjuk, hogy milyen módon zárolható (R/W lock, mutex, stb...). Ehhez kell egy ősosztály, amiből a különböző implementációkat származtatjuk.&lt;br /&gt;
&lt;br /&gt;
===IV.3. Thread-Safe Interface===&lt;br /&gt;
A probléma az, hogy egy osztályon belüli metódushívásoknál többször is zárolni akar, akkor self-deadlock alakul ki. Ezért elválasztjuk a publikus metódusok hívását és az implementációjukat private metódusokba tesszük, és minden publikus metódus elején zárolunk, a többinél azonban nem. Így ha a függvények egymást hívják, nem lesz újrazárolás, viszont minden bejöbő hívás zárolt lesz.&lt;br /&gt;
&lt;br /&gt;
===IV.4. Double-Checked Locking Optimization===&lt;br /&gt;
Ha egy kritikus szakasznak pontosan 1-szer szabad lefutnia, akkor zárolás után is meg kell győződnünk arról, hogy még nem futott-e le. Ez pl. Singletonok létrehozásánál lehet fontos, mivel a létrehozó fv-t több szál is meghívhatja egyszerre, ekkor ha csak záraink vannak, akkor egymás után több példányt is létrehoznak belőle.&lt;br /&gt;
&lt;br /&gt;
Pl:&amp;lt;pre&amp;gt;&lt;br /&gt;
static SingletonClass *GetInstance() {&lt;br /&gt;
//Az első ellenőrzés.&lt;br /&gt;
if (instance == 0) {&lt;br /&gt;
//Szinkronizálás.&lt;br /&gt;
Guard guard(lock);&lt;br /&gt;
//A második ellenőrzés.&lt;br /&gt;
if (instance == 0)&lt;br /&gt;
instance = new SingletonClass();&lt;br /&gt;
}&lt;br /&gt;
return instance;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosTamas|Velias]] - 2010.10.14.&lt;br /&gt;
-- [[SallaiTamas|sashee]] - 2010.10.16.&lt;br /&gt;
&lt;br /&gt;
[[Kategória:Mérnök informatikus MSc]]&lt;/div&gt;</summary>
		<author><name>Nagy Ádám Richárd</name></author>
	</entry>
</feed>